C#中缺少IsNumeric函数
C#自发布以来一直困扰我的一件事是缺少通用的IsNumeric函数。 我知道如果一个值是数字,很难产生一个一站式解决方案。
我过去使用过以下解决方案,但这不是最佳实践,因为我生成一个exception以确定该值是否为IsNumeric:
public bool IsNumeric(string input) { try { int.Parse(input); return true; } catch { return false; } }
这仍然是解决此问题的最佳方法,还是有更有效的方法来确定C#中的值是否为数字?
试试这个:
int temp; return int.TryParse(input, out temp);
当然,行为将与Visual Basic IsNumeric
不同。 如果您需要该行为,可以添加对“Microsoft.VisualBasic”程序集的引用,并直接调用Microsoft.VisualBasic.Information.IsNumeric
函数 。
您可以使用扩展方法扩展String类型以包含IsInteger:
namespace ExtensionMethods { public static class MyExtensions { public static bool IsInteger(this String input) { int temp; return int.TryParse(input, out temp); } } }
您可以使用int.TryParse而不是使用int.Parse来避免exception。
像这样的东西
public static bool IsNumeric(string input) { int dummy; return int.TryParse(input, out dummy); }
更一般地说,你可能想看看double.TryParse 。
您还应该考虑的一件事是为不同文化处理数字字符串的可能性。 例如,希腊语(el-GR)使用小数分隔符,而英国(en-GB)使用a .
。 因此字符串“1,000”将为1000或1,具体取决于当前的文化。 鉴于此,您可以考虑为IsNumeric提供支持传递预期文化,数字格式等的重载。看看double.TryParse的2次重载。
我之前使用过以下扩展方法 ,如果它有帮助的话:
public static int? AsNumeric(this string source) { int result; return Int32.TryParse(source, out result) ? result : (int?)null; }
然后你可以使用.HasValue
作为你现在拥有的bool
,或.Value
作为值,但只转换一次……只是将它扔出去,不知道你之后使用它的情况。
如果你使用Int32.TryParse
那么你不需要在TryCatch块中包装调用,否则,是的,这是采取的方法。
关于这种方法并不是很疯狂,但你可以通过添加对Microsoft.VisualBasic.dll库的引用来从C#调用vb.net isNumeric函数…
bool x= Microsoft.VisualBasic.Information.IsNumeric("123");
给出的其他方法是优越的,但为了完整起见,想要添加它。
Lot的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; }
看看以下答案: 什么是NaN或IsNumeric的C#等价物?
Double.TryParse负责所有数值,而不仅仅是整数。
另一种选择 – LINQ!
public static class StringExtensions { public static bool IsDigits(this String text) { return !text.Any(c => !char.IsDigit(c)); } }
请注意,这假设您只需要数字0-9。 如果要接受小数点,符号,指数等,则使用IsNumber()
重新生成IsDigit()
IsNumber()
。
多年来,我一直在使用以下小代码片段作为纯C# IsNumeric
函数。
当然,它与Microsoft.VisualBasic
库的IsNumeric
函数不完全相同(如果您查看反编译代码)涉及大量的类型检查和IConvertible
接口的使用,但是这个小function对我来说效果很好。
另请注意,此函数使用double.TryParse
而不是int.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();
public bool IsNumeric(string input) { int result; return Int32.TryParse(input,out result); }
试试这个:
public static bool IsNumeric(object o) { const NumberStyles sty = NumberStyles.Any; double d; return (o != null && Double.TryParse(o.ToString(), sty, null, out d)); }
您仍然可以在C#中使用Visual Basic函数。 您唯一需要做的就是按照下面的说明操作:
- 右键单击项目并选择“添加引用”,添加对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)); }
希望,这有帮助,祝你好运!