我可能会设置一个按照优先顺序指定的规则列表,这样您可以按优先顺序插入规则。然后,您可以根据返回正确规则的正则表达式来解析列表。
快速原型将是非常容易建立类似:
public class FormatRule
{
public string Pattern { get; set; }
public CultureInfo Culture { get; set; }
public FormatRule(string pattern, CultureInfo culture)
{
Pattern = pattern;
Culture = culture;
}
}
现在的FormatRule用你的规则存储在优先顺序列表:
List<FormatRule> Rules = new List<FormatRule>()
{
/* Add rules in order of precedence specifying a culture
* that can handle the pattern, I've chosen en-US and fr-FR
* for this example, but equally any culture could be swapped
* in for various formats you may need to use */
new FormatRule(@"^0.\d+$", CultureInfo.GetCultureInfo("en-US")),
new FormatRule(@"^0,\d+$", CultureInfo.GetCultureInfo("fr-FR")),
new FormatRule(@"^[1-9]+.\d{4,}$", CultureInfo.GetCultureInfo("en-US")),
new FormatRule(@"^[1-9]+,\d{4,}$", CultureInfo.GetCultureInfo("fr-FR")),
new FormatRule(@"^-?[1-9]{1,3}(,\d{3,})*(\.\d*)?$", CultureInfo.GetCultureInfo("en-US")),
new FormatRule(@"^-?[1-9]{1,3}(.\d{3,})*(\,\d*)?$", CultureInfo.GetCultureInfo("fr-FR")),
/* The default rule */
new FormatRule(string.Empty, CultureInfo.CurrentCulture)
}
,那么你应该能够迭代你的列表寻找适用的正确规则:
public CultureInfo FindProvider(string numberString)
{
foreach(FormatRule rule in Rules)
{
if (Regex.IsMatch(numberString, rule.Pattern))
return rule.Culture;
}
return Rules[Rules.Count - 1].Culture;
}
这组使您可以轻松管理规则,并设置何时应以某种方式处理某些事物时的优先顺序。它还使您能够指定不同的文化来处理一种格式和另一种格式。
public float ParseValue(string valueString)
{
float value = 0;
NumberStyles style = NumberStyles.Any;
IFormatProvider provider = FindCulture(valueString).NumberFormat;
if (float.TryParse(numberString, style, provider, out value))
return value;
else
throw new InvalidCastException(string.Format("Value '{0}' cannot be parsed with any of the providers in the rule set.", valueString));
}
最后,请致电您ParseValue()方法,你有一个浮动的字符串值转换:
string numberString = "-123,456.78"; //Or "23.457.234,87"
float value = ParseValue(numberString);
您可以决定使用字典,以节省额外的FormatRule类;这个概念是相同的...我在示例中使用了一个列表,因为它使查询使用LINQ变得更加容易。此外,如果需要,您可以轻松地替换我用于单倍,双倍或十进制的浮点类型。
我假设您可以从纸质文档中将这些值读取为字符串格式? – BenAlabaster 2009-12-08 14:16:14
我不认为这是可能的。在你的例子中,你有“-33.017”=> -33017和“-166.713”=> -166.713为什么第一种情况下的点解释为千位分隔符,第二种情况下解释为小数点? – Henrik 2009-12-08 14:19:43
也是最后一个我相信你犯了一个错字 – RichardOD 2009-12-08 14:22:18