2014-02-17 27 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");可能会更明确地表明数字总是表示£(业务逻辑),并且这不仅仅是一个任意显示的东西。

相关问题