检查字符串是否包含数字值

4
我正在尝试检查一个字符串是否包含数字值,如果不包含,则返回一个标签;如果包含,则显示主窗口。如何实现呢?
If (mystring = a numeric value)
            //do this:
            var newWindow = new MainWindow();
            newWindow.Show();
If (mystring = non numeric)
            //display mystring in a label
            label1.Text = mystring;

else return error to message box

2
非数字是指没有数字,还是仅仅“不全是数字”? - Servy
7个回答

6

使用 TryParse。

double val;
if (double.TryParse(mystring, out val)) {
    ..
} else { 
    ..
}

如果您要翻译的字符串可以直接转换为数字,那么这将起作用。如果您还需要考虑像$和,等其他字符,则需要做一些额外的工作来清理它。


5
Int32 intValue;
if (Int32.TryParse(mystring, out intValue)){
  // mystring is an integer
}

或者,如果它是一个十进制数:
Double dblValue;
if (Double.TryParse(mystring, out dblValue)){
  // mystring has a decimal number
}

顺便提一下,这里可以找到一些例子(链接)

Testing foo:
Testing 123:
    It's an integer! (123)
    It's a decimal! (123.00)
Testing 1.23:
    It's a decimal! (1.23)
Testing $1.23:
    It's a decimal! (1.23)
Testing 1,234:
    It's a decimal! (1234.00)
Testing 1,234.56:
    It's a decimal! (1234.56)

我已经测试了另外几个:

Testing $ 1,234:                      // Note that the space makes it fail
Testing $1,234:
    It's a decimal! (1234.00)
Testing $1,234.56:
    It's a decimal! (1234.56)
Testing -1,234:
    It's a decimal! (-1234.00)
Testing -123:
    It's an integer! (-123)
    It's a decimal! (-123.00)
Testing $-1,234:                     // negative currency also fails
Testing $-1,234.56:

那么 double 类型不会检查它是否只是一个数字而已,还是一个小数点? - Kirsty White
顺便提一下,Double.TryParse可以处理数字中的逗号,而Int32.TryParse则不能。 - Brad Christie
以前从未了解过逗号的这个特性。似乎这是一个奇怪的设计选择,因为作为千位分隔符,它们在浮点数和整数中同样有效或无效。如果有什么区别的话,只允许在整数中使用会更有意义,因为在FP数字中存在特定于文化的歧义!真的很奇怪。 - Jamie Treworgy
@jamietre:是的,这确实很奇怪。当我继续尝试时,我也感到惊讶,负数货币也无法通过验证。为什么他们接受一种方法而不接受另一种方法...真是奇怪。 - Brad Christie
@Kirsty:如果你只关心它是否为数字,那么使用double.TryParse,因为整数也是有效的双精度浮点数。如果你要求这个数字也必须是整数,那么使用int.TryParse - Jamie Treworgy

2
double value;
if (double.tryParse(mystring, out value))
{
        var newWindow = new MainWindow();
        newWindow.Show();
}
else
{
    label1.Text = mystring;
}

0
你可以简单地引用 Microsoft.VisualBasic.dll,然后执行以下操作:
if (Microsoft.VisualBasic.Information.IsNumeric(mystring))
{
    var newWindow = new MainWindow();
    newWindow.Show();
}
else
{
    label1.Text = mystring;
}

VB 的性能实际上更好,因为它不会在每次失败的转换时抛出异常。

参见:C# 中的 IsNumeric 探索


使用VB库有点有趣,但那篇文章一定是在TryParse之前写的。在C#中,没有理由使用try/catch来测试某个东西是否为数字。 - Jamie Treworgy
是的,我确定。不过这确实是一个有趣的解决方案,这也是为什么我想分享它(因为作为一个VB程序员,我经常使用它)。 - Code Maverick
说实话,我以前从未考虑过这个问题。如果不是只需要使用一次,我可能会对此感到犹豫,因为它是另一个依赖项,但毫无疑问,它是你工具箱中的一种工具。 - Jamie Treworgy
我不会使用 VB 来检查一个字符串是否为数字。还有很多其他方法,如 X.tryParse、Regex、LINQ、foreach,其中一些比其他方法更好,但是没有必要使用 C# 的小弟 - VB。对于这个任务(或者我应该说对于任务),我们有更好的选择。 - gdoron
@gdoron - 这只是一种替代方案。最终还是取决于个人偏好。 - Code Maverick
我给你们两个点赞,因为你们都有能够完成他的任务的功能性答案 =D - Code Maverick

0
您可以使用布尔值来判断字符串是否包含数字字符。
public bool GetNumberFromStr(string str)
    {
        string ss = "";
        foreach (char s in str)
        {
            int a = 0;
            if (int.TryParse(Convert.ToString(s), out a))
                ss += a;
        }
        if ss.Length >0
           return true;
        else
           return false;
    } 

使用 TryParse(Convert...)) 是我能想到的最低效的测试字符是否为数字的方法。 - Jamie Treworgy

0
尝试将标签的标题转换为字符串,并使用 Int.TryParse() 方法来判断文本是整数还是字符串。如果是整数,该方法将返回 true,否则将返回 false。代码如下:
if (Int.TryParse(<string> , out Num) == True)
{
   // is numeric
}
else
{
   //is string
}   

如果转换成功,Num 将包含您的整数值


0

一个能够完成此任务的好方法实例可以在这里找到:http://msdn.microsoft.com/en-us/library/f02979c7.aspx

甚至可以找到一些几乎完全符合您需求的代码。如果您期望整数值,可以使用Int32.TryParse(string)函数,如果您预计双精度浮点数,则使用Double.TryParse(string)。


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