Un cdbl qui gere les options regional concerant le separateur decimal

Soyez le premier à donner votre avis sur cette source.

Snippet vu 6 307 fois - Téléchargée 18 fois

Contenu du snippet

j'ai des machine paramétré avec le '.' en séparateur décimal, d'autre avec une ','.
J'ai aussi des données entré avec des '.' ou des ','.
j'ai donc crée un fonction de conversion en double qui s'affranchit de se séparateur.
attention cette fonction ne gère pas le séparateur des milliers.

Source / Exemple :


' Fonction de conversion en double personnalisé

Public Function MyCDbl(str As String) As Double
'on remplace le . ou la , par le separateur decimal en vigueur
    Dim strt As String
    Dim Sep As String
    Dim i As Integer

    If IsNumeric(str) Then
        'La machine sait déjà le convertir alors go !!
        MyCDbl = CDbl(str)
    Else
        'je trouve le séparateur de la machine
        Sep = Mid(Format(1 / 2, ""), 2, 1)
        'je recherche le séparateur dans la chaine
        Select Case Sep
        Case "."
            i = InStr(1, str, ",")
        Case ","
            i = InStr(1, str, ".")
        End Select

        If i = 0 Then     
            'il n y a pas de séparateur dans la chaine , ce n'est donc pas un nombre 
            MyCDbl = Empty
        Else
            strt = Mid(str, 1, i - 1) & Sep & Mid(str, i + 1)
            '  on a remplacer le séparateur décimal
            If IsNumeric(strt) Then
                'gagné , c'est un nombre !!!
                MyCDbl = CDbl(strt)
            Else
                'on revoit empty, je ne sais pas le convertir
                MyCDbl = Empty
            End If
        End If
    End If

End Function

Conclusion :


ce code me sert deja pas mal ...

A voir également

Ajouter un commentaire

Commentaires

Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
66
A noter, marcA, qu'il FAUT enregistrer les donnees en un format independant des parametres regionnaux

donc bien avec un . comme separateur decimal

les parametres regionnaux ne sdoivent exclusivement servir qu'a la representation textuelle des donnees, a destination des utilisateurs, a l'affichage ou a l'impression.
Messages postés
12
Date d'inscription
lundi 14 avril 2003
Statut
Membre
Dernière intervention
3 août 2010

Bonjour,

C'est normal, ces fonctions ont pour but de corriger des erreurs d'encodage pour les clients qui ne respectent pas les paramètres régionaux (par exemple un client dit que la virgule est utilisée comme séparateur des décimales mais utilise le point an réalité.
Dans votre cas, les deux symboles sont utilisés donc ces fonctions sont inutilisables.
Si les paramètres régionaux de l'utilisateur sont respectés, un simple Cdbl est suffisant.
Messages postés
218
Date d'inscription
mercredi 20 février 2008
Statut
Membre
Dernière intervention
17 mars 2012

Bonjour,

un problème se pose pour les nombres supérieur a millecar 1 000,1 en français 1.000,1 aux USA 1,000.1 en belgique
Messages postés
12
Date d'inscription
lundi 14 avril 2003
Statut
Membre
Dernière intervention
3 août 2010

Bonjour,

Avec le symbole décimale sur la "," et le symbole de groupement des chiffres en ".", Isnumeric ("3,5"), et Isnumeric (3.5) fonctionnent tous les deux. On ne peut pas utiliser Isnumeric pour récupérer la valeur.
Val ("3,5") donne 3.0
Val ("3.5") domme 3.5 (correct)
Par contre, Cdbl("3,5") donne 3.5 (correct)
et Cdbl("3.5") donne 35.0.


personellement, je fais quelque chose ainsi (et je n'ai jamais eu de problème pour le moment)
Ma fonction est faite pour des singles.
J'utilise le fait que quand on fait un Val, si le symbole ne plait pas à .NET , la partie décimale est perdue, et dans l'autre cas, on garde la partie décimale. La valeur dont le string est la plus longue est la bonne valeur.

Public Function ChgSng2(ByVal astr_Val As String) As Single
' If InStr(zahl, ",") Then
' CHGSNG = CSng(zahl)
' Else
' CHGSNG = CSng(Val(zahl))
' End If
Dim a, B As Single

a = CSng(Val(Replace(astr_Val, ".", ",")))
B = CSng(Val(Replace(astr_Val, ",", ".")))

If a.ToString.Length > B.ToString.Length Then
Return a
Else
Return B
End If

End Function


On peut aussi utiliser la valeur suivante en .NET

Public KeyDecimal As Char = CChar(System.Globalization.NumberFormatInfo.CurrentInfo.NumberDecimalSeparator)
Puis, on fait un replace de l'autre symbole par celui ci
Je n'ai jamais pu tester cette méthode.
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
66
pas de soucis.
En fait, beaucoup font un Replace ou ce genre de manipulation...
c'est dangereux...
Afficher les 7 commentaires

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.