在C#中,如何检查一个字符串是否包含一个整数?

81

我只想知道一个String类型的变量是否包含可解析为正整数值。我现在不想解析这个值。

目前我正在进行以下操作:

int parsedId;
if (
    (String.IsNullOrEmpty(myStringVariable) ||
    (!uint.TryParse(myStringVariable, out parsedId))
)
{//..show error message}

这很丑 - 如何更加简洁?

注意:我知道扩展方法,但我想知道是否有内置的方法。


1
你需要允许负数吗? - Matthew Watson
4
保留你已经有的代码,容忍它的丑陋。 - Jeppe Stig Nielsen
@MatthewWatson 感谢您发现这个问题。在我的情况下,它是积极的,澄清了问题。 - Marcel
1
int.TryParse 更改为 uint.TryParse,以使看起来像负整数的字符串返回 false。 - Jeppe Stig Nielsen
8个回答

150
你可以使用 char.IsDigit 方法来判断一个字符是否为数字。
     bool isIntString = "your string".All(char.IsDigit)

如果字符串是数字,将返回true

    bool containsInt = "your string".Any(char.IsDigit)

如果字符串中包含数字,将会返回true


9
如果str等于"iuhs,./hu3dwuh",那么str.Any(char.IsDigit)将为真。 - Jeppe Stig Nielsen
3
我不是给你点踩的人,但是有几点需要指出:1. string 类上没有叫做 Any 的静态函数(我猜你想要称呼字符串变量为 string,但这是不可能的);2. 如果你是指 Linq 扩展方法 Any,你需要这样调用它:s.Any(c => char.IsDigit(c));3. 我认为他希望整个字符串都是一个整数,而不仅仅包含某个数字;否则他使用 int.TryParse 是毫无意义的。 - Magnus Grindal Bakken
6
关于您提到的第二点:不,因为签名和返回类型是正确的,表达式char.IsDigit(所谓的方法组)可以通过隐式转换转换为类型Func<char,bool>,所以这部分是可以的。 - Jeppe Stig Nielsen
1
@JeppeStigNielsen 好主意。我总是忘记了那个。 - Magnus Grindal Bakken
我已经点赞了,但如果您能像Magnus建议的那样更新您的答案以正确使用linq,那就太好了。 - TroySteven
1
@TroySteven - 他错了吗?你不必使用lambda语法,例如s.Any(x => char.IsDigit(x)),你可以只传递char.IsDigit作为委托,试试看... https://dotnetfiddle.net/qS59c0,第一个示例满足“整个字符串是整数”的要求。 - DGibbs

38

假设您希望检查字符串中的所有字符是否都是数字,您可以使用Enumerable.All扩展方法Char.IsDigit方法,如下所示:

bool allCharactersInStringAreDigits = myStringVariable.All(char.IsDigit);

1
如果myStringVariable包含来自世界各地的许多不同“脚本”的数字字符,例如结合了西方数字的印度-阿拉伯数字,那该怎么办? - Jeppe Stig Nielsen
在这种情况下,"۲۲۲"会返回true,但将其解析为int类型时会抛出异常。 - Matthew Watson
1
如果您想检查任何字符是否为数字而不是全部字符,您可以使用 - bool anyCharactersInStringAreDigits = myStringVariable.Any(char.IsDigit); - Deano

33

也许这能帮到你

string input = "hello123world";
bool isDigitPresent = input.Any(c => char.IsDigit(c));

来自msdn的答案。


这是错误的。它将检查某些数字是否存在,但不会检查整个字符串是否表示整数值。 - Marcel
10
问题的要求是检查一个字符串中是否包含可解析为整数的内容,而不是该字符串是否完全代表一个数字。 - Gichamba

8

您可以检查字符串是否仅包含数字:

Regex.IsMatch(myStringVariable, @"^-?\d+$")

但是数字可能比 Int32.MaxValue 更大或比 Int32.MinValue 更小 - 您应该牢记这一点。

另一个选项是创建扩展方法并将丑陋的代码移动到其中:

public static bool IsInteger(this string s)
{
   if (String.IsNullOrEmpty(s))
       return false;

   int i;
   return Int32.TryParse(s, out i);
}

那将使你的代码更加简洁:
if (myStringVariable.IsInteger())
    // ...

直接回答 - Radhe Sham
不错。我已经改进了你的方法,使其可以处理字符串数组。`public static bool IsInteger(this string[] str) { bool isInteger = false; if (str == null) return isInteger;foreach (var s in str) { if (String.IsNullOrEmpty(s)) return isInteger; int i; isInteger = Int32.TryParse(s, out i); if (isInteger == false) return isInteger; } return isInteger;}` - Ashish Kumar Jaryal

5
这对我有用。
("your string goes here").All(char.IsDigit)

1
感谢您的贡献。但是,这与@dtb几年前已经给出的答案重复了。 - Marcel

4
抱歉,我没有完全理解您的问题。您是指类似于这样的内容吗?
str.ToCharArray().Any(char.IsDigit);

这个值必须是一个整数,不能包含任何额外的字符串吗?
if(str.ToCharArray().All(char.IsDigit(c));

你的第二个答案对于 ----- 会返回什么? - I4V
刚刚意识到的;) - SBoss
@SBoss 它应该可以被解析为整数,但我只想知道这一点,而不是解析值的结果。 - Marcel
对不起 Marcel,我应该更仔细地阅读你的问题。我的第二个答案并不是非常漂亮,但它是一种替代方案。 - SBoss
我因为没有理解问题的重点而获得了第一个踩,但既然我修改了我的答案,为什么还会有第二个踩呢? - SBoss

3
        string text = Console.ReadLine();
        bool isNumber = false;

        for (int i = 0; i < text.Length; i++)
        {
            if (char.IsDigit(text[i]))
            {
                isNumber = true;
                break;
            }
        }

        if (isNumber)
        {
            Console.WriteLine("Text contains number.");
        }
        else
        {
            Console.WriteLine("Text doesn't contain number.");
        }

        Console.ReadKey();

或者LINQ:

        string text = Console.ReadLine();

        bool isNumberOccurance =text.Any(letter => char.IsDigit(letter));
        Console.WriteLine("{0}",isDigitPresent ? "Text contains number." : "Text doesn't contain number.");
        Console.ReadKey();

2
答案似乎只是“不行”。虽然有很多好的其他答案,但它们要么只是隐藏了丑陋(而这不是我要求的),要么引入了新的问题(边缘情况)。

我猜C#的设计者可以为我们不关心out变量的情况引入一些新的语法糖。它可能看起来像int.TryParse(myStringVariable, out void)或类似的形式。编译器应该会自动引入一个“生成”的本地变量,其类型正确,但在代码中并不显得难看。当然,这个生成的变量将无法访问(应该具有一些“疯狂”的非法名称)。 - Jeppe Stig Nielsen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接