在.NET C#中解析未知文化的最佳方法是什么?

时间:2012-07-23 12:56:19

标签: c# .net parsing double

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

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

3 个答案:

答案 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)

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