Dot-Net

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

  • August 27, 2011

當我嘗試下面的程式碼時,我得到輸出2 084 001。這裡有什麼問題?我的格式字元串不應該覆蓋目前的文化設置嗎?

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

如果我修改要使用的程式碼ToString("#,###,###", CultureInfo.InvariantCulture),我會得到預期的輸出,即2,084,001 ,但是當我在數據綁定控制項上設置DataFormatString屬性時,我無法指定格式提供程序。

**警告:**使用轉義文字組分隔符時,如下面接受的和其他答案中所述,即使不需要,也始終輸出使用的文字字元,例如將格式字元串#\,###\,###應用於324結果值的,,324

據我了解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));

實際上,您在格式字元串中放入的位置和數量並不重要。你也可以做到:"#,#.####"結果完全相同。(與第一個解決方案相比,這就是使用組分隔符的優點)。

引用自:https://stackoverflow.com/questions/7202162