逗号分隔数字的C#默认格式

时间:2014-01-07 13:26:49

标签: c# number-formatting

我有一个C#应用程序,它在文本框中显示一些大数字。我希望它使用逗号作为千位分隔符。我使用以下代码来执行此操作:

 txtNumberDisplay.Text = intNumber.ToString("N0");

上述工作正常,直到最近才正确显示数字:

 123,456

最近,千位分隔符以某种方式改变为句号“。”数字显示如下:

 123.456

我的第一个想法是文化以某种方式设置不正确但我检查了当前线程的默认文化,它显示了这个数字并且它被正确设置为“EN-US”。知道为什么这会显示句号而不是逗号吗?

谢谢,

4 个答案:

答案 0 :(得分:2)

使用string.Format:

int value = 1234;
string.Format(@"{0:#\,##0}", value); 

//Output will be 1,234

编辑:添加\,

EDIT2:刚发现这对6位数的数字不起作用(需要两个逗号),所以这里有一个工作量,但必须有更好的解决方案......

        int value = 1234;
        string s = "#";
        for (int i = 0; i < value.ToString().Length / 3; i++) s += @"\,###";

        string output = string.Format(@"{0:" + s + "}", value); 

答案 1 :(得分:2)

  

我的第一个想法是文化以某种方式设置不正确但我检查了当前线程的默认文化,它显示了这个数字并且它被正确设置为“EN-US”。知道为什么这会显示句号而不是逗号吗?

文化与“en-US”不同,或者您已在控制面板的区域设置中自定义数字格式。

如果在未指定文化的情况下执行intNumber.ToString("N0"),则使用的文化为Thread.CurrentThread.CurrentCulture。也许您检查过基于Windows语言版本但未用于格式化的Thread.CurrentThread.CurrentUICulture

如果当前的文化真的是“en-US”,你应该去控制面板 - &gt; 时钟,语言和地区 - &gt; 更改日期,时间或数字格式,并确保数字分组符号为逗号而非点。控制面板中显示的符号是格式化数字时未指定CultureInfo时使用的符号。

您有几种选择:

  • 格式化时强制文化,例如intNumber.ToString("N0", CultureInfo.InvariantCulture)按照您的意愿获取逗号。

  • 意识到用户应该能够控制格式。这就是您的代码目前所做的事情。

答案 2 :(得分:1)

这应该完全正常:

int.ToString("F", CultureInfo.InvariantCulture);

答案 3 :(得分:1)

Windows 8.1(可能还有8个)存储的文化区域设置不正确。
因此,如果您依赖于ToString(&#34; formatstring&#34;,desired_culture),它将无法工作。

既然你写了

  

[...]以上工作正常,直到最近才显示数字   正确[...]

我想在工作和不工作之间,你升级到Windows 8或8.1,这解释了为什么它突然停止工作。

例如对于文化德语 - 瑞士(&#34; de-CH&#34;),它错误地将NumberDecimalSeparator设置为&#34;,&#34;而不是&#34;。&#34; (以及千分之一到&#34;&#34;而不是&#34;&#39;&#34;)因此复制粘贴到Excel不再工作(Excel似乎以某种方式使用非系统格式。)

您最好对您的数字格式进行硬编码,因为这是使其保持跨Windows版本工作的唯一方法。

我就是这样做的(您可能想要更改分隔符和货币符号):

private static System.Globalization.NumberFormatInfo SetupNumberFormatInfo()
{ 
    //System.Globalization.NumberFormatInfo nfi = (System.Globalization.NumberFormatInfo)System.Globalization.CultureInfo.InvariantCulture.NumberFormat.Clone();
    System.Globalization.NumberFormatInfo nfi = new System.Globalization.NumberFormatInfo();
    nfi.NumberGroupSeparator = "'";
    nfi.NumberDecimalSeparator = ".";

    nfi.CurrencyGroupSeparator = "'";
    nfi.CurrencyDecimalSeparator = ".";
    nfi.CurrencySymbol = "CHF";

    return nfi;
} // End Function SetupNumberFormatInfo


private static System.Globalization.NumberFormatInfo m_nfi = SetupNumberFormatInfo();


public static string ToNumberString(this double dblQuantity)
{
    return ToNumberString(dblQuantity, "N0");
}


public static string ToNumberString(this double dblQuantity, string Format)
{
    // http://msdn.microsoft.com/en-us/library/system.globalization.numberformatinfo%28VS.71%29.aspx

    //double dblQuantity = -123456789.123456789;
    //string strFormattedInteger = dblQuantity.ToString("N0", m_nfi);
    //strFormattedInteger = string.Format(m_nfi, "{0:N0}", dblQuantity);

    return dblQuantity.ToString(Format, m_nfi);
}