【问题标题】:C#: Anything similar to the php ctype_digit function for C#?C#:有什么类似于 C# 的 php ctype_digit 函数的吗?
【发布时间】:2009-11-17 12:05:38
【问题描述】:

我有一个字符串,我想检查它是否只包含数字。我真的不想(或不需要)解析它或任何东西,我只想知道它除了数字之外什么都不包含(也没有浮点分隔符,只有数字)。

PHP 有一个很好的函数,叫做ctype_digit。 .Net Framework 中的 C# 是否有类似的东西?还是我需要使用正则表达式或类似的东西?

为此创建一个正则表达式当然非常简单,但如果有更好的方法,我不想使用它:p

【问题讨论】:

    标签: c# .net string validation digits


    【解决方案1】:

    您可以使用int.TryParse。如果提供的字符串代表一个有效数字,它将返回 true,否则返回 false。不要忘记使用NumerStyles.None 来禁止空格和加号/减号。

    更新:正如 empi 所说,这不适用于非常大的字符串。如果你有任意大的字符串,也许正则表达式是你唯一的选择。你可以做类似Regex.IsMatch(theString,"^[0-9]+$")

    【讨论】:

    • 我正在编辑答案以在您输入时对 NumberStyles 发表评论。
    • 此函数还检查数字是否适合 int 或 long。例如,它会说 1234567890123456789012345678901234567890123456789012345678901234567890 不是有效数字。
    • 我不喜欢 TryParse 的一点是,您必须为 outing 创建 int。但是是的......也许我会做一个扩展方法或其他东西:p
    • 你不会 iirc,你可以说 int.TryParse("123", new int);
    • @Andy - 不幸的是,这不起作用,因为out 参数要求您传递可分配的变量。
    【解决方案2】:

    @bruno conde的回答让我想到了这个:D

    if(subject.All(char.IsDigit))
        // Do something
    

    不敢相信我之前没想到...

    【讨论】:

    • 是的,我也这么认为,虽然我不喜欢给自己:p(不能标记它直到 48 小时......但会做:p)
    【解决方案3】:
    bool onlyDigits = "1234".All(c => char.IsDigit(c));
    

    【讨论】:

    • 我只是有一个“我以前怎么没想到??”时刻:-)
    • 无论如何我都会将 FirtsOrDefault 更改为:All(c => char.IsDigit(c))
    • @konamiman:刚刚添加了一个答案。几乎就是那个确切的句子,“不敢相信我以前没想过……”——哈哈。
    • @Konamiman,不错。我总是忘记这些方法(All 和 Any);)
    • @bruno conde,正如您在我的回答中看到的,您甚至可以跳过ToCharArray()c => ... (c) 部分:)
    【解决方案4】:

    我想,你最好使用正则表达式为你完成这项工作......“\d+”应该这样做......好吧,你说你不想使用它......但它是万无一失的确保字符串只包含数字的方法,然后如果正则表达式通过,那么您可以直接使用 int.Parse(...)。

    【讨论】:

      【解决方案5】:

      是的,你可以使用

      bool Int32.TryParse(string s, out int result);
      

      代码示例:

      string myString = "1265";
      int myInt;
      
      if (Int32.TryParse(myString,myInt) // Returns true if mystring contains only digits
      {
      ...
      }
      

      其他选项是使用正则表达式:

          public static bool IsDigit(string myString)
          {
              string pattern = @"^\d*$";
      
              if (Regex.IsMatch(myString, pattern))
                  return true;
              else
                  return false;
          }
      

      您可以根据需要更改模式。

      【讨论】:

        【解决方案6】:

        没有内置方法。 Int32.TryParse 或 Int64.TryParse 不适用于仅包含数字的非常长的字符串(它们也可能允许使用其他字符来表示整数)。

        【讨论】:

          【解决方案7】:

          正如其他人所说,您可以使用int.TryParse 方法,尽管除非您的数字真的非常大,否则您可以使用其他类型的TryParse 方法,其范围比int32 的更大。 (当然使用NumberStyles.None 选项,以避免符号和标点符号)。

          以下是细分:

          1. int -2,147,483,648 .. 2,147,483,647
          2. uint 0 .. 4,294,967,295
          3. long -9,223,372,036,854,775,808 .. 9,223,372,036,854,775,807
          4. ulong 0 .. 18,446,744,073,709,551,615
          5. float -3.402823e38 .. 3.402823e38
          6. double -1.79769313486232e308 .. 1.79769313486232e308
          7. decimal -79228162514264337593543950335 .. 79228162514264337593543950335

          可以解析最大数字的是Double。如果你需要使用数字,你会失去一些精度,但它可以解析很长的数字(虽然你说你不需要使用它,所以它不应该是一个问题)。在我做的快速测试中,它成功地解析了以下字符串:

          79228162514264337593543950335792281625142643375935439503357922816251426433759354395033579228162514264337593543950335792281625142643375935439503357922816251426433759354395033579228162514264337593543950335792281625142643375935439503357922816251426433759354395033579228162514264337593543950335234234234234243423
          

          (那是 308 个字符,多一个数字会失败)

          不过,如果你不打算使用这个数字,那可能会有点矫枉过正,所以我会选择 Regex,或者更好的循环检查每个字符是否为数字。

          如果你想有点疯狂,你可以把它分成几个更小的字符串,并使用任务库以并行方式检查它:P

          (我现在知道这有点离题,但如果你确实想这样做,你应该查看parallel.forPartition Ranger,查看这个 C9 10 分钟剪辑:Parallel For Partition Ranger

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-07-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多