这是我的问题,我的机器使用法国文化,所以默认情况下它以法语方式解析(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()并检查,但我想知道是否可以使用更清晰的解决方案。
答案 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