【问题标题】:Is there any difference between the result of these two format strings?这两个格式字符串的结果有什么区别吗?
【发布时间】:2014-02-17 14:36:38
【问题描述】:

我继承了一些价格格式如下的代码:

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

我通常会像这样格式化货币:

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

如果机器的区域设置为英国(它是),那么这两种方法有什么区别吗?我可以在整个解决方案中进行大量查找和替换吗?

【问题讨论】:

  • 我想知道它是否会对负值产生影响,但似乎没有。我希望您正在修复应用程序以同时使用 decimal 而不是 double 作为数值...
  • @JonSkeet 它在数字分组的上下文中有所不同。
  • @BartoszKP:啊,对 - 我没有尝试任何超过 1000 的数字。

标签: c# string-formatting


【解决方案1】:

根据标准Numeric Format Strings,“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);

【讨论】:

  • 你没有提到在这里似乎很重要的货币组规模。
  • @BartoszKP:疏忽。你可以添加它。
【解决方案2】:

您可以通过在具有该语言环境的机器上运行此代码来部分验证这一点(或首先使用 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 来表示货币。

【讨论】:

    【解决方案3】:

    不会有什么不同。如果在您的区域语言设置中选择了所需的货币。

    是的,总是更喜欢 decimal 作为金钱的数据类型。

    【讨论】:

      【解决方案4】:

      (1.23d).ToString("£0.00"); 可能会更明确地表示,数字始终代表 £(业务逻辑),而这不仅仅是任意显示的东西。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-09-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多