对于使用Culture

时间:2015-11-30 17:34:51

标签: c#

这是我的问题,我的机器使用法国文化,所以默认情况下它以法语方式解析(3,141592)。

如果机器文化不是美国,这里的代码可以重现我的问题:

    float number = 4103.2680894812f;
    Object numObj = number;
    double val = Double.Parse(numObj.ToString(), CultureInfo.InvariantCulture);
    System.Console.WriteLine(val.ToString(CultureInfo.InvariantCulture));

乍一看,它看起来应该可以正常工作,但Float ToString重载并使用了文化,所以这实际上不起作用。

问题是在实践中返回给我的只是一个对象,因为它可能是一个字符串浮动一个双重或一个Int。

临时解决方案是使用GetType()并检查,但我想知道是否可以使用更清晰的解决方案。

2 个答案:

答案 0 :(得分:3)

您可以使用:

var currentCulture = Thread.CurrentThread.CurrentCulture;
Thread.CurrentThread.CurrenCulture = CultureInfo.InvariantCulture;
try
{
    string s = numObj.ToString();
}
finally
{
    Thread.CurrentThread.CurrentCulture = currentCulture;
}

或者,使用此:

string s;
var formattable = numObj as IFormattable;
if (formattable != null)
{
    s = formattable.ToString(null, CultureInfo.InvariantCulture);
}
else
{
    s = numObj.ToString();
}

答案 1 :(得分:2)

作为建议答案的替代方法,您可以将InvariantCulture从您解析它的方式中删除,这也可以。

Thread.CurrentThread.CurrentCulture = new CultureInfo("fr-FR");
float number = 4103.2680894812f;
Object numObj = number;
double val = Double.Parse(numObj.ToString());
System.Console.WriteLine(val.ToString(CultureInfo.InvariantCulture));

输出4103.268