2012-08-09 65 views
0

我做了很多文件解析,其中涉及解析数据类型,如十进制。为了让代码更易读,我一直在使用下面的方法:使用各种十进制/基数分隔符分析小数的方法

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

对我来说似乎很有效率。我所做的一个更改是将InvariantCulture放置在数组的末尾,以便首先评估更具体的案例。你不是解析两次,你只是解析得到匹配所需的次数。可能是一次,可能是阵列中的每一种文化。不惜一切代价。做得好。 – 2012-08-09 18:39:05

+0

不知道文化可能会有些棘手,请注意,PL文化中的1,100个是一个和十分之一,另一个在EN中大约1,100个将是一千和一百个。所以你不能阅读你的用户的头脑,并正确地得到它。 – Rafal 2012-08-09 18:39:13

+0

谢谢你们的反馈。我并不担心混淆千位分隔符,因为看到那些用于我正在处理的B2B文件格式的用户是非常不寻常的。小数的格式通常是由机器完成的,而不是手动输入。 – Giles 2012-08-09 19:03:43

回答

0

看来,框架并没有直接提供这个。有趣的是,对another question的回答表明该框架没有提供任何解析东阿拉伯数字的机制,即使是在文化背景下也是如此。由于东部阿拉伯数字的要求只是我的应用程序的理论,所以我坚持我已经得到的代码。如果我执行更具体的内容,我会发布它!

+0

与Culture.CurrentCulture相关的不适合某些应用程序,我刚刚注意到.Net 4.5中的一个新功能:CultureInfo.DefaultThreadCurrentCulture。只是觉得我会提到它,以防万一遇到这种情况的人从类似的事情中获益。 – Giles 2012-08-20 15:48:19

相关问题