如何在格式字符串中指定自定义千位分隔符

时间:2011-08-26 08:46:46

标签: .net localization formatting cultureinfo

当我尝试以下代码时,我得到输出 2 084 001 。这可能有什么问题?我的格式字符串不应该覆盖当前的文化设置吗?

decimal v = 2084000.7621m;
System.Console.WriteLine(v.ToString("#,###,###"));
System.Console.ReadLine();

如果我修改代码以使用ToString("#,###,###", CultureInfo.InvariantCulture),我会得到预期的输出,即 2,084,001 ,但在设置 DataFormatString 时我无法指定格式提供程序我的数据绑定控件上的属性。

警告:当使用转义的文字组分隔符时,如下面在接受和其他答案中所述,即使不需要,也会输出使用的文字字符,例如:将格式字符串#\,###\,###应用于值324会导致输出值为,,324

2 个答案:

答案 0 :(得分:7)

据我了解Custom Numeric Format Strings,符号是将组分隔符放入格式(而不是指定要使用的字符)。要使其成为显式符号,您需要使用转义字符\

v.ToString(@"#\,###\,###")

其缺点是格式字符串取决于数字的大小。在这种情况下,即使数字较小或较高,您在结果字符串中始终会得到两个逗号。

要覆盖组分隔符,您需要指定自己的NumberFormatInfo

让这个测试工作:

decimal v = 2084000.7621m;

// clone the InvariantCulture to avoid specifying everything from scratch
var myNumberFormat = (NumberFormatInfo)CultureInfo.InvariantCulture.NumberFormat.Clone();
myNumberFormat.NumberGroupSeparator = "@";
myNumberFormat.NumberDecimalSeparator = "*";
Assert.AreEqual("2@084@000*7621", v.ToString("#,###,###.####", myNumberFormat));

放入格式字符串的组分隔符的位置和数量无关紧要。你也可以做到:"#,#.####"具有完全相同的结果。 (与第一种解决方案相比,这就是使用组分隔符的优势)。

答案 1 :(得分:1)

您的问题是格式字符串中的,字符不代表“插入逗号”;它实际上意味着“为当前语言环境插入千位分隔符”,这恰好是默认语言环境中的空格。

您需要通过在格式字符串中放置反斜杠\来转义逗号。您可能需要使用双反斜杠(或逐字符串)来使编译器按预期接受转义。