Question 56

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