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