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

C#逗号分隔数字的默认格式,c#,number-formatting,C#,Number Formatting,我有一个C#应用程序,它在文本框中显示一些大数字。我希望它使用逗号作为分隔符。我使用以下代码来执行此操作: txtNumberDisplay.Text = intNumber.ToString("N0"); 直到最近,上述功能仍能正常工作,它以以下形式正确显示数字: 123,456 最近,千位分隔符以某种方式更改为句点“.”,数字显示如下: 123.456 我的第一个想法是区域性设置不正确,但是我检查了当前线程的默认区域性,它显示了这个数字,并且正确地设置为“EN-US”。你知道为什

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

 txtNumberDisplay.Text = intNumber.ToString("N0");
直到最近,上述功能仍能正常工作,它以以下形式正确显示数字:

 123,456
最近,千位分隔符以某种方式更改为句点“.”,数字显示如下:

 123.456
我的第一个想法是区域性设置不正确,但是我检查了当前线程的默认区域性,它显示了这个数字,并且正确地设置为“EN-US”。你知道为什么会显示句点而不是逗号吗

谢谢,请使用字符串。格式:

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); 
int值=1234;
字符串s=“#”;
对于(int i=0;i
这应该可以很好地工作:

int.ToString("F", CultureInfo.InvariantCulture);
我的第一个想法是区域性设置不正确,但是我检查了当前线程的默认区域性,它显示了这个数字,并且正确地设置为“EN-US”。你知道为什么会显示句点而不是逗号吗

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

执行
intNumber.ToString(“N0”)
而不指定区域性时,使用的区域性是
Thread.CurrentThread.CurrentCulture
。也许您检查了基于Windows语言版本且不用于格式化的
Thread.CurrentThread.CurrentUICulture

如果当前区域性真的是“en-US”,您应该转到控制面板->时钟、语言和区域->更改日期、时间或数字格式,并确保数字分组符号是逗号而不是点。控制面板中显示的符号是在格式化数字时未指定
CultureInfo
时使用的符号

您有几个选择:

  • 格式化时强制使用区域性,例如,
    intNumber.ToString(“N0”,CultureInfo.InvariantCulture)
    以获得所需的逗号

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

Windows 8.1(可能还有8)存储了不正确的区域性设置
因此,如果您依赖于ToString(“formatstring”,即所需的文化),它将无法工作

既然你写了

[…]直到最近,上面的功能还可以正常工作,它还可以显示数字 正确地[…]

我想在工作和不工作之间,您升级到了Windows 8或8.1,这就是为什么它突然停止工作的原因。

例如,对于德国-瑞士文化(“de CH”),它错误地将NumberDecimalSeparator设置为“,”而不是“,”(千位分隔符设置为“,”而不是“”),因此复制粘贴到Excel将不再有效(Excel似乎以某种方式使用非系统格式)

您最好对数字格式进行硬编码,因为这是在windows版本中保持数字格式正常工作的唯一方法

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


您可以使用
InvariantCulture
intValue.ToString(“N0”,CultureInfo.InvariantCulture)
。你是如何检查文化的,也展示了代码。如果你看一下格式,Stefan的方法是最好的。问题是,这取决于你们当前的文化。如果将不变区域性也传递到ToString()方法中,则始终会得到一个点作为delimeter。所以最好的方法可能是Stefan和Tims答案的组合。@Eisenhorn:why is
string.Format(“{0:#,####0}”,value)
value.ToString(“N0”)
更好,除了它也会因为错误的文化而失败之外,这似乎是核心问题?@TimSchmelter,它允许对输出进行更复杂的控制,也就是说,您也可以继续这样做:
string.Format(“{0:###,###,######,#值”)
@Eisenhorn:在需要更复杂的方法之前,请始终使用最简单的方法,否则会不必要地混淆代码。很明显,这正是OP想要的。我以为他说的是一个整数?对不起,我把double改为int:)只是吹毛求疵:我得到了
123.456.789
。我的观点是,这对解决文化问题有什么帮助
intNumber.ToString(“N0”)
也应该可以工作。如果将不变区域性添加到格式调用中,它会像预期的那样工作吗?另一方面,您总是可以手工选择类似de_de的区域性,并将其传递给对逗号delimeter的调用。这是一个非常奇怪的问题……我已经检查了CultureInfo.InvariantCulture和Thread.CurrentThread.CurrentUICulture,并且都设置为“en-US”。我还浏览了这些区域性设置,数字分隔符实际上是一个逗号。我进入控制面板并检查了那里的设置,以确保它们没有被覆盖,也没有被覆盖-它被设置为逗号作为分隔符。我尝试使用.ToString(“N0”,CultureInfo.InvariantCulture)强制使用区域性,但仍然得到句点而不是逗号。很奇怪!我已经在不同的系统上对这个问题做了一些进一步的测试。如果我在Windows7系统上运行完全相同的代码,我会得到逗号;如果我在Windows 8或8.1系统上运行相同的代码,我会得到句点而不是逗号…所有系统都是en-US区域性。@chuckc3:我不知道这是否是拼写错误,但重要的是
Thread.CurrentThread.CurrentCulture
,而不是t
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);
}