UN CDBL QUI GERE LES OPTIONS REGIONAL CONCERANT LE SEPARATEUR DECIMAL

Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 - 17 déc. 2008 à 15:10
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 - 31 mai 2010 à 23:32
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/48731-un-cdbl-qui-gere-les-options-regional-concerant-le-separateur-decimal

Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
31 mai 2010 à 23:32
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.
cs_marcA Messages postés 12 Date d'inscription lundi 14 avril 2003 Statut Membre Dernière intervention 3 août 2010
31 mai 2010 à 15:32
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.
l0r3nz1 Messages postés 218 Date d'inscription mercredi 20 février 2008 Statut Membre Dernière intervention 17 mars 2012
31 mai 2010 à 15:10
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
cs_marcA Messages postés 12 Date d'inscription lundi 14 avril 2003 Statut Membre Dernière intervention 3 août 2010
18 déc. 2008 à 14:48
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.
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
18 déc. 2008 à 08:16
pas de soucis.
En fait, beaucoup font un Replace ou ce genre de manipulation...
c'est dangereux...
Nic0s Messages postés 10 Date d'inscription vendredi 2 avril 2004 Statut Membre Dernière intervention 18 décembre 2008
18 déc. 2008 à 07:53
je ne connaissais pas la fonction val.
Merci de cette info !!!
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
17 déc. 2008 à 15:10
trop de code...

soit c'est un numérique,
soit c'est un format international et il faut alors utiliser Val

pas besoin de manipuler ta chaîne:

Public Function MyCDbl(str As String) As Double
If IsNumeric(str) Then
'La machine sait déjà le convertir alors go !!
MyCDbl = CDbl(str)
Else
MyCDbl = Val(str)
End If
End Function
Rejoignez-nous