1

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

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

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

4

7 回答 7

8

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

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

于 2009-11-17T12:07:45.090 回答
5

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

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

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

于 2009-11-17T12:25:45.693 回答
3
bool onlyDigits = "1234".All(c => char.IsDigit(c));
于 2009-11-17T12:13:40.207 回答
1

是的,您可以使用

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;
    }

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

于 2009-11-17T12:09:15.983 回答
1

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

于 2009-11-17T12:14:08.753 回答
0

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

于 2009-11-17T12:10:16.320 回答
0

正如其他人所说,您可以使用该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. 如果你需要使用 number ,你会失去一些精度,但它可以解析很长的数字(虽然你说你不需要使用它,所以它不应该是一个问题)。在我做的快速测试中,它成功地解析了以下字符串:

79228162514264337593543950335792281625142643375935439503357922816251426433759354395033579228162514264337593543950335792281625142643375935439503357922816251426433759354395033579228162514264337593543950335792281625142643375935439503357922816251426433759354395033579228162514264337593543950335234234234234243423

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

不过,如果您不打算使用该数字,这可能是一种矫枉过正,所以我会选择正则表达式,或者更好的循环检查每个字符是一个数字。

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

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

于 2009-11-17T16:56:45.757 回答