ToString("0")与ToString(CultureInfo.InvariantCulture)

Jan*_*ich 14 .net globalization cultureinfo

我想确保我的应用程序中的某些数字打印时没有任何分隔符,分组等,无论当前环境如何.似乎以下两种方法产生相同的结果(可能更多):

123456789.ToString("0");
123456789.ToString(CultureInfo.InvariantCulture);
Run Code Online (Sandbox Code Playgroud)

你知道任何边缘情况或怪癖吗?哪一个更"正确"?你会用哪一个?

我曾经使用过第二个,但最近我发现了第一个,并开始使用它,因为它不需要额外的using System.Globalization.

Jan*_*ich 22

根据这里的答案和讨论,我做了一些调查.这是我发现的:

  • 当您使用12345678.ToString()不带任何参数时,.NET使用通用格式说明符"G",它仅受NumberFormatInfo.NegativeSign,NumberFormatInfo的影响.NumberDecimalSeparator,NumberFormatInfo.NumberDecimalDigits和NumberFormatInfo.PositiveSign.对我来说,这表明在任何文化中12345678.ToString()都应该总是产生"12345678".

  • 如果要分隔数字,则需要使用数字格式说明符"N"(当然,或者提供自定义格式字符串).数字分组也适用于"C"和"P".

  • 固定区域性不确实指定数字分组(由3个数字,当然)和数字分隔.因此123456789.ToString(CultureInfo.InvariantCulture)产生"123456789" 的原因不是因为不变文化,而是因为默认的通用数字格式说明符"G".

所以我想说结论是不用担心任何额外的论点并且只是使用:

12345678.ToString()
Run Code Online (Sandbox Code Playgroud)

我认为这是所有案例中最好的,因为这意味着通常你甚至不需要调用,ToString()因为大多数打印/写入函数接受各种各样的参数并ToString()为你做.


Han*_*ing 7

这两种方法不等同:第一种方法是使用CurrentCulture.这可能会导致某些文化中出现额外的点/逗号(我没有例子).

使用InvariantCulture时,您确定始终使用相同的格式.

编辑:并且,如果您使用CodeAnalysis,那么当您不使用CultureInfo时会抱怨.

  • 但你是对的:InvariantCulture"听起来"更明确.甚至MSDN也说"......它与英语有关,但与任何国家/地区无关".嗯,当我想到更多,ToString(CultureInfo.InvariantCulture)时,它表示使用"G"格式化的数字.这一切恰好只是因为"G"似乎没有使用任何分组.但是(我只是查了一下)不变文化有一些指定的分组.例如,尝试12345789.ToString("N",CultureInfo.InvariantCulture). (2认同)

Nic*_*ebb 0

如果您想确保指定“无论如何都没有格式”,我个人认为您拥有的第一个选项:

123456789.ToString("0");
Run Code Online (Sandbox Code Playgroud)

更好地传达意图。缺点是如果区域性覆盖了您正在使用的数字类型的格式字符串“0”。