我做了很多文件解析,包括解析像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检查各种设置(千位分隔符,十六进制说明符,货币符号,指数等)似乎有点沉重。这可能不是性能问题,但我很想知道是否有更有效的方法来执行此操作,或者甚至可能是框架内的现有方法?甚至可能在现代使用中可以应对其他数字系统的方法?感谢。
答案 0 :(得分:0)
似乎框架没有直接提供这个。有趣的是,another question的答案表明,即使使用文化集,框架也不提供任何解析东方阿拉伯数字的机制。由于东方阿拉伯数字要求只是我的应用程序的理论,我坚持我已经在上面的代码。如果我实现更具体的内容,我会发布它!