2016-03-07 66 views
1

我在字符串识别中遇到问题:我试图识别只有正确格式的数字,但没有找到怎么样。避免decimal.TryParse将“1.1.1”或“1,1,1”识别为十进制

我正在写一种文化不变的方式,所以我需要识别“,”和“。”。作为十进制和千位分隔符,反之亦然。

所有

这些都是正确的格式对我来说:

12,1 
12.1 
1.000,12 
1,000.12 

,但这样的事情是错误的

1.2.3 
1,2,3 

我想:

NumberStyles style; 
decimal n; 
object valore;         
style = NumberStyles.AllowDecimalPoint | NumberStyles.AllowLeadingSign | NumberStyles.AllowThousands; 

Console.WriteLine(decimal.TryParse(valore.ToString(), style , CultureInfo.InvariantCulture, out n)); 

this is the fiddle to test it

但“1 ,1 ,1“被读作有效数字,而”1.1.1“不被读取。

如果我使用自己的特定文化(“IT-IT”),“1,1,1”被识别,“1.1.1”不被识别。

如何丢弃所有无效的字符串?

+2

据我可以告诉你没有在代码中的任何地方使用'style' – user9993

+0

你必须知道源格式提供者,否则这是一个不可能完成的任务。正如你自己所认识的那样,两者在特殊情况下(文化)都是有效的。 –

+0

@ user9993,代码已更正,谢谢 –

回答

0

我弄成了个人的解析器,我希望能找到一个更好的解决方案,但它似乎很不可能

public static bool tryValoreNumerico(object valore, out decimal valoreRestituito) 
    { 
     decimal n;   
     string testoNormalizzato; 

     valoreRestituito = 0; 

     // normalizzazione 
     if (valore.ToString().Contains(",") && valore.ToString().Contains(".")) 
     { 
      if (valore.ToString().IndexOf(".") < valore.ToString().IndexOf(",")) 
      { 
       testoNormalizzato = valore.ToString().Replace(".", ""); 
      } 
      else 
      { 
       testoNormalizzato = valore.ToString().Replace(",", ""); 
      } 
     } 
     else 
     { 
      if ((valore.ToString().Length - valore.ToString().Replace(",", "").Length) > 1) 
      { 
       string[] pezzi = valore.ToString().Split(','); 
       for (int i = 1; i < pezzi.Length; i++) 
       { 
        if (pezzi[i].Length != 3) 
         return false; 
       } 

       testoNormalizzato = valore.ToString().Replace(",", ""); 
      } 
      else if ((valore.ToString().Length - valore.ToString().Replace(".", "").Length) > 1) 
      { 
       string[] pezzi = valore.ToString().Split('.'); 
       for (int i = 1; i < pezzi.Length; i++) 
       { 
        if (pezzi[i].Length != 3) 
         return false; 
       } 

       testoNormalizzato = valore.ToString().Replace(".", ""); 
      } 

      else 
       testoNormalizzato = valore.ToString(); 

     } 
     testoNormalizzato = testoNormalizzato.Replace(",", "."); 

     if (decimal.TryParse(testoNormalizzato, out n) && testoNormalizzato == Convert.ToDecimal(testoNormalizzato, new CultureInfo("en-US")).ToString().Replace(",", ".")) 
     { 
      valoreRestituito = Convert.ToDecimal(testoNormalizzato, new CultureInfo("en-US")); 
     } 
     return decimal.TryParse(testoNormalizzato, out n) && testoNormalizzato == Convert.ToDecimal(testoNormalizzato, new CultureInfo("en-US")).ToString().Replace(",", "."); 

    } 
只言片语

第i个规范化数EN formatand接下来尝试将其转换

阅读评论

最后一项测试是查看没有文字与数字“相似”,因为像“001”,“100 01”这样的字符串不是数字。

比例是:每一个字符串必须保持inalterated:“001”转换成为数字“1”,即从原来的价值,因此必须避免

this is the fiddle

0

此皈依我建议你使用不同Regex用于验证和像这样的自定义解析方法:

public static decimal DecimalParse(string number) 
{ 
    if (new Regex(@"^\d+$").IsMatch(number)) 
    { 
     return decimal.Parse(number, CultureInfo.InvariantCulture); 
    } 
    if (new Regex(@"^(\d{0,3}(,\d{3})*(\.\d+)?)$").IsMatch(number)) 
    { 
     return decimal.Parse(number, CultureInfo.InvariantCulture); 
    } 
    return new Regex(@"^(\d{0,3}(\.\d{3})*(,\d+)?)$").IsMatch(number) 
     ? decimal.Parse(number.Replace(".", "").Replace(",", "."), CultureInfo.InvariantCulture) 
     : 0; 
} 

结果将是:

string num; 
num = "1,000";  Console.WriteLine("{0}", DecimalParse(num));  //1000 
num = ",01";  Console.WriteLine("{0}", DecimalParse(num));  //0.01 
num = ".02";  Console.WriteLine("{0}", DecimalParse(num));  //0.02 
num = "12,1";  Console.WriteLine("{0}", DecimalParse(num));  //12.1 
num = "12.1";  Console.WriteLine("{0}", DecimalParse(num));  //12.1 
num = "1.000,12"; Console.WriteLine("{0}", DecimalParse(num));  //1000.12 
num = "1.000.000,12"; Console.WriteLine("{0}", DecimalParse(num)); //1000000.12 
num = "1,000.12"; Console.WriteLine("{0}", DecimalParse(num));  //1000.12 
num = "1,000,000.12"; Console.WriteLine("{0}", DecimalParse(num)); //1000000.12 
num = "1000";  Console.WriteLine("{0}", DecimalParse(num));  //0 
num = "110.";  Console.WriteLine("{0}", DecimalParse(num));  //0 
num = "110,";  Console.WriteLine("{0}", DecimalParse(num));  //0 
num = "1.2.3";  Console.WriteLine("{0}", DecimalParse(num));  //0 
num = "1,2,3";  Console.WriteLine("{0}", DecimalParse(num));  //0 
+0

无法使用意大利文化在我的机器上工作:第一个正则表达式通过但是decimal.parge发生错误。你可以制作一个文化不可知论的版本吗? –

+0

'返回decimal.Parse(数字,CultureInfo.InvariantCulture);'也出错? –

+0

错误解决。但1,2被渲染为12 –

相关问题