C#测试字符串是否为整数?

87

我只是好奇C#语言或.NET Framework是否内置了可用于检测某个变量是否为整数的功能。

if (x is an int)
   // Do something

在我看来可能会有,但我只是一名一年级的编程学生,所以不确定。


3
你的代码中,x 的数据类型是什么? - Pavel Minaev
感谢您的修改,Holterman。我应该澄清一下。 - Alex
10个回答

187

使用int.TryParse方法。

string x = "42";
if(int.TryParse(x, out int value))
  // Do something
如果成功解析,则该函数将返回true,并将输出结果作为整数值。

1
他们是否也有TryParse方法适用于其他变量类型?使用这种方法被认为是良好的编程实践吗? - Alex
3
许多其他的.NET原始类型(如UInt64、Double等)也有TryParse方法。如果你有一个字符串,使用TryParse通常是将其转换为这些类型中的一种的最佳实践。 - dtb
@Alex,请尝试使用 IntelliSense。它可以在您输入时显示每个类的每个成员。 - snarf
我仍然在使用这种方法得到负值。你能告诉我应该如何忽略负值吗?@Brandon - Arpit Patel
@ArpitPatel 负整数仍然是有效的整数。如果你想忽略它,只需进行 < 0 检查即可。 - Brandon
一个具有千位分隔符的字符串失败 - hiFI

20

如果你只是想检查传递变量的类型,你可能可以使用:

    var a = 2;
    if (a is int)
    {
        //is integer
    }
    //or:
    if (a.GetType() == typeof(int))
    {
        //is integer
    }

1
是的,我想这真的取决于我最初将变量x声明为什么。 - Alex
这两个对我都不起作用。当我调查时,GetType() 返回 int64,但 typeof(int) 返回 int32。我会假设第一个 if 做了相同的事情。 - Dan Hastings

18

我记得曾经看过int.TryParse和int.Parse、Regex以及char.IsNumber之间的性能比较,而char.IsNumber是最快的。无论如何,这里有一种新的方法来实现相同的功能。

        bool isNumeric = true;
        foreach (char c in "12345")
        {
            if (!Char.IsNumber(c))
            {
                isNumeric = false;
                break;
            }
        }

删掉关于TryParse性能的评论,它只适用于int.Parse、Regex和char.IsNumber。我想到的参考资料是在.NET 2.0之前,当时TryParse还不存在。 - Wil P
1
这里有一个不错的参考资料,来自cp网站,展示了一些不同的方法来实现这个功能。http://www.codeproject.com/KB/cs/csharp-isnumeric.aspx - Wil P
6
这里将一个空字符串视为数字进行验证,你应该先将 isNumeric 设为 false... - Chtioui Malek
1
包含负值的字符串将不会被验证。 - Bob Kaufman

18

对于 Wil P 的解决方案 (见上文),您也可以使用 LINQ。

var x = "12345";
var isNumeric = !string.IsNullOrEmpty(x) && x.All(Char.IsDigit);

7
包含负数的字符串将无法通过验证。 - Bob Kaufman
是的,你说得对,这不是一个完整的整数测试。我只是简化了Wil P.的建议。 - Georg
2
对于那些寻求简单测试正整数的好方案,例如数字记录编号,非常感谢! - Phil Nicholas

4

如果你只是想检查它是否为字符串,你可以直接在方法调用中放置“out int”关键字。根据dotnetperls.com网站的说法,在旧版C#中不允许使用此语法。通过这样做,你可以减少程序的行数。

string x = "text or int";
if (int.TryParse(x, out int output))
{
  // Console.WriteLine(x);
  // x is an int
  // Do something
}
else
{
  // x is not an int
}

如果你也想得到整数值,可以像这样写。 方法1
string x = "text or int";
int value = 0;
if(int.TryParse(x, out value))
{
  // x is an int
  // Do something
}
  else
{
  // x is not an int
}

Method 2

string x = "text or int";
int num = Convert.ToInt32(x);
Console.WriteLine(num);

Referece: https://www.dotnetperls.com/parse


4

很简单,使用这段代码

bool anyname = your_string_Name.All(char.IsDigit);

如果您的字符串是整数,它将返回true,否则返回false...

3
这段代码检查字符串中的所有字符是否都是数字,但不处理负数、带有(无操作)前导 “+” 或周围空格的数字。(结果变量的命名也令人困惑。)我还想指责它不包括例如 0.01,000(如果你在某些地区,则为 1.000),但 TryParse 也没有包括,所以我想它并不更糟糕。 - Nathan Tuggy

2

这个函数将告诉您是否仅包含字符0123456789的字符串。

private bool IsInt(string sVal)
{
    foreach (char c in sVal)
    {
         int iN = (int)c;
         if ((iN > 57) || (iN < 48))
            return false;
    }
    return true;
}

这与int.TryParse()不同,后者只会告诉你你的字符串可能是一个整数。
例如," 123\r\n"将从int.TryParse()返回TRUE,但从上面的函数返回FALSE。
这只取决于你需要回答的问题。

1
private bool isNumber(object p_Value)
    {
        try
        {
            if (int.Parse(p_Value.ToString()).GetType().Equals(typeof(int)))
                return true;
            else
                return false;
        }
        catch (Exception ex)
        {
            return false;
        }
    }

我之前写过一些东西。上面有一些很好的例子,但只是我的个人看法。


1
这可能在表达式树中很有用,因为不允许使用 out 参数。 - Totalys

1
也许这可以是另一种解决方案。
try
{
    Console.Write("write your number : ");
    Console.WriteLine("Your number is : " + int.Parse(Console.ReadLine()));
}
catch (Exception x)
{
    Console.WriteLine(x.Message);
}
Console.ReadLine();

0

我学编程大约两个星期了,刚刚创建了一个简单的逻辑来验证是否接受了一个整数。

    Console.WriteLine("How many numbers do you want to enter?"); // request a number
    string input = Console.ReadLine(); // set the input as a string variable
    int numberTotal; // declare an int variable

    if (!int.TryParse(input, out numberTotal)) // process if input was an invalid number
    {
        while (numberTotal  < 1) // numberTotal is set to 0 by default if no number is entered
        {
            Console.WriteLine(input + " is an invalid number."); // error message
            int.TryParse(Console.ReadLine(), out numberTotal); // allows the user to input another value
        }

    } // this loop will repeat until numberTotal has an int set to 1 or above

如果您喜欢不在循环的第三个参数中声明动作,您也可以在FOR循环中使用上述方法,例如

    Console.WriteLine("How many numbers do you want to enter?");
    string input2 = Console.ReadLine();

    if (!int.TryParse(input2, out numberTotal2))
    {
        for (int numberTotal2 = 0; numberTotal2 < 1;)
        {
            Console.WriteLine(input2 + " is an invalid number.");
            int.TryParse(Console.ReadLine(), out numberTotal2);
        }

    }

如果你不想要循环,只需删除整个循环括号即可。

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