1

我做了很多文件解析,其中涉及解析十进制等数据类型。为了帮助使代码更具可读性,我一直在使用以下方法:

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 正在检查各种设置(千分隔符、十六进制说明符、货币符号、指数等)似乎有点繁重。这可能不是性能问题,但我很想知道是否有更有效的方法可以做到这一点,或者甚至可能是框架内的现有方法?甚至可能是一种可以处理现代使用的其他数字系统的方法?谢谢。

4

1 回答 1

0

该框架似乎没有直接提供此功能。有趣的是,对另一个问题的回答表明,该框架没有提供任何解析东方阿拉伯数字的机制,即使使用文化集也是如此。由于东方阿拉伯数字的要求对于我的应用程序来说只是理论上的,所以我坚持使用上面已经得到的代码。如果我实施更具体的内容,我会发布它!

于 2012-08-16T14:04:00.477 回答