IsNumeric Helper方法用于大数
本文关键字:用于 方法 Helper IsNumeric | 更新日期: 2023-09-27 18:12:04
我试图创建一个简单的辅助函数来确定一个数字是否是真正的数字。显然,它应该能够处理'null',负数,我试图做到这一点没有VB的IsNumeric的帮助。我刚学过LINQ,我觉得这很完美。
另一件事我想是能够传递一个字符串,整数,长,或任何其他类型,所以我认为有一个"对象"作为参数是我真正想要的。当然,我总是可以在调用helper方法之前将类型转换为字符串,但是可能吗?
这是我到目前为止的代码,所有我需要做的就是能够改变参数!我无法想象这是不可能的……什么好主意吗?
private static bool IsNumeric(string input)
{
if (input == null) throw new ArgumentNullException("input");
if (string.IsNullOrEmpty(input)) return false;
int periodCount = 0; //accept a string w/ 1dec to support values w/ a float
return input.Trim()
.ToCharArray()
.Where(c =>
{
if (c == '.') periodCount++;
return Char.IsDigit(c) && periodCount <= 1;
})
.Count() == input.Trim().Length;
}
可能?
private static bool IsNumeric<T>(T input)
{
double d;
return double.TryParse(input.ToString(), NumberStyles.Any,CultureInfo.InvariantCulture, out d);
}
bool b1 = IsNumeric(1); //<-- true
bool b2 = IsNumeric(1.0); //<-- true
bool b3 = IsNumeric("a"); //<-- false
bool b4 = IsNumeric("3E+10"); //<-- true
bool b5 = IsNumeric("1,234,567.0"); //<-- true
这里有几件事需要注意。首先,您的代码不能处理任何带有小数的内容。return Char.IsDigit(c) && periodCount <= 1;
应为return (Char.IsDigit(c) || c == '.') && periodCount <= 1;
第二,这是完全可能的。这使得你的代码可以接受任何你想要的东西。
private static bool IsNumeric(object input)
{
if (input == null) throw new ArgumentNullException("input");
string inputStr = input.ToString();
if (string.IsNullOrEmpty(inputStr)) return false;
int periodCount = 0; //accept a string w/ 1dec to support values w/ a float
return inputStr.Trim()
.ToCharArray()
.Where(c =>
{
if (c == '.') periodCount++;
return (Char.IsDigit(c) || c == '.') && periodCount <= 1;
})
.Count() == inputStr.Trim().Length;
}
然而,这很复杂。更简单的方法是
private static bool IsNumeric(object input)
{
if (input == null) throw new ArgumentNullException("input");
double test;
return double.TryParse(input.ToString(), out test);
}
这取决于你的数字有多大,可以尝试以下选项:
return double.TryParse(input, out result);
return decimal.TryParse(input, out result); // Larger numbers than double, but slower.
return BigInteger.TryParse(input, out result); // Very large numbers, but slower and does not support decimals.