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 属性然后具体处理字符串来解决。