C# 哪个号码<-&燃气轮机;字符串转换总是一致的,不考虑本地化设置?

C# 哪个号码<-&燃气轮机;字符串转换总是一致的,不考虑本地化设置?,c#,localization,tostring,C#,Localization,Tostring,我有一些数字字符串转换的问题,我无法解决 我们已经编写了一个序列化框架,它使用了几种xml序列化技术。但我在生成的输出中看到了一些不一致的数字转换: 使用: var c = TypeDescriptor.GetConverter(double); var s = c.ConvertToString(value); 及 我得到了带有逗号分隔符的字符串,如3,33和转换回双精度,但在另一个使用点作为分隔符的国家,转换回双精度也有效吗?(我在德国,我们使用逗号,但除此之外,我想要点分隔符) 然后在代

我有一些数字字符串转换的问题,我无法解决

我们已经编写了一个序列化框架,它使用了几种xml序列化技术。但我在生成的输出中看到了一些不一致的数字转换:

使用:

var c = TypeDescriptor.GetConverter(double);
var s = c.ConvertToString(value);

我得到了带有逗号分隔符的字符串,如3,33和转换回双精度,但在另一个使用点作为分隔符的国家,转换回双精度也有效吗?(我在德国,我们使用逗号,但除此之外,我想要点分隔符)

然后在代码的另一部分中,我通过将其添加到XElement直接转换某些结构中的双精度:

data.Add(new XElement("x", vector.x));
XElement构造函数将double转换为带有点状“3.33”的字符串

当我想把这个字符串转换回double时,它变得非常奇怪:

Double.TryParse(item.Value, out value.x);

两者都忽略了点,我有一个双值333

所以我也尝试了TypeConverter代码,但它给了我一个例外,“3.33”不是双转换器的有效字符串

现在,我真正需要的是一个数字字符串转换,它总是使用点分隔符,并对其进行正确的解析,而不考虑区域性/本地化设置

我迷路了。。我应该用哪一种?我甚至试过这样的方法:

    NumberFormatInfo provider = new NumberFormatInfo();

    provider.NumberDecimalSeparator = ".";
    provider.NumberGroupSeparator = " ";
    provider.NumberGroupSizes = new int[] { 3 };

    foreach (var item in CultureInfo.GetCultures(CultureTypes.AllCultures))
    {
        item.NumberFormat = provider;
    }
但这没用。。
感谢您的提示。

您想要固定区域性:


HTH

您想要固定区域性:

HTH

一个关于如何“修复”此问题的示例。假设这是原件:

double ParseString(string s)
{
     return double.Parse(s);
}
这是一种修复方法

double ParseString(string s)
{
     return double.Parse(s, CultureInfo.InvariantCulture);
}
如果有大量的语法分析,可以使用另一种方法()

关于如何“修复”此问题的示例。假设这是原件:

double ParseString(string s)
{
     return double.Parse(s);
}
这是一种修复方法

double ParseString(string s)
{
     return double.Parse(s, CultureInfo.InvariantCulture);
}
如果有大量的语法分析,可以使用另一种方法()


根据上一个示例,我会小心替换
Thread.CurrentCulture
。显然,这不是线程安全的,如果另一个线程依赖于
CurrentCulture
作为用户的区域性,那么砰!Thread.CurrentCulture不是只为当前线程切换吗?希望我现在就这样做了。。有人能澄清一下吗?我会小心替换上一个例子中的
Thread.CurrentCulture
。显然,这不是线程安全的,如果另一个线程依赖于
CurrentCulture
作为用户的区域性,那么砰!Thread.CurrentCulture不是只为当前线程切换吗?希望我现在就这样做了。。有人能澄清一下吗?
double ParseString(string s)
{
     // Save off previous culture and switch to invariant for serialization.
     CultureInfo previousCulture = Thread.CurrentThread.CurrentCulture;
     Thread.CurrentThread.CurrentCulture = CultureInfo.InvariantCulture;

     double result = double.Parse(s, CultureInfo.InvariantCulture);

     Thread.CurrentThread.CurrentCulture = previousCulture;

     return result;
}