NaN或IsNumeric的C#等效项是什么?


102

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

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

Answers:


176

这没有正则表达式开销

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

更新2(从@stackonfire处理空字符串或空字符串)

public Boolean IsNumber(String s) { 
    Boolean value = true; 
    if (s == String.Empty || s == null) { 
        value=false; 
    } else { 
        foreach(Char c in s.ToCharArray()) { 
            value = value && Char.IsDigit(c); 
        } 
    } return value; 
}

如果需要,您可以将上面的代码包装到更有用的实用程序方法中,例如public static bool IsInteger(string sMaybeANumber)
2009年

@Gishu:如果您只关心数字是否可以转换,那是对的。
2009年

2
与此唯一的问题是Number在Javascript对象是浮动或整数,所以改为double.TryParse将是一个更完全等效
克里斯小号

7
您可能要对此小心一点,因为字符串“ NaN”和“ Infinity”解析为a double,但是许多人会认为它们不是数字。
Mike Zboray

1
校正后的示例1处理空字符串或空字符串,否则将导致IsNumber错误地返回true: public Boolean IsNumber(String s) { Boolean value = true; if (s == String.Empty || s == null) { value=false; } else { foreach(Char c in s.ToCharArray()) { value = value && Char.IsDigit(c); } } return value; }
stackonfire

41

我喜欢这样的东西,它可以让您决定NumberStyle要测试的内容。

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

7
+1是迄今为止Double.TryParse而不是Int.TryParse的唯一人:)
johnc

显然,这几乎也是一种扩展方法。
Anthony Mastrean 2011年

19

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


11

我知道可以通过扩展和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();

1
对于不熟悉扩展方法的用户,包括一些更多信息(或至少提供周围的静态类以提供更完整的示例)可能会有所帮助。
johnnyRose

我不喜欢这种解决方案,因为对于带小数的数字,它将返回false。这可能是有用的整数,但如果你想使用它的方法是什么的应该改名IsInteger
technoman23

5

是的,IsNumeric是VB。人们通常使用TryParse()方法,尽管它有点笨拙。如您所建议,您可以随时编写自己的。

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

}

5

我喜欢扩展方法,但如果可能的话,不喜欢抛出异常。我选择了一种扩展方法,在这里采用了两个最佳答案。

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

4

您仍然可以在C#中使用Visual Basic函数。 您唯一要做的就是按照下面显示的说明进行操作:

  1. 通过右键单击项目并选择“添加引用”,将引用添加到Visual Basic库

在此处输入图片说明

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

希望这会有所帮助,祝你好运!


2
虽然我不推荐这种方法,但这正确的答案。不知道为什么它被否决了,并且由于没有解释为什么原因,我投票否决了它:-)
Abacus 2015年

4

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


您只能在> 2.0版本的.net中使用该VB方法吗?
Ed S.

@ChuckD:那是主观的。您是否引用处理json的外部库或将其全部编写为自己解析json?
shahkalpesh

@ChuckD:替我省点石块,并解释为什么它是胡扯。对我来说,它只是另一个包含一些有用的类/函数的dll。
shahkalpesh

@ChuckD我认为您在这里不合理。该功能可以完成工作,很容易导入,没什么大不了的。
错误

1
@ChuckD,您可能希望从建设性批评开始,而不是从为IsNumeric导入VisualBasic.dll开始,这会让您被解雇!显然,这将使某人恢复。答案可以追溯到09年,甚至对某些人来说仍然有用。
错误

4

简单扩展:

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

如果输入参数是字符串,为什么要使用.ToString()?
technoman23

这个答案很好,因为它消除了TryParse方法所需的垃圾变量,该变量用于NER1808解决方案之类的答案中。
technoman23

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

3

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


2

实际上,Double.NaN所有.NET 2.0版及更高版本均支持该功能。


2

我正在使用Chris Lively的代码片段(选定的答案)封装在bool函数(如Gishu的建议)中一两年。我用它来确保某些查询字符串只是数字,然后再进行进一步处理。我开始收到一些错误的查询字符串,标记的答案没有处理,特别是每当在“ 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;
      }
   }

+1表示有趣。我想这更多是使用问题。换句话说,如果您只想确保可以将值转换为数字而不会引发错误,那么我的原始答案是好的。但是,如果您更担心字符串中的所有字符实际上都是数字,则需要一种完全不同的方法
NotMe 2013年

Double.TryParse(s, NumberStyles.Float, CultureInfo.InvariantCulture, out myNum)
Sam Harwell

0

我有一个略有不同的版本,该版本返回数字。我猜想在大多数情况下,在测试字符串之后,您将希望使用数字。

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

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。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.