6
votes

Comment déterminer si une variante créée à partir d'une chaîne est un nombre entier?

Je cherche à déterminer si une variante créée à partir d'une chaîne est un nombre entier.

Voici un script de test: xxx

La msgbox apparaît, probablement parce que La variante a été créée à partir d'une chaîne, bien que j'aurais attendu v = rond (v).


1 commentaires

Cela pourrait être intéressant de vous demander si vous avez vraiment besoin de gérer une variante et tout autre nombre entier. Qu'en est-il d'une chaîne de 1000 chiffres? Qu'en est-il des doubles intégrés en dehors de la gamme d'une longue? Ce sera beaucoup plus facile si vous envisageez exactement ce dont vous avez besoin, puis de le code. Ce n'est pas le même problème, mais voir cette réponse par Eric Lippert sur une autre question ici sur Stackoverflow: Stackoverflow.com/Questions/921180/c-Round-up/926806#926806


4 Réponses :


9
votes

Vous devriez écrire quelque chose comme: xxx pré>

où CDBL est une fonction convertir toutes les données en un nombre à deux types. Vous devrez peut-être traiter des cas où v ne peuvent pas être convertis en un numéro avec la fonction ISnumeric () avant d'appeler la fonction CDBL. Vous pouvez même utiliser la fonction CINT pour vos comparaisons: P>

if isnumeric(v) then
    if cDbl(v) - cInt(v) <> 0 Then
    ....
    endif
else
   debug.print "data cannot be converted to a number"
endif


7 commentaires

Cela ne fonctionnera pas bien dans certains cas, par exemple: Dim V comme monnaie V = -123456.0000006


Eh bien, ma proposition a été davantage "écrire quelque chose comme ça" que "Ceci est garanti de la preuve de puces", mais l'idée principale est ici, même si cela nécessite des tests supplémentaires.


Je suis désolé, mais je dois dire -1, même étant donné votre mise en garde à propos de "quelque chose comme ça". L'une de vos réponses comme elles sont codées ont des bugs. Si vous présentez du code, cela devrait être correct et ne pas laisser trouver les bugs comme exercice.


Eh bien, je ne suis pas vraiment d'accord avec votre dernier point "Ne laissez pas de trouver des bugs comme un exercice". Fondamentalement, trouver des bugs est un exercice quotidien pour chacun de nous, car le code d'écriture avec des bugs est notre réalité quotidienne! Quai, la prochaine fois, j'ajouterai toutes les mentions légales pour indiquer que ma réponse est présentée «tel quel» et n'incluez aucune garantie d'aucune sorte pour l'utilisateur, qui semblait trouver ma réponse utile pour l'accepter.


-1 pour la défense au lieu d'améliorer. L'exemple est bien si vous utilisez simplement l'ICLNG au lieu de cint


... et je devrais également ajouter que je n'abandonne aucun de mes droits, parmi eux le droit de défendre ma position, lors de la publication des réponses et des commentaires sur Stackoverflow! Désolé gars mais je trouve vraiment votre position "offensée" assez excessive. Et si vous avez une meilleure réponse ou une meilleure proposition que la mienne, pourquoi ne le postez-vous pas?


@Philippegrondier Après avoir lu les commentaires que je suis déçu que les gens osaient descendre votre excellente réponse. Vous avez répondu à ma question dans l'Esprit dont j'avais besoin et je suis complètement heureux avec ça.



3
votes
Sub test()

    Dim v As Variant
    v = "42"
    If Val(v) <> Int(Val(v)) Then
       MsgBox ("<>")
    End If

End Sub
If you use Val(), it will try its best to convert to a number.  If it can't, it will return zero and Val(v) will always equal Int(Val(v)) in that case.

0 commentaires

0
votes

Qu'en est-il de vérifier que la fonction de plancher correspond à la fonction de plafond? XXX

J'ai eu un problème similaire et ce code fonctionne pour moi.


0 commentaires

0
votes

J'aime utiliser le truc simple +0 si je soupçonne que les numéros peuvent entrer en tant que chaîne. Par exemple pour index / correspondance de choses. Comme: xxx

ceci devrait fonctionner pour les dates, le texte, les numéros, les nombres en tant que texte. Je ne sais pas si ou quand cela se casse, devrait aller bien.


0 commentaires