如果我有这些字符串:
"abc"
= false
"123"
= true
"ab2"
= false
是否有命令(如IsNumeric()
或其他内容)可以识别字符串是否为有效数字?
答案 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
(来源:aspalliance.com)
(来源: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)
如果你想检查一个字符串是否是一个数字(我假设它是一个字符串,因为如果它是一个数字,呃,你知道它是一个)。
您也可以这样做:
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
的引用,并在你的班级上有
using System.Numerics;
(好吧,第二个是奖金我想:)
答案 10 :(得分: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
答案 11 :(得分:8)
您可以使用TryParse来确定字符串是否可以解析为整数。
int i;
bool bNum = int.TryParse(str, out i);
布尔值会告诉你它是否有效。
答案 12 :(得分:6)
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)
使用c#7,你可以内联变量:
if(int.TryParse(str, out int v))
{
}
答案 16 :(得分: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;
}
}
答案 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)
尝试下面的方法
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
}
}
答案 22 :(得分:0)
所有答案都很有用。但是在寻找数值等于或大于12位数字的解决方案时(在我的情况下),然后在调试时,我发现以下解决方案很有用:
double tempInt = 0;
bool result = double.TryParse("Your_12_Digit_Or_more_StringValue", out tempInt);
结果变量将为您提供true或false。
答案 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;
}