什么是NaN或IsNumeric的C#等价物?

时间:2009-01-13 03:32:07

标签: c# parsing

测试输入字符串的最有效方法是,它是否包含数值(或相反的非数字)?我想我可以使用Double.Parse或正则表达式(见下文),但我想知道是否有一些内置方法可以做到这一点,例如javascript的NaN()IsNumeric()(就是那个VB) ,我不记得了?)。

public static bool IsNumeric(this string value)
{
    return Regex.IsMatch(value, "^\\d+$");
}

15 个答案:

答案 0 :(得分:165)

这没有正则表达式开销

double myNum = 0;
String testVar = "Not A Number";

if (Double.TryParse(testVar, out myNum)) {
  // it is a number
} else {
  // it is not a number
}

顺便提一下,除了GUID之外,所有标准数据类型都支持TryParse。

<强>更新
secretwep提出,值“2345”将通过上述测试作为数字。但是,如果您需要确保字符串中的所有字符都是数字,则应采用另一种方法。

示例1

public Boolean IsNumber(String s) {
  Boolean value = true;
  foreach(Char c in s.ToCharArray()) {
    value = value && Char.IsDigit(c);
  }

  return value;
}

或者如果你想变得更加花哨

public Boolean IsNumber(String value) {
  return value.All(Char.IsDigit);
}

答案 1 :(得分:40)

我更喜欢这样的东西,它让你决定要测试的NumberStyle

public static Boolean IsNumeric(String input, NumberStyles numberStyle) {
    Double temp;
    Boolean result = Double.TryParse(input, numberStyle, CultureInfo.CurrentCulture, out temp);
    return result;
}

答案 2 :(得分:19)

除了之前的正确答案之外,可能值得指出的是,“非数字”(NaN)的一般用法是等同于无法作为数值计算的字符串。 NaN通常被理解为用于表示“不可能”计算结果的数值 - 其中结果是未定义的。在这方面,我会说Javascript的使用有点误导。在C#中,NaN被定义为单数字和双数字类型的属性,用于明确地引用零归零的结果。其他语言用它来表示不同的“不可能”值。

答案 3 :(得分:8)

我知道这已经通过许多不同的方式得到了解答,包括扩展和lambda示例,但两者的结合是最简单的解决方案。

public static bool IsNumeric(this String s)
{
    return s.All(Char.IsDigit);
}

或者如果您使用的是Visual Studio 2015(C#6.0或更高版本),那么

public static bool IsNumeric(this String s) => s.All(Char.IsDigit);

令人敬畏的C#6在一条线上。当然这是有限的,因为它只测试数字字符。

要使用,只需要一个字符串并在其上调用方法,例如:

bool IsaNumber = "123456".IsNumeric();

答案 4 :(得分:5)

是的,IsNumeric是VB。通常人们使用TryParse()方法,虽然它有点笨重。正如你的建议,你总是可以自己编写。

int i;
if (int.TryParse(string, out i))
{

}

答案 5 :(得分:5)

我喜欢扩展方法,但如果可能的话,不喜欢抛出异常。 我在这里选择了最好的2个答案的扩展方法。

    /// <summary>
    /// Extension method that works out if a string is numeric or not
    /// </summary>
    /// <param name="str">string that may be a number</param>
    /// <returns>true if numeric, false if not</returns>
    public static bool IsNumeric(this String str)
    {
        double myNum = 0;
        if (Double.TryParse(str, out myNum))
        {
            return true;
        }
        return false;
    }

答案 6 :(得分:4)

VB具有IsNumeric功能。您可以参考Microsoft.VisualBasic.dll并使用它。

答案 7 :(得分:4)

简单扩展:

public static bool IsNumeric(this String str)
{
    try
    {
        Double.Parse(str.ToString());
        return true;
    }
    catch {
    }
    return false;
}

答案 8 :(得分:4)

您仍然可以在C#中使用Visual Basic功能。您唯一需要做的就是按照下面的说明操作:

  1. 添加对Visual Basic库的引用,方法是右键单击项目并选择&#34; Add Reference&#34;:
  2. enter image description here

    1. 然后在您的课程中导入,如下所示:

      使用Microsoft.VisualBasic;

    2. 接下来在任意位置使用,如下所示:

                  if (!Information.IsNumeric(softwareVersion))
              {
                  throw new DataException(string.Format("[{0}] is an invalid App Version!  Only numeric values are supported at this time.", softwareVersion));
              }
      
    3. 希望,这有助于祝你好运!

答案 9 :(得分:3)

public static bool IsNumeric(string anyString)
{
    if (anyString == null)
    {
        anyString = "";
    }

    if (anyString.Length > 0)
    {
        double dummyOut = new double();
        System.Globalization.CultureInfo cultureInfo = new System.Globalization.CultureInfo("en-US", true);
        return Double.TryParse(anyString, System.Globalization.NumberStyles.Any, cultureInfo.NumberFormat, out dummyOut);
    }
    else
    {
        return false;
    }
}

答案 10 :(得分:3)

也许这是C#3功能,但您可以使用double.NaN

答案 11 :(得分:2)

实际上,所有.NET 2.0及更高版本都支持Double.NaN

答案 12 :(得分:2)

我正在使用Chris Lively的片段(选定的答案)封装在像Gishu的建议一样的一年或两年的bool功能中。我用它来确保某些查询字符串只是数字,然后再继续进行处理。我开始得到一些错误的查询字符串,标记的答案没有处理,具体来说,只要在“3645”之类的数字之后传递逗号(返回true)。这是结果mod:

   static public bool IsNumeric(string s)
   {
      double myNum = 0;
      if (Double.TryParse(s, out myNum))
      {
         if (s.Contains(",")) return false;
         return true;
      }
      else
      {
         return false;
      }
   }

答案 13 :(得分:0)

我有一个稍微不同的版本,它会返回数字。我猜想在大多数情况下,在测试字符串后你会想要使用数字。

public bool IsNumeric(string numericString, out Double numericValue)
{
    if (Double.TryParse(numericString, out numericValue))
        return true;
    else
        return false;
}

答案 14 :(得分:0)

这是Siir先生提出的解决方案的修改版本。我发现添加扩展方法是调用方法中重用和简单的最佳解决方案。

public static bool IsNumeric(this String s)
{
    try { double.Parse(s); return true; }
    catch (Exception) { return false; }
}

我修改了方法主体以适合2行,并删除了不必要的.ToString()实现。对于不熟悉扩展方法的人,这里是如何实现:

创建一个名为 ExtensionMethods 的类文件。粘贴此代码:

using System;
using System.Collections.Generic;
using System.Text;

namespace YourNameSpaceHere
{
    public static class ExtensionMethods
    {
        public static bool IsNumeric(this String s)
        {
            try { double.Parse(s); return true; }
            catch (Exception) { return false; }
        }
    }
}

用您的实际名称空间替换 YourNameSpaceHere 。保存更改。现在,您可以在应用程序中的任何位置使用扩展方法:

bool validInput = stringVariable.IsNumeric();

注意:对于整数和小数,此方法将返回true,但如果字符串包含逗号,则将返回false。如果您想接受带有逗号或诸如“ $”之类的符号的输入,建议您首先实施一种删除这些字符的方法,然后测试IsNumeric。