Vb.net IsNumeric()允许最后一个值为负数

Vb.net IsNumeric()允许最后一个值为负数,vb.net,Vb.net,我正在代码中使用IsNumeric()函数验证数字 IsNumeric(100)-true, IsNumeric(-100)-true, IsNumeric(+100)-true IsNumeric(100--true-我对此表示怀疑。(100-)这是一个有效的数字吗?IsNumeric()将该值返回true Dim latitude As String = "12.56346-" If IsNumeric(latitude) Then If (Convert.T

我正在代码中使用
IsNumeric()
函数验证数字

IsNumeric(100)
-true,
IsNumeric(-100)
-true,
IsNumeric(+100)
-true

IsNumeric(100-
-true-我对此表示怀疑。(100-)这是一个有效的数字吗?IsNumeric()将该值返回true

    Dim latitude As String = "12.56346-"
    If IsNumeric(latitude) Then
        If (Convert.ToDouble(latitude) >= -90 And Convert.ToDouble(latitude) <= 90) Then
            isValidLatitude.Text = "true"
        Else
            isValidLatitude.Text = "false"
        End If
     Else
        isValidLatitude.Text = "false"
     End If

注意:我以前的回答错误地认为这是一个bug。正如@Damien_the_unsiver的回答所述,此函数尝试将字符串验证为许多数据类型。实际上,值
“100-”
是一个有效的
十进制数。这就是为什么它返回true(因为它是“有效的”十进制数),但在转换为Double(因为它不是有效的Double)时会出现异常@Damien_不信者真的值得你的+1来指出这一点

从文档中(显示IsNumeric尝试验证的所有数据类型):

如果表达式的数据类型为布尔型、字节型、十进制型、双精度型、整数型、长型、SByte型、短型、单精度型、UInteger型、ULong型或UShort型,则IsNumeric返回True。如果表达式是可以成功转换为数字的字符、字符串或对象,它也会返回True。表达式可以包含非数字字符。如果表达式是包含有效十六进制或八进制数的字符串,则IsNumeric返回True。如果表达式包含以+或-字符开头的有效数值表达式或包含逗号,则IsNumeric也会返回True

另外,@CaiusJard做了一次很好的搜索,并指出内部方法使用了一个
NumberStyles.AllowTrailingSign
选项,该选项允许这种行为


好,现在进入解决方案:

Dim value As String = "12.56346-"
Dim number As Double = 0
If Double.TryParse(value, number) Then
    ' String is a valid number, and is already parsed in the "number" variable!
    isValidLatitude.Text = "true"
Else
    ' String is not a valid number!
    isValidLatitude.Text = "false"
End If
只需从所需的数据类型(
int
long
等)中使用
TryParse
方法即可。最酷的是,它的行为完全符合您的预期,如果解析成功,我们已经可以使用解析后的值了

if (Int32.TryParse(value, out int number))
{
    // String is a valid number, and is already parsed in the 'number' variable!
}

else
{
    // String is not a valid number!
}

解决方案的VB.Net版本:

Dim value As String = "12.56346-"
Dim number As Double = 0
If Double.TryParse(value, number) Then
    ' String is a valid number, and is already parsed in the "number" variable!
    isValidLatitude.Text = "true"
Else
    ' String is not a valid number!
    isValidLatitude.Text = "false"
End If

IsNumeric
来自namespace/dll,这是一组帮助工具,旨在帮助VB6程序员在VB.NET上获得他们神秘的VB6代码/知识

您会注意到,如果您使用同一dll中的其他函数,如Microsoft.VisualBasic.Conversion.Int()
,或使用专用VB.NET转换器,如
CInt
CDbl
,这些函数还将处理尾随的减号并返回负值

如果您想省去VB6的旧方法,请使用数字类型的TryParse。。但总而言之,保持一致/如果您使用Microsoft.VisualBasic中的函数来确定是否可以进行转换,请使用vb转换,因为包本身是一致的,但Microsoft.vb和普通.net系统之间在行为上存在一些差异


编辑:

一些人一直在想源代码以及它是如何使用TryParse的,那么为什么它不能像直接使用TryParse那样工作呢

Microsoft.VisualBasic.Information.IsNumeric()
使用
Microsoft.VisualBasic.CompilerServices.DoubleType.TryParse()
确定表达式是否为数值表达式。此
DoubleType.TryParse
Double.TryParse
不同-它还是VB命名空间中的一个辅助方法,专门设置了许多其他标志中的
NumberStyles.AllowTrailingSign
标志。解析数字时(首先是非货币相关的,使用Double.Parse,然后如果失败,则使用货币相关测试的调整值进行第二次尝试),在确定传入值是否为数字时,将结合其他区域数字格式规则考虑此AllowTrailingSign标志

您会注意到,在遵循美国数字格式区域性的机器上,字符串“(100$)”也被声明为数字,但调用
Double.TryParse(“(100$)”,x)
也将返回false。这里的VB助手方法比系统方法更自由,因为它们告诉系统方法比默认情况下更自由


如前所述,我一直将Microsoft.VisualBasic命名空间视为一组帮助器方法,旨在允许将糟糕的旧VB6代码粘贴到VB.NET中,并以最小的干扰工作。我不主张在新项目中使用它,我在VB.NET上工作时删除了引用-使用它来支持VB6的概念“只要放入任何东西,任何类型的东西,它都可能解决问题并工作……如果不行,我们可以随时错误地继续下一步”应该放弃,以支持对执行的操作及其意图的精确和准确

IsNumeric
回答任何正常人都不想问的问题。引用人:

如果表达式的数据类型为布尔型、字节型、十进制型、双精度型、整数型、长型、SByte型、短型、单精度型、UInteger型、ULong型或UShort型,则IsNumeric返回True。如果表达式是可以成功转换为数字的字符、字符串或对象,它也会返回True

注意,它并没有告诉您给定的字符串可以转换为所有数字类型。它告诉您字符串至少可以转换为一种数字类型。当然,对于额外的错误样式点,它不会告诉您字符串可以转换为哪种类型

Decimal.Parse(“100-”)
将非常好地执行,并为您提供一个
Decimal
,其中包含-100的值


因此,它不是一个bug,而是一个由于向后兼容性原因而保留的坏函数。现在,我们更清楚了,我们想测试字符串是否可以转换为特定的数据类型,
TryParse
函数族就是为这种类型设计的。

有什么问题吗?在convert.todouble行中会出现异常..字符串格式是眼睛,我遇到了一个转换问题。“在