我继承了一些代码,这里的价格格式如下:这两个格式字符串的结果是否有区别?
(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以上的任何数字。 –