自从发布C#以来,困扰我的一件事就是缺少通用的IsNumeric函数。我知道,如果值是数字,很难生成一个一站式解决方案。
我过去使用过以下解决方案,但这不是最佳做法,因为我正在生成异常以确定该值是否为IsNumeric:
public bool IsNumeric(string input)
{
try
{
int.Parse(input);
return true;
}
catch
{
return false;
}
}
这仍然是解决此问题的最佳方法,还是有更有效的方法来确定C#中的值是否为数字?
答案 0 :(得分:22)
试试这个:
int temp;
return int.TryParse(input, out temp);
当然,行为会与Visual Basic IsNumeric
不同。如果您想要这种行为,可以添加对“Microsoft.VisualBasic”程序集的引用并直接调用Microsoft.VisualBasic.Information.IsNumeric
function。
答案 1 :(得分:14)
您可以使用extension methods扩展String类型以包含IsInteger:
namespace ExtensionMethods
{
public static class MyExtensions
{
public static bool IsInteger(this String input)
{
int temp;
return int.TryParse(input, out temp);
}
}
}
答案 2 :(得分:8)
不是使用int.Parse,而是使用int.TryParse并避免异常。
像这样的东西
public static bool IsNumeric(string input)
{
int dummy;
return int.TryParse(input, out dummy);
}
更一般地说,您可能希望查看double.TryParse。
您还应该考虑的一件事是为不同文化处理数字字符串的可能性。例如,希腊语(el-GR)使用,
作为小数分隔符,而英国(en-GB)使用.
。因此字符串“1,000”将为1000或1,具体取决于当前的文化。鉴于此,您可以考虑为IsNumeric提供支持传递预期文化,数字格式等的重载。看看double.TryParse的2次重载。
答案 3 :(得分:5)
我之前使用过以下extension method,如果它有帮助的话:
public static int? AsNumeric(this string source)
{
int result;
return Int32.TryParse(source, out result) ? result : (int?)null;
}
然后你可以.HasValue
使用现在的bool
,或者使用.Value
作为值,但只转换一次......只是把它扔到那里,不知道是什么情况你以后用它。
答案 4 :(得分:4)
如果你使用Int32.TryParse
,那么你不需要在TryCatch块中包含调用,但是否则,这是采取的方法。
答案 5 :(得分:3)
对于这种方法并不是很疯狂,但是您可以通过添加对Microsoft.VisualBasic.dll库的引用来从C#调用vb.net isNumeric函数...
bool x= Microsoft.VisualBasic.Information.IsNumeric("123");
给出的其他方法都很优秀,但为了完整起见,我想加上这个方法。
答案 6 :(得分:2)
很多TryParse的答案。使用Char.IsNumber():
,这有点不同 public bool IsNumeric(string s)
{
for (int i = 0; i < s.Length; i++)
{
if (char.IsNumber(s, i) == false)
{
return false;
}
}
return true;
}
答案 7 :(得分:1)
看看以下答案: What is the C# equivalent of NaN or IsNumeric?
Double.TryParse负责所有数值,而不仅仅是整数。
答案 8 :(得分:1)
另一种选择 - LINQ!
public static class StringExtensions
{
public static bool IsDigits(this String text)
{
return !text.Any(c => !char.IsDigit(c));
}
}
请注意,这假设您只需要数字0-9。如果您想接受小数点,符号,指数等,请用IsDigit()
重新IsNumber()
。
答案 9 :(得分:1)
我多年来一直使用以下小代码段作为纯C#IsNumeric
函数。
当然,它与Microsoft.VisualBasic
库的IsNumeric
函数不完全相同(如果查看反编译代码)涉及大量类型检查和IConvertible
接口的使用但是这个小功能对我来说效果很好。
另请注意,此函数使用double.TryParse
而不是int.TryParse
来允许解析整数(包括long
)和浮点数。另请注意,此函数在解析(例如)浮点数时特别声明InvariantCulture
,因此将正确识别123.00
和123,00
(注意逗号和小数点分隔符)为浮动点数。
using System;
using System.Globalization;
namespace MyNumberFunctions
{
public static class NumberFunctions
{
public static bool IsNumeric(this object expression)
{
if (expression == null)
{
return false;
}
double number;
return Double.TryParse(Convert.ToString(expression, CultureInfo.InvariantCulture), NumberStyles.Any, NumberFormatInfo.InvariantInfo, out number);
}
}
}
用法非常简单,因为它是作为扩展方法实现的:
string myNumberToParse = "123.00";
bool isThisNumeric = myNumberToParse.IsNumeric();
答案 10 :(得分:0)
public bool IsNumeric(string input)
{
int result;
return Int32.TryParse(input,out result);
}
答案 11 :(得分:0)
试试这个:
public static bool IsNumeric(object o)
{
const NumberStyles sty = NumberStyles.Any;
double d;
return (o != null && Double.TryParse(o.ToString(), sty, null, out d));
}
答案 12 :(得分:0)
您仍然可以在C#中使用Visual Basic功能。您唯一需要做的就是按照下面的说明操作:
然后在您的课程中导入,如下所示:
使用Microsoft.VisualBasic;
接下来在任意位置使用,如下所示:
if (!Information.IsNumeric(softwareVersion))
{
throw new DataException(string.Format("[{0}] is an invalid App Version! Only numeric values are supported at this time.", softwareVersion));
}
希望,这有助于祝你好运!