C# 使用各种小数/基数分隔符解析小数的方法

C# 使用各种小数/基数分隔符解析小数的方法,c#,parsing,internationalization,decimal,separator,C#,Parsing,Internationalization,Decimal,Separator,我做了很多文件解析工作,包括解析像decimal这样的数据类型。为了使代码更具可读性,我一直在使用以下方法: public static decimal? ToDecimal(this string data) { decimal result; if (decimal.TryParse(data, NumberStyles.Integer | NumberStyles.AllowDecimalPoint, CultureInfo.InvariantCulture, out re

我做了很多文件解析工作,包括解析像decimal这样的数据类型。为了使代码更具可读性,我一直在使用以下方法:

public static decimal? ToDecimal(this string data)
{
    decimal result;
    if (decimal.TryParse(data, NumberStyles.Integer | NumberStyles.AllowDecimalPoint, CultureInfo.InvariantCulture, out result))
        return result;

    return null;
}
对于以句号/句点作为小数分隔符表示的小数来说,这很好。但是,我希望此函数与其他标准十进制分隔符一起使用,特别是逗号。我读到还有一个阿拉伯十进制分隔符:,但这可能也依赖于能够解析东方阿拉伯数字

Culture.CurrentCulture不合适,因为数据不一定是在进行处理的计算机上创建的。现在我有了这个:

private static CultureInfo CreateCultureWithNumericDecimalSeparator(string separator)
{
    var cultureInfo = (CultureInfo)CultureInfo.InvariantCulture.Clone();
    cultureInfo.NumberFormat.NumberDecimalSeparator = separator;
    return cultureInfo;
}

private static CultureInfo[] cultureInfos = new CultureInfo[]
{
    CultureInfo.InvariantCulture,
    CreateCultureWithNumericDecimalSeparator(",") // Normal comma
};

public static decimal? ToDecimal(this string data)
{
    foreach (CultureInfo cultureInfo in cultureInfos)
    {
        decimal result;
        if (decimal.TryParse(data, NumberStyles.Integer | NumberStyles.AllowDecimalPoint, cultureInfo, out result))
            return result;
    }

    return null;
}

这是可行的,但解析两次,特别是考虑到TryParse正在检查各种设置,如分隔符、十六进制说明符、货币符号、指数等,似乎有点重。这可能不是一个性能问题,但我很想知道是否有更有效的方法来实现这一点,或者甚至有可能是框架内的现有方法?甚至可能是一种可以处理现代使用的其他数字系统的方法?谢谢。

框架似乎没有直接提供这一点。有趣的是,答案表明该框架没有提供任何解析东方阿拉伯数字的机制,即使是在文化背景下。由于我的应用程序对东方阿拉伯数字的要求只是理论上的,所以我坚持使用上面的代码。如果我实现了更具体的东西,我会发布它

对我来说似乎很有效率。我要做的一个更改是将不变量文化放置在数组的末尾,以便首先评估更具体的案例。您没有解析两次,您只解析了获得匹配所需的次数。可能是一次,可能是阵列中的所有区域性。不惜一切代价。干得好。在不了解文化的情况下,可能需要注意的是,PL文化中的1100是十分之一,而EN文化中的1100是千分之一。所以你们不能正确理解用户的想法。谢谢你们的反馈。我不太担心混淆千个分隔符,因为在我处理的B2B文件格式中看到这些分隔符是非常罕见的。十进制的格式化通常是由机器完成的,而不是手工输入的。与Culture.CurrentCulture不适合某些应用程序相关,我刚刚注意到.Net 4.5中的一个新功能:CultureInfo.DefaultThreadCurrentCulture。我只是想提一提,以防它对任何做过类似事情的人都有用。