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