确定字符串是否为数字

如果我有这些字符串:

  1. "abc"=false

  2. "123"=true

  3. "ab2"=false

是否有一个命令,如IsNumeric()或其他什么,可以识别字符串是否为有效数字?

1380910 次浏览
int n;bool isNumeric = int.TryParse("123", out n);

更新从C#7开始:

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

或者如果您不需要数字,您可以丢弃 out参数

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

var可以用它们各自的类型替换!

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

例子。

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

结果将=True

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

结果将=False

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

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

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

如果你想知道一个字符串是否是一个数字,你可以尝试解析它:

var numberString = "123";int number;
int.TryParse(numberString , out number);

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

Double. TryParse

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

如果你不想使用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;}}

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

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

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

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

使用其他响应中显示的int.Parse(someString)替代方案的解决方案有效,但它要慢得多,因为抛出异常非常昂贵。TryParse(...)是在版本2中添加到C#语言中的,在那之前您别无选择。现在你做了:因此你应该避免Parse()替代方案。

如果您想接受十进制数字,decimal类也有一个.TryParse(...)方法。将上面讨论中的int替换为decimal,适用相同的原则。

这个函数我用过几次:

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"); //truebool b2 = Microsoft.VisualBasic.Information.IsNumeric("1aa"); // false

基准测试IsNumery选项

alt文本
(来源:aspalliance.com

alt文本
(来源:aspalliance.com

如果input都是数字,这将返回true。不知道它是否比TryParse好,但它会起作用。

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

如果你只是想知道它是否有一个或多个数字与字符混合在一起,请忽略^+$

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

编辑:实际上,我认为它比TryParse更好,因为非常长的字符串可能会溢出TryParse。

希望这有帮助

string myString = "abc";double num;bool isNumber = double.TryParse(myString , out num);
if isNumber{//string is number}else{//string is not a number}
//To my knowledge I did this in a simple waystatic 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());}elseConsole.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;elsef = 1;
return f;}

如果您想捕获更广泛的数字谱,例如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数字类型(不在标准库中定义)。

在您的项目中引入对Visual Basic的引用并使用其Information. IsNumera方法,如下图所示,并且能够捕获浮点数和整数,这与上面的答案不同,后者仅捕获整数。

    // Using Microsoft.VisualBasic;
var txt = "ABCDEFG";
if (Information.IsNumeric(txt))Console.WriteLine ("Numeric");
IsNumeric("12.3"); // trueIsNumeric("1"); // trueIsNumeric("abc"); // false

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

我最终通过谷歌回答了这个问题,因为我想检查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解析为具有TryParse()方法的任何type,它还允许您指定一个默认值以在转换失败时返回。

这比使用带有上述扩展方法的三元运算符要好,因为它只进行一次转换。虽然它仍然使用反射…

示例:

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

产出:

12325123,78107,428.10.2014 00:00:0001.01.0001 00:00:00

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

  • 没有regex和
  • 尽可能多地使用微软的代码

你也可以这样做:

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

这将处理通常的污秽:

  • 开始时减(-)或加(+)
  • 包含十进制字符大整数不会解析小数点的数字。(所以:BigInteger.Parse("3.3")会抛出异常,TryParse会返回false)
  • 没有有趣的非数字
  • 涵盖了数字大于通常使用的Double.TryParse的情况

您必须添加对System.Numerics的引用并具有使用System. Numerics;在你的班级之上(好吧,我猜第二个是奖励:)

您还可以使用:

using System.Linq;
stringTest.All(char.IsDigit);

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

测试用例返回值测试结果
"1234"真正✅通行证
"1"真正✅通行证
"0"真正✅通行证
""真正⚠️失败(已知边缘情况)
"12.34"虚假✅通行证
"+1234"虚假✅通行证
"-13"虚假✅通行证
"3E14"虚假✅通行证
"0x10"虚假✅通行证

请注意stringTest不应该是一个空字符串,因为这将通过数字测试。

我知道这是一个古老的线程,但没有一个答案真正适合我——要么效率低下,要么没有封装以便于重用。我还想确保如果字符串为空或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();

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

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

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

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

可选的“文化”参数可以以几乎相同的方式使用。

它的局限性在于无法转换太大而无法包含在双精度中的字符串,但这是一个有限的要求,我认为如果您使用的数字大于此,那么您可能需要额外的专门数字处理功能。

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

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

使用这些扩展方法来明确区分字符串数值和字符串只有是否包含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 charactersreturn false;}
return true;}}
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;}

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}

具有. 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;}}}

试试下面的regex定义

new Regex(@"^\d{4}").IsMatch("6")    // falsenew Regex(@"^\d{4}").IsMatch("68ab") // falsenew Regex(@"^\d{4}").IsMatch("1111abcdefg")new Regex(@"^\d+").IsMatch("6") // true (any length but at least one digit)

所有答案都很有用。但是,在搜索数字值为12位或更多(在我的情况下)的解决方案时,然后在调试时,我发现以下解决方案很有用:

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

结果变量会给你true或false。

Regex rx = new Regex(@"^([1-9]\d*(\.)\d*|0?(\.)\d*[1-9]\d*|[1-9]\d*)$");string text = "12.0";var result = rx.IsMatch(text);Console.WriteLine(result);

检查字符串是否为uint、ulong或仅包含数字1。(点)和数字样本输入

123 => True123.1 => True0.123 => True.123 => True0.2 => True3452.434.43=> False2342f43.34 => Falsesvasad.324 => False3215.afa => False