我知道可以使用 try/catch 语句检查文本框或变量的值是否为数字,但是
IsNumeric
so 简单得多。我当前的一个项目需要从文本框中恢复值。不幸的是,它是用 C# 编写的。
我知道有一种方法可以通过添加对 Visual Basic 的引用来在 Visual C# 中启用 Visual Basic
IsNumeric
函数,尽管我不知道它的语法。我需要的是在 C# 中启用 IsNumeric
函数的清晰简明的演练。我不打算使用 Visual Basic 固有的任何其他功能。
public bool IsNumeric(string value)
{
return value.All(char.IsNumber);
}
要完全从 Bill answer 中窃取,你可以做一个扩展方法并使用一些语法糖来帮助你。
创建一个类文件,StringExtensions.cs
内容:
public static class StringExt
{
public static bool IsNumeric(this string text)
{
double test;
return double.TryParse(text, out test);
}
}
编辑:这是针对更新的 C# 7 语法。在线声明参数。
public static class StringExt
{
public static bool IsNumeric(this string text) => double.TryParse(text, out _);
}
这样的调用方法:
var text = "I am not a number";
text.IsNumeric() //<--- returns false
你可以做一个辅助方法。像这样的东西:
public bool IsNumeric(string input) {
int test;
return int.TryParse(input, out test);
}
值得一提的是,可以根据 Unicode 类别检查字符串中的字符 - 数字、大写、小写、货币等。下面是两个使用 Linq 检查字符串中数字的示例:
var containsNumbers = s.Any(Char.IsNumber);
var isNumber = s.All(Char.IsNumber);
为清楚起见,上面的语法是以下语法的较短版本:
var containsNumbers = s.Any(c=>Char.IsNumber(c));
var isNumber = s.All(c=>Char.IsNumber(c));
MSDN 上 unicode 类别的链接:
使用 C# 7 (.NET Framework 4.6.2),您可以将 IsNumeric 函数编写为一行代码:
public bool IsNumeric(string val) => int.TryParse(val, out int result);
请注意,上面的函数仅适用于整数 (Int32)。但是你可以为其他数值数据类型实现相应的函数,比如 long、double 等
http://msdn.microsoft.com/en-us/library/wkze6zky.aspx
菜单: 项目-->添加引用
点击:程序集、框架
勾选 Microsoft.VisualBasic.
点击确定。
该链接适用于 Visual Studio 2013,您可以使用不同版本的 visual studio 的“其他版本”下拉菜单。
在所有情况下,您都需要添加对 .NET 程序集“Microsoft.VisualBasic”的引用。
在您的 c# 文件的顶部,您需要:
using Microsoft.VisualBasic;
然后就可以看写代码了
代码会是这样的:
private void btnOK_Click(object sender, EventArgs e)
{
if ( Information.IsNumeric(startingbudget) )
{
MessageBox.Show("This is a number.");
}
}
尝试以下代码片段。
double myVal = 0;
String myVar = "Not Numeric Type";
if (Double.TryParse(myVar , out myNum)) {
// it is a number
} else {
// it is not a number
}
我通常用扩展方法来处理这样的事情。这是在控制台应用程序中实现的一种方式:
namespace ConsoleApplication10
{
class Program
{
static void Main(string[] args)
{
CheckIfNumeric("A");
CheckIfNumeric("22");
CheckIfNumeric("Potato");
CheckIfNumeric("Q");
CheckIfNumeric("A&^*^");
Console.ReadLine();
}
private static void CheckIfNumeric(string input)
{
if (input.IsNumeric())
{
Console.WriteLine(input + " is numeric.");
}
else
{
Console.WriteLine(input + " is NOT numeric.");
}
}
}
public static class StringExtensions
{
public static bool IsNumeric(this string input)
{
return Regex.IsMatch(input, @"^\d+$");
}
}
}
A 不是数字。
22 是数字。
土豆不是数字。
Q 不是数字。
A&^*^ 不是数字。
使用 Net6 进行测试并使用
object
进行通用测试,因为我的应用程序需要:
public static bool IsNumeric(this object text) => double.TryParse(Convert.ToString(text), out _);
与
null
和string.empty
一起工作,还测试了""
。
public static bool IsNumeric(string Value)
{
return decimal.TryParse(Value, out _) || double.TryParse(Value, out _);
/*
decimal vs double:
If a numeric value uses lot of decimal digits, it may not be convertible to 'double' type!
If a numeric value is too big, it may not be convertible to 'decimal' type!
Mr. "Jon Skeet" said some years ago:
The range of a double value is much larger than the range of a decimal.
0.1 is exactly representable in decimal but not in double, and decimal
actually uses a lot more bits for precision than double does.
*/
}
我阅读了所有建议并比较了它。 这个建议更好:
public static bool IsNumeric(string value) => double.TryParse(value, out _);
但是这个解决方案并不完美,因为它不支持浮点数:
public bool static IsNumeric(string value)=>value.All(char.IsNumber);
数字可以通过多种方式实现,但我用我的方式
public bool IsNumeric(string value)
{
bool isNumeric = true;
char[] digits = "0123456789".ToCharArray();
char[] letters = value.ToCharArray();
for (int k = 0; k < letters.Length; k++)
{
for (int i = 0; i < digits.Length; i++)
{
if (letters[k] != digits[i])
{
isNumeric = false;
break;
}
}
}
return isNumeric;
}