3

我正在使用 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);
}

上面的代码运行良好,但显然不是最好的。你能提供更好的解决方案吗?

4

3 回答 3

2

如果您将您的双精度作为双原语而不是字符串序列化到您的 xml 文件,它将使用“。”保存它。所以你可以用不变的文化来解析它。

如果它保存为文本,你可以尝试这样的事情:

double result = double.Parse(input.Replace(",", "."), CultureInfo.InvariantCulture);

请注意,对于像“1.234.567,89”这样的数字中的千位分隔符,您仍然会遇到问题。

于 2012-07-23T13:07:35.310 回答
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 is expensive, but you can cache culture info based on what the separator is. This also gives you the flexibility to set up different thousands separators, if needed. You would have to assume what the thousands separator is depending on the decimal separator.

于 2012-07-23T13:13:36.380 回答
0

我建议以固定的 fformat 保存数字,即使用固定的小数分隔符。这意味着应该执行从用户文化到必须保存数字的文化的转换。

于 2012-07-23T13:00:48.200 回答