Problème avec un formatage décimal [Résolu]

Messages postés
35
Date d'inscription
samedi 13 janvier 2018
Statut
Membre
Dernière intervention
24 mai 2019
- - Dernière réponse : Whismeril
Messages postés
13635
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
22 août 2019
- 6 mai 2019 à 16:23
Bonjour,

Je rencontre un petit problème avec un formatage d'un nombre :
Le séparateur décimal dans CurrentUICulture est la virgule "," (pas le point)
Là où cela coince, c'est le résultat obtenu avec la fonction suivante :

buffer ="6"
txt = Format(CDbl(buffer), "##0,0")
dans txt j'obtient ceci : "06" au lieu de "6,0"

Pourquoi ?
Afficher la suite 

3 réponses

Messages postés
35
Date d'inscription
samedi 13 janvier 2018
Statut
Membre
Dernière intervention
24 mai 2019
0
Merci
Pb résolu :
Bon apparemment la chaîne de formatage utilise le point décimal, quelque soit la culture.
par contre, les fonctions Cdbl (), etc... sont, elles sensibles à la culture.

Finalement je vais utiliser plutôt ceci :
txt = FormatNumber(buffer, DecimaleNb, TriState.True)
Commenter la réponse de Nardo26
Messages postés
13635
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
22 août 2019
298
0
Merci
Bonjour
Bon apparemment la chaîne de formatage utilise le point décimal, quelque soit la culture.

Oui, dans le code le symbole décimal est toujours le point.
Pour un double aussi
Dim toto as Double = 1.2


Au passage, tu remarqueras que ma ligne de code est en couleur, alors que tes lignes à toi ressemblent à un pavé gris. Pour utiliser correctement la coloration syntaxique merci de lire et d’appliquer ce qui est décrit ici https://codes-sources.commentcamarche.net/faq/11288-les-balises-de-code
Nardo26
Messages postés
35
Date d'inscription
samedi 13 janvier 2018
Statut
Membre
Dernière intervention
24 mai 2019
-
Oui, je n'avais pas fait attention au petit popup à côté du bouton code….
Merci de me le rappeler.

Dans le code, que le séparateur décimal d'une valeur numerique soit le point me parait normal, mais dans une chaine de caractère ?...

Ceci ne me parait pas très logique :
format("1,125", "##.00")
Commenter la réponse de Whismeril
Messages postés
13635
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
22 août 2019
298
0
Merci
Je pense que tu n'as pas activé Option Strict et Option Explicit, alors le compilateur fait un peu ce qu'il veut.
Dans la majorité des cas, ça fait ce que l'on pense.

En plus, Format et CBbl ne sont pas des instructions VB.Net, c'est du VB6.
Plus d'infos https://codes-sources.commentcamarche.net/faq/11151-pourquoi-mon-code-vb6-vba-ne-marche-pas-en-vb-net
Nardo26
Messages postés
35
Date d'inscription
samedi 13 janvier 2018
Statut
Membre
Dernière intervention
24 mai 2019
-
En aparté : Je viens d'activer ces deux options.
On ne peut pas dire que cela augmente grandement la lisibilité du code et facilite l'écriture de celui-ci.

Avant j'écrivais :

Private Sub TxbCfgPosPince_KeyUp(sender As Object, e As KeyEventArgs) Handles TxbCfgPosPince.KeyUp
  If e.KeyCode = Keys.Enter Then Config.SerragePince = CDbl(sender.Text)
End Sub

J'avoue que le
Cdbl(sender.text)
est moche mais tellement plus rapide à écrire que le code en dessous... ;)

Maintenant j'obtiens ceci (peut être qu'il existe une autre manière plus propre ?):

Private Sub TxbCfgPosPince_KeyUp(sender As Object, e As KeyEventArgs) Handles TxbCfgPosPince.KeyUp
  If e.KeyCode = Keys.Enter Then Config.SerragePince = Double.Parse(CType(sender, NumBox).Text)
End Sub

(note: en relisant, il faut aussi que je rajoute un 2eme paramètre sur le parse pour tenir compte de la culture)

Sans compter que je suis obligé de garder le sender en type object pour ne pas me faire jeter à cause d'une conversion de type implicite sur le délégué KeyEventHandler

Je continu à mettre à jour mon code et à plancher sur un autre pb concernant l'abandon du traitement d'un click sur une listView. Je pense que je vais ouvrir plus tard un autre post à ce sujet si je ne trouve pas de solution d'ici demain…

Merci de m'être venu en aide.
Whismeril
Messages postés
13635
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
22 août 2019
298 -
Si cette méthode n’est appelée que par un seul textbox, alors tu peux l’utiliser directement

If e.KeyCode = Keys.Enter Then Config.SerragePince = Double.Parse(TxbCfgPosPince.Text)


Si c’est une conversion que tu fais régulièrement, tu peux écrire des extensions de classe. Par exemple une extension de la classe objet, qui a pour paramètre le type de contrôle et qui retourne directement un double.

Ou plus simplement encore utiliser le binding, c’est lui qui gère les conversions.
Un petit tuto https://codes-sources.commentcamarche.net/faq/1291-utilisation-du-binding-au-travers-de-l-objet-databindingsource
Commenter la réponse de Whismeril