我可能會設置一個按照優先順序指定的規則列表,這樣您可以按優先順序插入規則。然後,您可以根據返回正確規則的正則表達式來解析列表。
快速原型將是非常容易建立類似:
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