Convert.ToDouble 和 double.Parse 与 InvariantCulture 相关性的区别
Difference between Convert.ToDouble and double.Parse in correlation with InvariantCulture
我想知道为什么这行得通:
doubleValue = double.Parse(input[0].ToString(System.Globalization.CultureInfo.InvariantCulture).Replace(',', '.'), System.Globalization.CultureInfo.InvariantCulture);
虽然这不是:
doubleValue = Convert.ToDouble(input[0])
重点是,一个国家大约有 30 台机器(相同的 Windows 图像,相同的硬件,不同的位置)。虽然前 20 台机器可以使用 Convert.ToDouble()
,但其他 10 台机器无法正确转换值(无论是点还是逗号,它们在每种情况下都会丢失小数点)。
由于该程序确实又大又复杂,是否有机会在不更改程序本身的情况下使 Convert.ToDouble()
工作?
另一点是,我尝试了不同的方法将我的字符串值转换为双精度值,其中 none 有效但只有 double.Parse()
...
此外,使用 Convert.ToDouble()
vor 字符串 通常 不好吗? (仅限对象)
编辑:
我在 class:
中创建了这个方法
public static double ToDouble(string value, IFormatProvider provider)
{
if (value == null)
{
return 0.0;
}
return double.Parse(value, NumberStyles.AllowLeadingWhite | NumberStyles.AllowTrailingWhite | NumberStyles.AllowLeadingSign | NumberStyles.AllowDecimalPoint | NumberStyles.AllowThousands | NumberStyles.AllowExponent, provider);
}
并用(也试过点和逗号)调用它:
doubleValue = ToDouble(myTextBox.Text, CultureInfo.InvariantCulture);
结果:仍然无法正常工作...
我记得,Convert.ToDouble()
看起来像这样:
// System.Convert
public static double ToDouble(string value)
{
if (value == null)
{
return 0.0;
}
return double.Parse(value, CultureInfo.CurrentCulture);
}
如您所见,它在内部调用 double.Parse()
方法,使用 CurrentCulture
。因此,如果您有一个字符串,并且希望它始终是双精度字符串,请将 double.Parse() 与您喜欢的区域性一起使用。
P.S。是的,我是对的,您可以使用 ILSpy 查看 mscorlib.dll
。
P.P.S 我忘了 ReferenceSource resource, so you can find out same thing Here.
Convert.ToDouble
使用当前线程文化,因此您无法明确指定要投射的文化。
而 double.Parse
为您提供了一个重载来指定您要解析的区域性,这就是为什么 Convert.ToDouble
在您的某些机器上不起作用的原因。
对于 运行 遇到此类问题的任何人,我终于弄清楚了问题所在。
背景:一些本地 IT 人员安装了一个数据库客户端,在 windows "region and language" 设置中将 "decimal symbol" 与 "digit grouping symbol" 交换。
然而,地区/语言本身并没有改变,所以看来程序 运行 在这里遇到了麻烦。
替换“.”如果字符串已经包含“.”,可能会额外导致问题。
这个问题也可以通过询问 CurrentCulture, NumberDecimalSeparator, and the NumbergroupSeparator 属性然后具体处理字符串来解决。
我想知道为什么这行得通:
doubleValue = double.Parse(input[0].ToString(System.Globalization.CultureInfo.InvariantCulture).Replace(',', '.'), System.Globalization.CultureInfo.InvariantCulture);
虽然这不是:
doubleValue = Convert.ToDouble(input[0])
重点是,一个国家大约有 30 台机器(相同的 Windows 图像,相同的硬件,不同的位置)。虽然前 20 台机器可以使用 Convert.ToDouble()
,但其他 10 台机器无法正确转换值(无论是点还是逗号,它们在每种情况下都会丢失小数点)。
由于该程序确实又大又复杂,是否有机会在不更改程序本身的情况下使 Convert.ToDouble()
工作?
另一点是,我尝试了不同的方法将我的字符串值转换为双精度值,其中 none 有效但只有 double.Parse()
...
此外,使用 Convert.ToDouble()
vor 字符串 通常 不好吗? (仅限对象)
编辑:
我在 class:
中创建了这个方法public static double ToDouble(string value, IFormatProvider provider)
{
if (value == null)
{
return 0.0;
}
return double.Parse(value, NumberStyles.AllowLeadingWhite | NumberStyles.AllowTrailingWhite | NumberStyles.AllowLeadingSign | NumberStyles.AllowDecimalPoint | NumberStyles.AllowThousands | NumberStyles.AllowExponent, provider);
}
并用(也试过点和逗号)调用它:
doubleValue = ToDouble(myTextBox.Text, CultureInfo.InvariantCulture);
结果:仍然无法正常工作...
我记得,Convert.ToDouble()
看起来像这样:
// System.Convert
public static double ToDouble(string value)
{
if (value == null)
{
return 0.0;
}
return double.Parse(value, CultureInfo.CurrentCulture);
}
如您所见,它在内部调用 double.Parse()
方法,使用 CurrentCulture
。因此,如果您有一个字符串,并且希望它始终是双精度字符串,请将 double.Parse() 与您喜欢的区域性一起使用。
P.S。是的,我是对的,您可以使用 ILSpy 查看 mscorlib.dll
。
P.P.S 我忘了 ReferenceSource resource, so you can find out same thing Here.
Convert.ToDouble
使用当前线程文化,因此您无法明确指定要投射的文化。
而 double.Parse
为您提供了一个重载来指定您要解析的区域性,这就是为什么 Convert.ToDouble
在您的某些机器上不起作用的原因。
对于 运行 遇到此类问题的任何人,我终于弄清楚了问题所在。
背景:一些本地 IT 人员安装了一个数据库客户端,在 windows "region and language" 设置中将 "decimal symbol" 与 "digit grouping symbol" 交换。
然而,地区/语言本身并没有改变,所以看来程序 运行 在这里遇到了麻烦。
替换“.”如果字符串已经包含“.”,可能会额外导致问题。
这个问题也可以通过询问 CurrentCulture, NumberDecimalSeparator, and the NumbergroupSeparator 属性然后具体处理字符串来解决。