我正在使用XML文件来存储用户数据。可以从不同的本地化保存和加载文件。根据文化,双号可以保存为“1.2345”或“1,2345”。差异是小数点分隔符。
目前我正在使用以下代码进行解析:
private double StringToDouble(string input)
{
string decimalPoint = NumberFormatInfo.CurrentInfo.NumberDecimalSeparator;
if (!input.Contains(decimalPoint))
{
input = input.Replace(".", decimalPoint);
input = input.Replace(",", decimalPoint);
}
return double.Parse(input);
}
上面的代码运行良好,但显然它不是最好的。 你能提供更好的解决方案吗?
答案 0 :(得分:2)
如果将double作为double原语而不是字符串序列化为xml文件,它将使用“。”将其保存。所以你可以用不变的文化解析它。
如果它保存为文本,您可以尝试这样的事情:
double result = double.Parse(input.Replace(",", "."), CultureInfo.InvariantCulture);
请注意,您仍然可能遇到数千个分隔符的问题,例如“1.234.567,89”。
答案 1 :(得分:2)
老实说,我不认为你目前的解决方案太糟糕了。它不优雅,但您会得到非优雅的数据。正如其他人所建议的那样,我会看到是否可以以一致的格式获取XML文件,或者至少将XML文件保存为文化信息:
<yourRootElement xml:lang="en-US">
这样你就不用猜了。
除此之外,您还可以这样做:
private double StringToDouble(string input)
{
var last = input.LastIndexOfAny(new[] {',', '.'});
var separator = last >= 0 ? input[last] : '.';
var clone = (CultureInfo)CultureInfo.InvariantCulture.Clone();
clone.NumberFormat.NumberDecimalSeparator = separator.ToString(CultureInfo.InvariantCulture);
return double.Parse(input, clone);
}
CultureInfo.Clone
价格昂贵,但您可以根据分隔符的内容缓存文化信息。如果需要,这还使您可以灵活地设置不同的千位分隔符。您必须假设千位分隔符取决于小数分隔符。
答案 2 :(得分:0)
我建议将数字保存在固定的格式中,即使用固定的小数分隔符。这意味着应该执行从用户文化到必须保存号码的文化的转换。