2014-02-17 53 views
3

我繼承了一些代碼,這裏的價格格式如下:這兩個格式字符串的結果是否有區別?

(1.23d).ToString("£0.00"); 

我通常會格式化貨幣是這樣的:

(1.23d).ToString("C"); 

如果機器的區域設置爲英國(它是)那麼這兩種方法有什麼區別?我可以在整個解決方案中做一個大發現並替換嗎?

+7

我想知道它是否會對負值產生影響,但似乎沒有。我希望你正在修復應用程序使用'decimal'而不是'double'作爲數字值,同時... –

+1

@JonSkeet它在數字分組的上下文中有所不同。 – BartoszKP

+0

@BartoszKP:啊,對 - 我沒有試過1000以上的任何數字。 –

回答

1

可以部分地驗證通過運行的機器上的代碼與區域(或用Thread.CurrentThread.CurrentCulture = new CultureInfo("en-GB");第一執行它):

var nf = CultureInfo.CurrentCulture.NumberFormat; 
Console.WriteLine("CurrencyPositivePattern: " + nf.CurrencyPositivePattern); 
Console.WriteLine("CurrencyNegativePattern: " + nf.CurrencyNegativePattern); 
Console.WriteLine("NegativeSign: " + nf.NegativeSign); 
Console.WriteLine("CurrencySymbol: " + nf.CurrencySymbol); 
Console.WriteLine("CurrencyDecimalDigits: " + nf.CurrencyDecimalDigits); 
Console.WriteLine("CurrencyDecimalSeparator: " + nf.CurrencyDecimalSeparator); 
Console.WriteLine("CurrencyGroupSeparator: " + nf.CurrencyGroupSeparator); 
Console.WriteLine("CurrencyGroupSizes: " + string.Join(",", nf.CurrencyGroupSizes.Select(gs => gs.ToString()))); 

請注意組大小屬性。在我的機器上這個代碼:

Console.WriteLine((1232323d).ToString("C")); 
Console.WriteLine((1232323d).ToString("£0.00")); 

由於數字組產生兩個不同的字符串。

此外,正如其他人在此指出的那樣,並且正如您可能已經知道的那樣 - 應使用decimal而不是double作爲貨幣。

0

這不會有什麼區別。如果在您的區域語言設置中選擇了期望的貨幣。

是的,總是更喜歡decimal作爲金錢的數據類型。

2

根據標準​​3210,「C」格式說明符的行爲由當前文化的NumberFormatInfo中的設置確定。您可以檢查通過檢查,以確保NumberFormatInfo

Thread.CurrentThread.CurrentCulture = new CultureInfo("en-GB"); 
var nfi = Thread.CurrentThread.CurrentCulture.NumberFormat; 
Console.WriteLine(nfi.CurrencyDecimalDigits); 
Console.WriteLine(nfi.CurrencyDecimalSeparator); 
Console.WriteLine(nfi.CurrencyNegativePattern); 
Console.WriteLine(nfi.CurrencyPositivePattern); 
Console.WriteLine(nfi.CurrencySymbol); 
+0

您沒有提到在這裏看起來很關鍵的貨幣組大小。 – BartoszKP

+0

@BartoszKP:一個疏忽。你可以添加它。 –

+0

我已經做到了;) – BartoszKP

0

(1.23d).ToString("£0.00");可能會更明確地表明數字總是表示£(業務邏輯),並且這不僅僅是一個任意顯示的東西。

相關問題