UN CDBL QUI GERE LES OPTIONS REGIONAL CONCERANT LE SEPARATEUR DECIMAL
Renfield
Messages postés17287Date d'inscriptionmercredi 2 janvier 2002StatutModérateurDernière intervention27 septembre 2021
-
17 déc. 2008 à 15:10
Renfield
Messages postés17287Date d'inscriptionmercredi 2 janvier 2002StatutModérateurDernière intervention27 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.
Renfield
Messages postés17287Date d'inscriptionmercredi 2 janvier 2002StatutModérateurDernière intervention27 septembre 202174 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és12Date d'inscriptionlundi 14 avril 2003StatutMembreDerniè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és218Date d'inscriptionmercredi 20 février 2008StatutMembreDernière intervention17 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és12Date d'inscriptionlundi 14 avril 2003StatutMembreDerniè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és17287Date d'inscriptionmercredi 2 janvier 2002StatutModérateurDernière intervention27 septembre 202174 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és10Date d'inscriptionvendredi 2 avril 2004StatutMembreDernière intervention18 décembre 2008 18 déc. 2008 à 07:53
je ne connaissais pas la fonction val.
Merci de cette info !!!
Renfield
Messages postés17287Date d'inscriptionmercredi 2 janvier 2002StatutModérateurDernière intervention27 septembre 202174 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
31 mai 2010 à 23:32
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.
31 mai 2010 à 15:32
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.
31 mai 2010 à 15:10
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
18 déc. 2008 à 14:48
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.
18 déc. 2008 à 08:16
En fait, beaucoup font un Replace ou ce genre de manipulation...
c'est dangereux...
18 déc. 2008 à 07:53
Merci de cette info !!!
17 déc. 2008 à 15:10
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