Comment convertir une chaîne en nombre indépendamment des séparateurs décimaux et milliers ?
Pour convertir une chaîne de caractères en son équivalent numérique, il
existe 2 méthodes :
- La fonction Val() qui impose d'avoir un point (.) comme séparateur
décimal et qui stoppe la conversion dès qu'elle rencontre un caractère
non numérique. De ce fait, quand on lui demande de convertir la chaîne
"15,3", elle renvoie le nombre 15 !
- Les fonctions Cxxx() (ex. CDbl(), CInt(), CLng(), CSng(), etc.) utilisent
quand à elles, le séparateur décimal défini dans le panneau de
configuration de Windows, et quand on leur demande de convertir une chaîne
avec un autre séparateur, elles génèrent une erreur de type non conforme.
Par exemple, si l'utilisateur a choisi la virgule comme séparateur et veut
quand même utiliser le point du clavier numérique, ou bien, si les
données sont stockées dans un fichier texte et qu'on les relit après
avoir changé ledit séparateur.
Gauthier Brière a donc écrit une fonction de conversion indépendante du
séparateur choisi par l'utilisateur.
Le principe de la fonction MyVal() consiste à remplacer dans la chaîne à
traiter le séparateur décimal par un point et à supprimer le séparateur des
milliers, puis à appeler la fonction Val() pour renvoyer la bonne valeur
numérique.
'----------------------------------------------------------------------
' Conversion String -> Nombre quelque soit le séparateur décimal ou de
' millier contenu dans le texte d'origine.
'----------------------------------------------------------------------
' Comme Val ne marche pas avec les symboles décimaux, et que C*()
' Renvoient une erreur de type si le séparateur n'est pas le bon :
' Appel de la fonction Val après avoir transformé les éventuels
' séparateurs en simple point décimal et éliminé les séparateurs
' de milliers.
'----------------------------------------------------------------------
Public Function MyVal(Chaine As Variant) As Variant
Dim strTmp As String, charTmp As String
Dim I As Long
Dim SepDecimal As String, SepMillier As String
SepDecimal = Format$(0, ".")
SepMillier = Mid$(Format$(1000, "0 000"), 2, 1)
strTmp = ""
If IsNull(Chaine) Then
MyVal = Null
Exit Function
End If
For I = 1 To Len(Chaine)
charTmp = Mid(Chaine, I, 1)
If Asc(charTmp) >= 48 And Asc(charTmp)
<= 57 Then
' C'est un
chiffre, on le traite.
strTmp =
strTmp & charTmp
ElseIf charTmp = "+" Or
charTmp = "-" Then
' Le signe...
strTmp =
strTmp & charTmp
ElseIf charTmp = "," Or
charTmp = "." Or charTmp = SepDecimal Then
' La virgule,
le point ou un autre séparateur, même combat !
strTmp =
strTmp & "."
ElseIf charTmp = " " Or
charTmp = Chr$(160) Or charTmp = SepMillier Then
' Séparateur
de milliers éliminé
Else
' Fin de la
boucle au premier
' caractère
non numérique comme le fait normalement
' la fonction
Val().
Exit For
End If
Next
MyVal = Val(strTmp)
End Function
Voici un exemple d'utilisation de cette fonction :
Dim Nombre as Long
Nombre = MyVal(Text1.text) Voir aussi : |
Date de publication : 07 juillet 2002
Dernière modification : 07 juillet 2002
Rubriques : Math
Mots-clés : conversion, nombre, convertir, séparateurs, décimales, milliers, virgule, point, paramètres régionaux, val |