8
votes

Renvoie Isnumeric True pour les cordes contenant un caractère D

J'ai eu une erreur étrange dans une application VB6 ce matin et tout provient du fait que Numérique ne fonctionne pas comme prévu. Quelqu'un peut-il perdre une lumière sur pourquoi? À moi cela semble être un bug.

Ce code affiche 4.15877e + 62 dans un boîtier de message: xxx

Je suppose que le Le moteur d'exécution pense à tort que le D est en fait un e? Je pense que ceci est un bug que comme le même code dans les sorties VB.net pas numérique Est-ce un problème connu avec isnumeric?


0 commentaires

3 Réponses :


16
votes

Si vous vérifiez les documents VB6:

Note Les valeurs à virgule flottante peuvent être exprimées comme mmmeeee ou MMMDEEE, dans laquelle MMM est la MANTUSSA et EEE est l'exposant (une puissance de 10). La valeur positive la plus élevée d'un type de données unique est de 3,402823e + 38, ou 3,4 fois 10 à la 38ème puissance; La valeur positive la plus élevée d'un double type de données est de 1,79769313486232D + 308, ou environ 1,8 fois 10 à la 308ème puissance. L'utilisation de D pour séparer la mantissie et l'exposant dans un littéral numérique provoque le traitement de la valeur comme un double type de données. De même, l'utilisation de E de la même manière traite la valeur en tant que type de données unique.


2 commentaires

Oh ok alors - je suppose que cela a été changé / abandonné dans vb.net alors?


On dirait qu'une seule perte de fidélité, oui.



1
votes

Je suggère de faire un validateur personnalisé. Voulez-vous autoriser 0-9 seulement? Qu'en est-il des négatifs? Des virgules? Je n'ai jamais pris soin de la mise en œuvre de Microsoft, mais je le comprends.


0 commentaires

12
votes

J'utilise ma propre fonction ISnumber pendant une longue période exactement à cause de cette situation. Isnumeric peut également revenir pour certains symboles de l'argent, comme celui-ci: isnumeric ("34,20 $").

Ma fonction ISnumber ressemble à ceci: p>

Public Function IsNumber(ByVal Data As String) As Boolean

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

  IsNumber = IsNumeric(Data & "e0")

End Function


3 commentaires

Isnumeric (null & "e0") reviendra de faux alors pourquoi vérifier la chaîne vide?


Tu as raison. Toutefois, si vous modifiez ce code pour vérifier les numéros entiers avec ISnumeric ("" & ".0e0"), il retournera true.


Isnumeric ("34,20 $") ne fonctionne pas avec les paramètres régionaux anglais.