使用各种十进制/基数分隔符分析小数的方法

时间:2012-08-09 18:26:49

标签: 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 result))
        return result;

    return null;
}

这适用于以小数位分隔符表示的全句/句点的小数。但是,我希望此函数与其他标准小数分隔符一起使用,尤其是逗号。 (我读到还有一个阿拉伯小数分隔符:http://en.wikipedia.org/wiki/Decimal_mark#Other_numeral_systems,但这可能依赖于能够解析东部的阿拉伯数字)。

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检查各种设置(千位分隔符,十六进制说明符,货币符号,指数等)似乎有点沉重。这可能不是性能问题,但我很想知道是否有更有效的方法来执行此操作,或者甚至可能是框架内的现有方法?甚至可能在现代使用中可以应对其他数字系统的方法?感谢。

1 个答案:

答案 0 :(得分:0)

似乎框架没有直接提供这个。有趣的是,another question的答案表明,即使使用文化集,框架也不提供任何解析东方阿拉伯数字的机制。由于东方阿拉伯数字要求只是我的应用程序的理论,我坚持我已经在上面的代码。如果我实现更具体的内容,我会发布它!