Problème avec un formatage décimal

Résolu
Nardo26 Messages postés 37 Date d'inscription samedi 13 janvier 2018 Statut Membre Dernière intervention 1 mars 2021 - 4 mai 2019 à 22:36
Whismeril Messages postés 19025 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 19 avril 2024 - 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 ?
A voir également:

3 réponses

Nardo26 Messages postés 37 Date d'inscription samedi 13 janvier 2018 Statut Membre Dernière intervention 1 mars 2021
5 mai 2019 à 00:00
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)
0
Whismeril Messages postés 19025 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 19 avril 2024 656
5 mai 2019 à 09:21
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
0
Nardo26 Messages postés 37 Date d'inscription samedi 13 janvier 2018 Statut Membre Dernière intervention 1 mars 2021
Modifié le 5 mai 2019 à 10:39
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")
0
Whismeril Messages postés 19025 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 19 avril 2024 656
5 mai 2019 à 17:32
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
0
Nardo26 Messages postés 37 Date d'inscription samedi 13 janvier 2018 Statut Membre Dernière intervention 1 mars 2021
Modifié le 6 mai 2019 à 15:32
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.
0
Whismeril Messages postés 19025 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 19 avril 2024 656
6 mai 2019 à 16:23
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
0
Rejoignez-nous