【发布时间】:2012-03-22 01:49:42
【问题描述】:
在 VB 中有一个 IsNumeric 函数,在 c# 中有类似的东西吗?
为了解决这个问题,我只写了代码:
if (Int32.Parse(txtMyText.Text.Trim()) > 0)
我只是想知道是否有更好的方法来做到这一点。
【问题讨论】:
标签: c#
在 VB 中有一个 IsNumeric 函数,在 c# 中有类似的东西吗?
为了解决这个问题,我只写了代码:
if (Int32.Parse(txtMyText.Text.Trim()) > 0)
我只是想知道是否有更好的方法来做到这一点。
【问题讨论】:
标签: c#
你可以写一个扩展方法:
public static class Extension
{
public static bool IsNumeric(this string s)
{
float output;
return float.TryParse(s, out output);
}
}
【讨论】:
IsInteger。数字很模糊。
"$100"这样的字符串的行为。
return float.TryParse(s, out _);
您应该使用TryParse - 如果字符串不是有效数字,Parse 会抛出异常 - 例如如果你想测试一个有效的整数:
int v;
if (Int32.TryParse(textMyText.Text.Trim(), out v)) {
. . .
}
如果你想测试一个有效的浮点数:
double v;
if (Double.TryParse(textMyText.Text.Trim(), out v)) {
. . .
}
还要注意Double.TryParse 有一个重载版本,带有额外的参数,指定控制解析过程的各种规则和选项 - 例如本地化('.' 或 ',') - 请参阅 http://msdn.microsoft.com/en-us/library/3s27fasw.aspx。
【讨论】:
Int32.TryParse 为1E2 返回false,而IsNumeric 返回true。
Double.TryParse - 我正在更新我的答案
我认为你需要一些更通用的东西。试试这个:
public static System.Boolean IsNumeric (System.Object Expression)
{
if(Expression == null || Expression is DateTime)
return false;
if(Expression is Int16 || Expression is Int32 || Expression is Int64 || Expression is Decimal || Expression is Single || Expression is Double || Expression is Boolean)
return true;
try
{
if(Expression is string)
Double.Parse(Expression as string);
else
Double.Parse(Expression.ToString());
return true;
} catch {} // just dismiss errors but return false
return false;
}
}
希望对你有帮助!
【讨论】:
IsNumeric 的功能不匹配。
Double tmp; var isSuccess=Double.TryParse(Expression as string, out tmp); return isSuccess;而不是周围的try-catch块来修改代码的第二部分。
有TryParse 方法,它返回一个布尔值,指示转换是否成功。
【讨论】:
TryParse 方法不会给出与IsNumeric 相同的结果。
其他答案建议使用TryParse,这可能符合您的需求,但提供IsNumeric 函数功能的最安全方法是引用VB 库并使用IsNumeric 函数。
IsNumeric 比TryParse 更灵活。例如,IsNumeric 为字符串"$100" 返回true,而TryParse 方法都返回false。
要在 C# 中使用 IsNumeric,请添加对 Microsoft.VisualBasic.dll 的引用。该函数是Microsoft.VisualBasic.Information类的静态方法,所以假设你有using Microsoft.VisualBasic;,你可以这样做:
if (Information.IsNumeric(txtMyText.Text.Trim())) //...
【讨论】:
"$100" 是数字的结果为“真”?!
IsNumeric 函数。该函数为“$100”返回 true。例如,如果您试图重现 Excel VBA 过程的行为,您可能希望函数为“$100”返回 true,并且您可能最好使用 Microsoft.VisualBasic.dll,而不是尝试编写自己的替换功能。
您应该使用 TryParse 方法,该方法将数字的字符串表示形式转换为其等效的 32 位有符号整数。返回值表示转换是否成功。
int intParsed;
if(int.TryParse(txtMyText.Text.Trim(),out intParsed))
{
// perform your code
}
【讨论】:
int.TryParse 为 "$100" 和 "1E2" 返回 false,而 IsNumeric 返回 true。
有一个更好的方法:
int valueParsed;
if(Int32.TryParse(txtMyText.Text.Trim(), out valueParsed))
{ ... }
如果您尝试解析文本但无法解析,则 Int32.Parse 方法将引发异常。我认为您最好使用 TryParse 方法,该方法将捕获异常并在遇到任何异常时以布尔值的形式通知您。
Int32.Parse 考虑到了解析文本的许多复杂性。重复努力是愚蠢的。因此,这很可能是 VB 的 IsNumeric 采用的方法。您还可以通过 NumberStyles 枚举自定义解析规则,以允许使用十六进制、十进制、货币和其他几种样式。
另一种非基于 Web 的应用程序的常见方法是将文本框的输入限制为仅接受可解析为整数的字符。
编辑:通过指定特定的 NumberStyles,您可以接受更多种类的输入格式,例如货币值(“$100”)和指数(“1E4”):
int valueParsed;
if(Int32.TryParse(txtMyText.Text.Trim(), NumberStyles.AllowCurrencySymbol | NumberStyles.AllowExponent, CultureInfo.CurrentCulture, out valueParsed))
{ ... }
...或通过允许任何类型的支持格式:
int valueParsed;
if(Int32.TryParse(txtMyText.Text.Trim(), NumberStyles.Any, CultureInfo.CurrentCulture, out valueParsed))
{ ... }
【讨论】:
IsNumeric 为"1E2" 和"$100" 等字符串返回true,而Int32.TryParse 为这些字符串返回false。
IsNumeric 的功能,我只会调用 IsNumeric 而不是编写新的 C# 代码并尝试确保我'已经正确地涵盖了所有角落案例。