我可能会设置一个按优先顺序指定的规则列表,这样您就可以按优先级插入规则。然后,您可以根据返回正确规则的正则表达式匹配来解析列表。
一个快速原型很容易设置,类似于:
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 变得更容易。此外,如果需要,您可以轻松替换我用于单、双或十进制的浮点类型。