具有多个组分隔符的Int32.TryParse

时间:2014-02-25 14:51:05

标签: c# .net

我正在尝试创建一个可以在ok输入上处理和验证整数的方法。问题是我们的要求,无论选择何种语言,都将以下数字表示为ok输入:

1500, 1.500, 1,500, 1 500
-1500, -1.500, -1,500, -1 500
1500000, 1.500.500, 1,500,500 1 500 500
-1500000, -1.500.500, -1,500,500 -1 500 500

等等。

我的方法现在看起来像这样:

private bool TryParseInteger(string controlValue, out int controlInt)
{
      int number;
      NumberStyles styles = NumberStyles.Integer | NumberStyles.AllowThousands;

      bool result = Int32.TryParse(controlValue, styles,
            CultureInfo.InvariantCulture, out number);
      controlInt = number;

      return result;
}

这不符合我的要求。 1.500和1.500.500未被验证为正确的输入。

还有另一种方法可以解决这个问题吗?

感谢所有帮助。事实证明,1.500,50(依此类推)不应该通过验证,这使得建议的解决方案不起作用。还有其他想法吗?

4 个答案:

答案 0 :(得分:3)

我认为这里的问题是每个国家/地区对1.500的理解不同。例如,在美国,等于1的半,有一些无意义的零,在德国(如果记忆服务),它被理解为一千五百。

与此相协调,您应该在方法的开头添加一行,如下所示:

controlValue = new string(controlValue.Where(c => !char.IsPunctuation(c) && c != ' ' || c == '-'));

这将删除所有逗号,句号和空格,只要您只需要整数即可。如果你想获得小数,那么我们就有麻烦...

答案 1 :(得分:3)

只需更换所有这些标志!

此代码:

string[] arr = new[] { "1500", "1.500", "1,500", "1 500", "-1500", "-1.500", "-1,500", "-1 500",
                                "1500000", "1.500.500", "1,500,500","1 500 500",
                                "-1500000", "-1.500.500", "-1,500,500","-1 500 500"};

foreach (var s in arr)
{
    int i = int.Parse(s.Replace(" ", "").Replace(",", "").Replace(".", ""));

    Console.WriteLine(i);
}

产地:

  

1500

     

1500

     

1500

     

1500

     

-1500

     

-1500

     

-1500

     

-1500

     

1500000

     

1500500

     

1500500

     

1500500

     

-1500000

     

-1500500

     

-1500500

     

-1500500

答案 2 :(得分:2)

如果您不想与1,500.5001.500,500匹配,可以将所有.替换为,,并尝试再次解析它。像这样:

private bool TryParseInteger(string controlValue, out int controlInt)
{
      int number;
      NumberStyles styles = NumberStyles.Integer | NumberStyles.AllowThousands;

      bool result = Int32.TryParse(controlValue, styles,
            CultureInfo.InvariantCulture, out number);

      if (!result)
      {
            controlValue = controlValue.Replace('.', ',');
            result = Int32.TryParse(controlValue, styles,
                  CultureInfo.InvariantCulture, out number);
      }
      controlInt = number;

      return result;
}

答案 3 :(得分:0)

您可以创建自己的自定义文化,并根据需要更改NumberGroupSeparator

    private static bool TryParseInteger(string controlValue, out int controlInt)
    {
        String[] groupSeparators = { ",", ".", " "};
        CultureInfo customCulture = CultureInfo.InvariantCulture.Clone() as CultureInfo;
        customCulture.NumberFormat.NumberDecimalSeparator = "SomeUnlikelyString";

        NumberStyles styles = NumberStyles.Integer | NumberStyles.AllowThousands;

        bool success = false;
        controlInt = 0;
        foreach (var separator in groupSeparators)
        {
            customCulture.NumberFormat.NumberGroupSeparator = separator;
            success = Int32.TryParse(controlValue, styles, customCulture, out controlInt);

            if (success)
            {
                break;
            }
        }

        return success;
    }