对象上的固定文化 ToString,该对象使用区域性重载 ToString

本文关键字:对象 ToString 区域性 重载 文化 | 更新日期: 2023-09-27 18:25:14

这是我的问题,我的机器使用法语区域性,因此默认情况下它以法语方式解析 (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 已重载并使用区域性,因此这实际上不起作用。

问题是在实践中返回给我的只是一个对象,因为它可以是字符串、浮点数、双精度或整数。

一个临时解决方案是使用 GetType(( 并检查,但我想知道是否有可能更干净的解决方案。

对象上的固定文化 ToString,该对象使用区域性重载 ToString

你可以使用这个:

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

作为建议答案的替代方法,您可以从解析方式中删除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