如果我有这些字符串:
"abc"
=false
"123"
=true
"ab2"
=false
是否有类似命令IsNumeric()
或其他命令可以识别字符串是否为有效数字?
如果我有这些字符串:
"abc"
= false
"123"
= true
"ab2"
= false
是否有类似命令IsNumeric()
或其他命令可以识别字符串是否为有效数字?
Answers:
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 _);
该变种 S可通过它们各自的类型来代替!
public static bool IsNumeric(this string text) { double _out; return double.TryParse(text, out _out); }
如果input
是所有数字,则将返回true 。不知道它是否比更好TryParse
,但是它可以工作。
Regex.IsMatch(input, @"^\d+$")
如果您只想知道它是否有一个或多个数字与字符混合,请不要使用^
+
和$
。
Regex.IsMatch(input, @"\d")
编辑: 实际上,我认为它比TryParse更好,因为很长的字符串可能会导致TryParse溢出。
RegexOptions.Compiled
如果要运行数千个参数以增加速度,则可以将其添加为参数Regex.IsMatch(x.BinNumber, @"^\d+$", RegexOptions.Compiled)
.
您还可以使用:
stringTest.All(char.IsDigit);
如果输入字符串是任何字母数字形式,它将返回true
所有数字位数(不是float
)false
。
请注意:stringTest
不能为空字符串,因为这将通过数字测试。
..--..--
作为有效数字传递。显然不是。
我已经多次使用此功能:
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
(来源:aspalliance.com)
(来源:aspalliance.com)
这可能是C#中最好的选择。
如果您想知道字符串是否包含整数(整数):
string someString;
// ...
int myInt;
bool isNumerical = int.TryParse(someString, out myInt);
TryParse方法将尝试将字符串转换为数字(整数),如果成功,它将返回true,并将相应的数字放入myInt中。如果不能,则返回false。
使用int.Parse(someString)
其他响应中显示的替代方案的解决方案有效,但是它要慢得多,因为引发异常非常昂贵。TryParse(...)
是在版本2中添加到C#语言中的,直到那时您别无选择。现在您要做:因此您应该避免Parse()
其他选择。
如果要接受十进制数字,则十进制类也有一个.TryParse(...)
方法。在上面的讨论中,将int替换为十进制,并且应用相同的原理。
如果您不想使用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;
}
}
如果您想获取更广泛的数字,例如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数字类型(也就是说,不是标准库中定义的一个)。
我知道这是一个旧线程,但是没有一个答案真正对我有用-效率低下或未封装以便于重用。我还想确保如果字符串为空或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)
可选的“ culture”参数可以以几乎相同的方式使用。
它的局限性在于无法转换太大而不能包含在双精度数中的字符串,但这是一个有限的要求,我想如果您要使用大于此的数字,则可能需要其他专门的数字处理反正功能。
如果要检查字符串是否是数字(我假设它是字符串,因为如果是数字,,,您知道它是一个)。
您也可以这样做:
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;
在您的课堂上占上风(嗯,第二个是我猜想的奖励:)
我猜这个答案只会在其他所有答案之间迷失,但是无论如何,这是可行的。
我最终通过Google提出了这个问题,因为我想检查a是否是string
,numeric
以便我可以使用double.Parse("123")
而不是TryParse()
方法。
为什么?因为在知道解析是否失败之前必须声明一个out
变量并检查的结果很烦人TryParse()
。我想使用ternary operator
检查是否为string
is 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;
}
此扩展方法使您可以将a解析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
var x = double.TryParse("2.2", new double()) ? double.Parse("2.2") : 0.0;
吗?
Argument 2 must be passed with the 'out' keyword
并且如果您指定out
以及new
得到A ref or out argument must be an assignable variable
。
如果您想知道字符串是否为数字,可以随时尝试解析它:
var numberString = "123";
int number;
int.TryParse(numberString , out number);
请注意,TryParse
返回bool
,可以用来检查解析是否成功。
bool Double.TryParse(string s, out double result)
带有.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;
}
}
}
使用这些扩展方法可以清楚地区分字符串是否为数字和字符串是否仅包含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;
}
}
在您的项目中引入对Visual Basic的引用,并使用其Information.IsNumeric方法(如下所示),并能够捕获浮点数和整数,这与上面的答案仅捕获int有所不同。
// Using Microsoft.VisualBasic;
var txt = "ABCDEFG";
if (Information.IsNumeric(txt))
Console.WriteLine ("Numeric");
IsNumeric("12.3"); // true
IsNumeric("1"); // true
IsNumeric("abc"); // false
IsNumeric
对字符串进行字符分析。因此,即使无法使用标准数字类型表示此数字,也9999999999999999999999999999999999999999999999999999999999.99999999999
将像这样的数字注册为True
。
这是C#方法。 Int.TryParse方法(字符串,Int32)
//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;
}