我正在运行ReSharper的测试版,并且它给了我以下代码的警告:
int id;
// ...
DoSomethingWith(id.ToString());
警告在id.ToString()
调用上,它告诉我“明确指定字符串转换中的文化”。我理解这个警告,而且我知道如何修复它 - 只需将代码更改为更加笨拙的id.ToString(CultureInfo.InvariantCulture)
。
但我的问题是:那有必要吗?我的意思是,当您使用类似DateTime
(不同文化具有不同日期格式)和Double
(用于小数点的不同字符)等类型时,显然指定文化非常重要。但Int32.ToString()
,至少在en-US和invariant文化中,根本不添加任何格式。没有逗号,没有小数点,没有美元符号,没有。那么文化会有什么不同呢?
当您调用无参数Int32.ToString()
时,是否有一些文化实际上添加某种格式?或者这是ReSharper测试版中的错误,这个警告真的不适用于Int32
(在这种情况下我会提交ReSharper错误报告)?
答案 0 :(得分:60)
操作系统允许更改数字的负号。
Control panel ->
Language and regional settings ->
Additional settings ->
Negative sign
因此,目前的文化可能已经超越了负号。在这种情况下,您需要尊重区域设置,这是警告的原因。您还可以以编程方式更改负号:
CultureInfo culture = Thread.CurrentThread.CurrentCulture;
// Make a writable clone
culture = (CultureInfo) culture.Clone();
culture.NumberFormat.NegativeSign = "!";
答案 1 :(得分:22)
在随机抽样样本上测试时,安装了Windows(CultureTypes.InstalledWin32Cultures
)的所有352个文化结果都给出了相同的结果。
丹尼尔注意到自定义文化可以使用不同的前缀来表示负数,但我怀疑是否有人曾经偶然使用过此功能。
我猜.NET开发者认为它与float和其他类型一致。他们还有什么期待?
> int.MaxValue.ToString(CultureInfo.AncientRome)
MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM....
答案 2 :(得分:3)
是。这取决于当前的文化。来自MSDN docs:
返回值的格式为通用数字格式说明符(“G”)和当前文化的NumberFormatInfo对象。
强调我的
Resharper最有可能希望您明确表达您打算使用的文化。因为省略它依赖于在不同机器上执行时可能会改变的行为。
答案 3 :(得分:2)
这很奇怪;我原以为50.ToString(CultureInfo.CreateSpecificCulture(“ar-AE”))返回“50”,但事实并非如此。
我刚看了这个,问题似乎是NumberFormatInfo.DigitSubstitution isn't actually implemented
DigitSubstitution属性保留供将来使用。目前,它不用于当前NumberFormatInfo对象的解析或格式化操作。
因此,尽管存在枚举System.Globalization.DigitShapes,但它实际上并未在IFormatProvider的NumberFormatInfo位中实现。
答案 4 :(得分:0)
我会说不,但在检查MSDN Int32.ToString()时就是这样:
使用通用数字格式说明符(“G”)和当前区域性的NumberFormatInfo对象格式化返回值。
所以有一个惊喜。
问题应该是为什么目前的Resharper不会这样做?
答案 5 :(得分:-1)
编译器正在(不必要地)警告我们有关它可能以某种方式强制转换为字符串,而不是我们期望的那样。例如:
int i = 1;
Console.WriteLine("i.ToString='{0}'", i.ToString());
我们都希望它返回为'1',但不能保证100%,因为.ToString()方法受到当前线程区域性的影响。它声称它可能会返回“ 1.00”或类似的结果,但是我用一个非常小的代码对其进行了测试:
foreach(CultureInfo ci In System.Globalization.CultureInfo.GetCultures(CultureTypes.AllCultures) {
Console.WriteLine("RESULT='{0}' CultureCode: {1} EnglishName:{2}", i.ToString(ci), ci.Name, ci.EnglishName);
if (!i.ToString(ci).Equals("1"))
throw new FormatException()
}
该代码从未返回任何错误。因此,它实际上永远不会返回“ 1”以外的任何东西。
在这个世界上,有一个新国家会使用一种全新的本机超级怪兽语言,实际上将整数拼写为“ 1.00”,我们可以毫无疑问地继续使用.ToString()。
干杯!
输出为:
答案 6 :(得分:-4)
因为整数可以高达2,147,483,647。
在some countries中,他们会使用小数或空格代替逗号。