2017-10-05 77 views
2

我很奇怪,为什么这是工作:差异相关与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()工作而不改变程序本身?

的另一点是,我尝试了不同的方法来我的字符串值转换为双,他们都不工作,但只有double.Parse() ...

而且也,是一般不好用Convert.ToDouble() VOR字符串? (仅适用对象)

编辑:

我创造了这个方法,我的类中:

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); 

结果:仍然不工作...

+1

“我试过不同的方法......”包括Convert.ToDouble(text,CultureInfo.InvariantCulture)'? –

+0

您可以更改程序或控制其他10台PC的区域设置。 –

+0

是啊,我试过这个例子:'doubleValue = Convert.ToDouble(myTextBox.Text.Replace('。',','),System.Globalization.CultureInfo.InvariantCulture);'。此外,它是否指向逗号或其他方式无关紧要... – Essigwurst

回答

3

As我还记得,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. Yeap,我是对的,你可以在ILSpy看mscorlib.dll

P.P.S我忘了ReferenceSource资源,所以你可以找到同样的东西Here

+0

请找到我编辑的帖子。仍然不知道为什么这不起作用.. – Essigwurst

0

Convert.ToDouble使用当前的线程文化,所以你不能明确指定你想投的文化。

鉴于double.Parse为您提供了一个重载指定要分析的文化,这就是为什么Convert.ToDouble不适用于某些机器的原因。

+0

是否有可能“同步”我的机器上的文化?重点是,它来自同一个窗口图像......另外,请参阅我在问题中的评论... – Essigwurst

+0

我不认为可以同步所有机器的文化,除非您手动执行它们,但无论如何,我希望你使用的是double.Parse(str,new CultureInfo(“yourCulture”));因为您将始终知道所需的数据将采用哪种格式,并且您可以轻松进行格式化。 –