我做了很多文件解析,其中涉及解析数据类型,如十进制。为了让代码更易读,我一直在使用下面的方法:使用各种十进制/基数分隔符分析小数的方法
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被检查的设置,各种(千个分隔符,十六进制符,货币符号,指数等),似乎有点重。这可能不是一个性能问题,但我很想知道是否有更高效的方法来执行此操作,或者甚至可能是框架中的现有方法?甚至可能有一种方法可以应付现代使用中的其他数字系统?谢谢。
对我来说似乎很有效率。我所做的一个更改是将InvariantCulture放置在数组的末尾,以便首先评估更具体的案例。你不是解析两次,你只是解析得到匹配所需的次数。可能是一次,可能是阵列中的每一种文化。不惜一切代价。做得好。 – 2012-08-09 18:39:05
不知道文化可能会有些棘手,请注意,PL文化中的1,100个是一个和十分之一,另一个在EN中大约1,100个将是一千和一百个。所以你不能阅读你的用户的头脑,并正确地得到它。 – Rafal 2012-08-09 18:39:13
谢谢你们的反馈。我并不担心混淆千位分隔符,因为看到那些用于我正在处理的B2B文件格式的用户是非常不寻常的。小数的格式通常是由机器完成的,而不是手动输入。 – Giles 2012-08-09 19:03:43