确定字符串是否为数字

时间:2009-05-21 18:06:27

标签: c# string parsing isnumeric

如果我有这些字符串:

  1. "abc" = false

  2. "123" = true

  3. "ab2" = false

  4. 是否有命令(如IsNumeric()或其他内容)可以识别字符串是否为有效数字?

25 个答案:

答案 0 :(得分:1012)

int n;
bool isNumeric = int.TryParse("123", out n);

更新从C#7开始:

var isNumeric = int.TryParse("123", out int n);

var 可以替换为各自的类型!

答案 1 :(得分:334)

如果input是所有数字,则返回true。不知道它是否比TryParse更好,但它会起作用。

Regex.IsMatch(input, @"^\d+$")

如果您只是想知道其中是否有一个或多个数字与字符混在一起,请不要使用^ +$

Regex.IsMatch(input, @"\d")

修改 实际上我觉得它比TryParse更好,因为很长的字符串可能会溢出TryParse。

答案 2 :(得分:159)

您也可以使用:

stringTest.All(char.IsDigit);

如果输入字符串是任何类型的字母数字,它将为所有数字数字(不是true)和float返回false

请注意stringTest不应为空字符串,因为这会通过数字测试。

答案 3 :(得分:120)

我已经多次使用过这个功能了:

public static bool IsNumeric(object Expression)
{
    double retNum;

    bool isNum = Double.TryParse(Convert.ToString(Expression), System.Globalization.NumberStyles.Any, System.Globalization.NumberFormatInfo.InvariantInfo, out retNum);
    return isNum;
}

但你也可以使用;

bool b1 = Microsoft.VisualBasic.Information.IsNumeric("1"); //true
bool b2 = Microsoft.VisualBasic.Information.IsNumeric("1aa"); // false

来自Benchmarking IsNumeric Options

alt text
(来源:aspalliance.com

alt text
(来源:aspalliance.com

答案 4 :(得分:32)

这可能是C#中的最佳选择。

如果您想知道字符串是否包含整数(整数):

string someString;
// ...
int myInt;
bool isNumerical = int.TryParse(someString, out myInt);

TryParse方法将尝试将字符串转换为数字(整数),如果成功,它将返回true并将相应的数字放在myInt中。如果不能,则返回false。

使用其他响应中显示的int.Parse(someString)替代方案的解决方案可行,但速度要慢得多,因为抛出异常非常昂贵。版本2中的{#1}}被添加到C#语言中,直到那时您才有了选择权。现在你做了:因此你应该避免使用TryParse(...)替代方案。

如果要接受十进制数,则十进制类也有Parse()方法。在上面的讨论中用int替换int,并且适用相同的原则。

答案 5 :(得分:25)

对于许多数据类型,您始终可以使用内置的TryParse方法来查看相关字符串是否会通过。

实施例

decimal myDec;
var Result = decimal.TryParse("123", out myDec);

结果将= True

decimal myDec;
var Result = decimal.TryParse("abc", out myDec);

结果将= False

答案 6 :(得分:19)

如果您不想使用int.Parse或double.Parse,您可以使用以下内容滚动自己:

public static class Extensions
{
    public static bool IsNumeric(this string s)
    {
        foreach (char c in s)
        {
            if (!char.IsDigit(c) && c != '.')
            {
                return false;
            }
        }

        return true;
    }
}

答案 7 :(得分:14)

我知道这是一个旧线程,但没有一个答案真的为我做了 - 效率低下,或者没有封装以便于重用。如果字符串为空或null,我还想确保它返回false。在这种情况下,TryParse返回true(空字符串在解析为数字时不会导致错误)。所以,这是我的字符串扩展方法:

public static class Extensions
{
    /// <summary>
    /// Returns true if string is numeric and not empty or null or whitespace.
    /// Determines if string is numeric by parsing as Double
    /// </summary>
    /// <param name="str"></param>
    /// <param name="style">Optional style - defaults to NumberStyles.Number (leading and trailing whitespace, leading and trailing sign, decimal point and thousands separator) </param>
    /// <param name="culture">Optional CultureInfo - defaults to InvariantCulture</param>
    /// <returns></returns>
    public static bool IsNumeric(this string str, NumberStyles style = NumberStyles.Number,
        CultureInfo culture = null)
    {
        double num;
        if (culture == null) culture = CultureInfo.InvariantCulture;
        return Double.TryParse(str, style, culture, out num) && !String.IsNullOrWhiteSpace(str);
    }
}

简单易用:

var mystring = "1234.56789";
var test = mystring.IsNumeric();

或者,如果要测试其他类型的数字,可以指定“样式”。 因此,要使用Exponent转换数字,您可以使用:

var mystring = "5.2453232E6";
var test = mystring.IsNumeric(style: NumberStyles.AllowExponent);

或者要测试潜在的十六进制字符串,您可以使用:

var mystring = "0xF67AB2";
var test = mystring.IsNumeric(style: NumberStyles.HexNumber)

可选的'culture'参数可以大致相同的方式使用。

由于无法转换太大而不能包含在double中的字符串而受到限制,但这是有限的要求,我认为如果您使用的数字大于此值,那么您可能需要额外的无论如何,专门的号码处理功能。

答案 8 :(得分:12)

如果您希望获得更广泛的数字,例如PHP is_numeric,您可以使用以下内容:

// From PHP documentation for is_numeric
// (http://php.net/manual/en/function.is-numeric.php)

// Finds whether the given variable is numeric.

// Numeric strings consist of optional sign, any number of digits, optional decimal part and optional
// exponential part. Thus +0123.45e6 is a valid numeric value.

// Hexadecimal (e.g. 0xf4c3b00c), Binary (e.g. 0b10100111001), Octal (e.g. 0777) notation is allowed too but
// only without sign, decimal and exponential part.
static readonly Regex _isNumericRegex =
    new Regex(  "^(" +
                /*Hex*/ @"0x[0-9a-f]+"  + "|" +
                /*Bin*/ @"0b[01]+"      + "|" + 
                /*Oct*/ @"0[0-7]*"      + "|" +
                /*Dec*/ @"((?!0)|[-+]|(?=0+\.))(\d*\.)?\d+(e\d+)?" + 
                ")$" );
static bool IsNumeric( string value )
{
    return _isNumericRegex.IsMatch( value );
}

单元测试:

static void IsNumericTest()
{
    string[] l_unitTests = new string[] { 
        "123",      /* TRUE */
        "abc",      /* FALSE */
        "12.3",     /* TRUE */
        "+12.3",    /* TRUE */
        "-12.3",    /* TRUE */
        "1.23e2",   /* TRUE */
        "-1e23",    /* TRUE */
        "1.2ef",    /* FALSE */
        "0x0",      /* TRUE */
        "0xfff",    /* TRUE */
        "0xf1f",    /* TRUE */
        "0xf1g",    /* FALSE */
        "0123",     /* TRUE */
        "0999",     /* FALSE (not octal) */
        "+0999",    /* TRUE (forced decimal) */
        "0b0101",   /* TRUE */
        "0b0102"    /* FALSE */
    };

    foreach ( string l_unitTest in l_unitTests )
        Console.WriteLine( l_unitTest + " => " + IsNumeric( l_unitTest ).ToString() );

    Console.ReadKey( true );
}

请记住,仅仅因为值是数字并不意味着它可以转换为数字类型。例如,"999999999999999999999999999999.9999999999"是一个完整的有效数值,但它不适合.NET数字类型(不是标准库中定义的那个)。

答案 9 :(得分:9)

如果你想检查一个字符串是否是一个数字(我假设它是一个字符串,因为如果它是一个数字,呃,你知道它是一个)。

  • 没有正则表达式和
  • 尽可能使用Microsoft的代码

您也可以这样做:

public static bool IsNumber(this string aNumber)
{
     BigInteger temp_big_int;
     var is_number = BigInteger.TryParse(aNumber, out temp_big_int);
     return is_number;
}

这将照顾通常的恶意:

  • 开头减去( - )或加号(+)
  • 包含十进制字符 BigIntegers不会解析带小数点的数字。 (所以:BigInteger.Parse("3.3")会抛出异常,TryParse同样会返回false)
  • 没有搞笑的非数字
  • 涵盖数量大于通常使用Double.TryParse
  • 的情况

你必须添加对System.Numerics的引用,并在你的班级上有 using System.Numerics;(好吧,第二个是奖金我想:)

答案 10 :(得分:8)

您可以使用TryParse来确定字符串是否可以解析为整数。

int i;
bool bNum = int.TryParse(str, out i);

布尔值会告诉你它是否有效。

答案 11 :(得分:8)

我想这个答案只会在所有其他答案之间丢失,但无论如何,这里也是如此。

我最后通过Google提出了这个问题,因为我想检查string是否numeric,以便我可以使用double.Parse("123")代替TryParse()方法。

为什么呢?因为在您知道解析是否失败之前必须声明out变量并检查TryParse()的结果是令人讨厌的。我想使用ternary operator来检查string是否为numerical,然后在第一个三元表达式中解析它,或者在第二个三元表达式中提供默认值。

像这样:

var doubleValue = IsNumeric(numberAsString) ? double.Parse(numberAsString) : 0;

它比以下更清洁:

var doubleValue = 0;
if (double.TryParse(numberAsString, out doubleValue)) {
    //whatever you want to do with doubleValue
}

我为这些案件制作了一对extension methods


扩展方法一

public static bool IsParseableAs<TInput>(this string value) {
    var type = typeof(TInput);

    var tryParseMethod = type.GetMethod("TryParse", BindingFlags.Static | BindingFlags.Public, Type.DefaultBinder,
        new[] { typeof(string), type.MakeByRefType() }, null);
    if (tryParseMethod == null) return false;

    var arguments = new[] { value, Activator.CreateInstance(type) };
    return (bool) tryParseMethod.Invoke(null, arguments);
}

示例:

"123".IsParseableAs<double>() ? double.Parse(sNumber) : 0;

因为IsParseableAs()尝试将字符串解析为适当的类型而不是仅检查字符串是否为“数字”,所以它应该是非常安全的。您甚至可以将它用于具有TryParse()方法的非数字类型,例如DateTime

该方法使用反射,您最终调用TryParse()方法两次,当然,效率不高,但并非所有内容都必须完全优化,有时方便更重要。

此方法还可用于轻松地将数字字符串列表解析为double列表或其他具有默认值的类型,而不必捕获任何异常:

var sNumbers = new[] {"10", "20", "30"};
var dValues = sNumbers.Select(s => s.IsParseableAs<double>() ? double.Parse(s) : 0);

扩展方法二

public static TOutput ParseAs<TOutput>(this string value, TOutput defaultValue) {
    var type = typeof(TOutput);

    var tryParseMethod = type.GetMethod("TryParse", BindingFlags.Static | BindingFlags.Public, Type.DefaultBinder,
        new[] { typeof(string), type.MakeByRefType() }, null);
    if (tryParseMethod == null) return defaultValue;

    var arguments = new object[] { value, null };
    return ((bool) tryParseMethod.Invoke(null, arguments)) ? (TOutput) arguments[1] : defaultValue;
}

此扩展方法允许您将string解析为具有type方法的任何TryParse(),并且还允许您指定在转换失败时返回的默认值。

这比使用上面的扩展方法的三元运算符更好,因为它只进行一次转换。它仍然使用反射......

<强>示例:

"123".ParseAs<int>(10);
"abc".ParseAs<int>(25);
"123,78".ParseAs<double>(10);
"abc".ParseAs<double>(107.4);
"2014-10-28".ParseAs<DateTime>(DateTime.MinValue);
"monday".ParseAs<DateTime>(DateTime.MinValue);

<强>输出:

123
25
123,78
107,4
28.10.2014 00:00:00
01.01.0001 00:00:00

答案 12 :(得分:6)

Double.TryParse

bool Double.TryParse(string s, out double result)

答案 13 :(得分:5)

如果您想知道字符串是否为数字,您可以随时尝试解析它:

var numberString = "123";
int number;

int.TryParse(numberString , out number);

请注意,TryParse会返回bool,您可以使用它来检查解析是否成功。

答案 14 :(得分:3)

Kunal Noel答案的更新

stringTest.All(char.IsDigit);
// This returns true if all characters of the string are digits.

但是,在这种情况下,我们有空字符串可以通过该测试,因此,您可以:

if (!string.IsNullOrEmpty(stringTest) && stringTest.All(char.IsDigit)){
   // Do your logic here
}

答案 15 :(得分:2)

使用这些扩展方法可以清楚地区分字符串是否为数字和字符串 only 是否包含0-9位数字

public static class ExtensionMethods
{
    /// <summary>
    /// Returns true if string could represent a valid number, including decimals and local culture symbols
    /// </summary>
    public static bool IsNumeric(this string s)
    {
        decimal d;
        return decimal.TryParse(s, System.Globalization.NumberStyles.Any, System.Globalization.CultureInfo.CurrentCulture, out d);
    }

    /// <summary>
    /// Returns true only if string is wholy comprised of numerical digits
    /// </summary>
    public static bool IsNumbersOnly(this string s)
    {
        if (s == null || s == string.Empty)
            return false;

        foreach (char c in s)
        {
            if (c < '0' || c > '9') // Avoid using .IsDigit or .IsNumeric as they will return true for other characters
                return false;
        }

        return true;
    }
}

答案 16 :(得分:2)

使用c#7,你可以内联变量:

if(int.TryParse(str, out int v))
{
}

答案 17 :(得分:2)

public static bool IsNumeric(this string input)
{
    int n;
    if (!string.IsNullOrEmpty(input)) //.Replace('.',null).Replace(',',null)
    {
        foreach (var i in input)
        {
            if (!int.TryParse(i.ToString(), out n))
            {
                return false;
            }

        }
        return true;
    }
    return false;
}

答案 18 :(得分:1)

希望这有帮助

string myString = "abc";
double num;
bool isNumber = double.TryParse(myString , out num);

if isNumber 
{
//string is number
}
else
{
//string is not a number
}

答案 19 :(得分:1)

.net内置功能称为-char.IsDigit的最佳灵活解决方案。它可以使用无限长数字。仅当每个字符都是数字时才返回true。我使用它很多次,没有问题,而且找到的解决方案也更容易。我做了一个示例方法,可以使用了。另外,我添加了对空和空输入的验证。所以现在该方法是完全防弹的

public static bool IsNumeric(string strNumber)
    {
        if (string.IsNullOrEmpty(strNumber))
        {
            return false;
        }
        else
        {
            int numberOfChar = strNumber.Count();
            if (numberOfChar > 0)
            {
                bool r = strNumber.All(char.IsDigit);
                return r;
            }
            else
            {
                return false;
            }
        }
    }

答案 20 :(得分:0)

在项目中引入对Visual Basic的引用,并使用其Information.IsNumeric方法,如下所示,并且能够捕获浮点数和整数,而不像上面只捕获整数的答案。

    // Using Microsoft.VisualBasic;

    var txt = "ABCDEFG";

    if (Information.IsNumeric(txt))
        Console.WriteLine ("Numeric");

IsNumeric("12.3"); // true
IsNumeric("1"); // true
IsNumeric("abc"); // false

答案 21 :(得分:0)

所有答案都很有用。但是在寻找数值等于或大于12位数字的解决方案时(在我的情况下),然后在调试时,我发现以下解决方案很有用:

double tempInt = 0;
bool result = double.TryParse("Your_12_Digit_Or_more_StringValue", out tempInt);

结果变量将为您提供true或false。

答案 22 :(得分:0)

尝试下面的方法

import MessageKit
import UIKit

open class CustomCell: MessageContentCell {

     open override func configure(with message: MessageType, at indexPath: IndexPath, and messagesCollectionView: MessagesCollectionView) {
         super.configure(with: message, at: indexPath, and: messagesCollectionView)


      }

     override open func layoutAccessoryView(with attributes: MessagesCollectionViewLayoutAttributes) {
         // Accessory view is always on the opposite side of avatar
     }


  }

答案 23 :(得分:-1)

答案 24 :(得分:-6)

//To my knowledge I did this in a simple way
static void Main(string[] args)
{
    string a, b;
    int f1, f2, x, y;
    Console.WriteLine("Enter two inputs");
    a = Convert.ToString(Console.ReadLine());
    b = Console.ReadLine();
    f1 = find(a);
    f2 = find(b);

    if (f1 == 0 && f2 == 0)
    {
        x = Convert.ToInt32(a);
        y = Convert.ToInt32(b);
        Console.WriteLine("Two inputs r number \n so that addition of these text box is= " + (x + y).ToString());
    }
    else
        Console.WriteLine("One or two inputs r string \n so that concatenation of these text box is = " + (a + b));
    Console.ReadKey();
}

static int find(string s)
{
    string s1 = "";
    int f;
    for (int i = 0; i < s.Length; i++)
       for (int j = 0; j <= 9; j++)
       {
           string c = j.ToString();
           if (c[0] == s[i])
           {
               s1 += c[0];
           }
       }

    if (s == s1)
        f = 0;
    else
        f = 1;

    return f;
}