IsNumericは、D文字を含む文字列に対してtrueを返します

私は今朝VB6アプリケーションに奇妙なエラーがあり、それはIsNumericが期待どおりに動作していないという事実に由来しています。なぜ誰かが何か光を当てることができますか?私にとってこれはバグのようです。

このコードは、メッセージボックスに 4.15877E + 62 を表示します。

Dim strMessage As String
strMessage = "0415877D57"
If IsNumeric(strMessage) Then
    MsgBox CDbl(strMessage)
Else
    MsgBox "not numeric"
End If

私は、ランタイムエンジンが間違ってDが実際にEであると思っていると推測していますか? これはバグだと思うが、VB.NETの全く同じコードは数値ではない これはIsNumericの既知の問題ですか?

8

3 答え

VB6のドキュメントをチェックした場合:

浮動小数点値は、mmmEeeeまたはmmmDeeeで表すことができます。ここで、mmmは仮数で、eeeは指数です(10の累乗)。 Singleデータ型の最高正の値は、3.402823E + 38、または38乗の10倍の3.4倍です。 Doubleデータ型の正の最大値は1.79769313486232D + 308、つまり308乗の約1.8倍です。 Dを使用して数値リテラルの仮数と指数を区切ると、その値はDoubleデータ型として扱われます。同様に、Eを同じ方法で使用すると、その値が単一のデータ型として扱われます。

14
追加された
Oh ok then - これはVB.NETで変更/放棄されたと仮定していますか?
追加された 著者 Matt Wilko,
忠実度のもう一つの損失のように見える、はい。
追加された 著者 Bob77,

私はこの状況のた​​めに、自分のIsNumber関数を長い間使ってきました。 IsNumericは、IsNumeric( "$ 34.20")のように、特定のマネーシンボルに対してtrueを返すこともできます。

私のIsNumber関数は次のようになります:

Public Function IsNumber(ByVal Data As String) As Boolean

  If Data = "" Then
    IsNumber = False
    Exit Function
  End If

  IsNumber = IsNumeric(Data & "e0")

End Function

The idea here is... if there is already an e or d in the data, adding another will cause the data to NOT be numeric using the IsNumeric check. You can easily change this function to only allow for integers by replacing "e0" with ".0e0". Want just positive integers? then use this: IsNumeric("-" & Data & ".0e0")

このメソッドの唯一の欠点は、通常は空の文字列は数値ではなく、 "e0"を追加すると数値になりますので、コードで行ったようにチェックを追加する必要があることです。

11
追加された
IsNumeric(null& "e0")はfalseを返し、空の文字列をチェックするのはなぜですか?
追加された 著者 bjan,
あなたもそうです:)
追加された 著者 bjan,
IsNumeric( "$ 34.20")は米国英語ロケールでは動作しません。
追加された 著者 prem,
あなたが正しい。ただし、このコードを変更してIsNumeric( ""& ".0e0")で整数をチェックすると、trueを返します。
追加された 著者 G Mastros,

私はカスタムバリデータを作ることをお勧めします。 0-9だけを許可しますか?ネガはどうですか?カンマ?私はMicrosoftの実装を心配していませんでしたが、私はそれを理解しています。

1
追加された