我繼承了一些代碼,這裏的價格格式如下:這兩個格式字符串的結果是否有區別?
(1.23d).ToString("£0.00");
我通常會格式化貨幣是這樣的:
(1.23d).ToString("C");
如果機器的區域設置爲英國(它是)那麼這兩種方法有什麼區別?我可以在整個解決方案中做一個大發現並替換嗎?
我繼承了一些代碼,這裏的價格格式如下:這兩個格式字符串的結果是否有區別?
(1.23d).ToString("£0.00");
我通常會格式化貨幣是這樣的:
(1.23d).ToString("C");
如果機器的區域設置爲英國(它是)那麼這兩種方法有什麼區別?我可以在整個解決方案中做一個大發現並替換嗎?
可以部分地驗證通過運行的機器上的代碼與區域(或用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
作爲貨幣。
這不會有什麼區別。如果在您的區域語言設置中選擇了期望的貨幣。
是的,總是更喜歡decimal
作爲金錢的數據類型。
根據標準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);
(1.23d).ToString("£0.00");
可能會更明確地表明數字總是表示£(業務邏輯),並且這不僅僅是一個任意顯示的東西。
我想知道它是否會對負值產生影響,但似乎沒有。我希望你正在修復應用程序使用'decimal'而不是'double'作爲數字值,同時... –
@JonSkeet它在數字分組的上下文中有所不同。 – BartoszKP
@BartoszKP:啊,對 - 我沒有試過1000以上的任何數字。 –