IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

Formatage d'un type double avec ToString(string format)


Sujet :

C#

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Août 2004
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 26
    Par défaut Formatage d'un type double avec ToString(string format)
    Bonjour à tous,
    Je cherche à formater de manière uniforme les nombreux montants présents dans mon application de cette manière :
    - deux chiffres après la virgule (exemple : 123,46 ou 123,00)
    - séparation des milliers (exemple : 1 234,56 ou 1 234 567,00)

    Après plusieurs recherches je suis arrivé au format "#,#.00", qui marche pas trop mal, à une exception, les montants de type 0,23 s'affichent ",23" (sans le zéro). Je force le zéro à gauche de la chaîne de formatage ("0#,#.00" ou encore "#0,#.00"), non satisfaisant car j'obtiens "00,23".

    Je sollicite donc votre aide !

    Merci d'avance

  2. #2
    Membre Expert Avatar de Guulh
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    2 160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2007
    Messages : 2 160
    Par défaut
    Ah, je suis pas le seul à avoir eu ce problème J'avais fouillé google partout, mais rien trouvé. Pourtant, afficher un nombre décimal avec une précision max définie à l'avance (pour faire sauter les artefacts du style 1,6000000001 inhérents à l'imprécision des double) me semblait être un besoin relativement simple...

    Je m'en étais tiré avec ça : #,##0.### (dans le cas où tu veux trois décimales max après la virgule). Ca doit mal passer l'internationalisation à l'Inde ou au Japon, qui regroupent pas les nombres > 1000 de la même façon, mais bon :p

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Août 2004
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 26
    Par défaut
    Citation Envoyé par Guulh Voir le message
    Ah, je suis pas le seul à avoir eu ce problème J'avais fouillé google partout, mais rien trouvé. Pourtant, afficher un nombre décimal avec une précision max définie à l'avance (pour faire sauter les artefacts du style 1,6000000001 inhérents à l'imprécision des double) me semblait être un besoin relativement simple...

    Je m'en étais tiré avec ça : #,##0.### (dans le cas où tu veux trois décimales max après la virgule). Ca doit mal passer l'internationalisation à l'Inde ou au Japon, qui regroupent pas les nombres > 1000 de la même façon, mais bon :p
    J'ai testé ton format, en l'ayant un petit peu modifié, "#,##0.00", car j'ai besoin que les entiers soit affichés avec deux décimales (avec ton format, 123 s'écrit...123 et pas 123,00). Sinon j'ai bien "0,12" qui s'affiche correctement.

    Il reste un souci...
    123456789.12 s'affiche 123 456 789,12 --> OK
    par contre, 123456789123456.12 s'affiche 123 456 789 123 456,00 (les deux décimales disparaissent)
    Et encore mieux, 123456789123456789.12 s'affche 123 456 789 123 457 000,00 (le 6 disparaît, ca termine par des zéros...)

    Un truc de fou non ??!!

  4. #4
    Membre Expert Avatar de Guulh
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    2 160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2007
    Messages : 2 160
    Par défaut
    Ah, j'avais mal lu.

    Tu veux avoir toujours deux décimales ?

    A ce moment là, pas besoin de chaîne custom : utilise le format N2.
    cf la doc : http://msdn.microsoft.com/fr-fr/library/dwhawy9k.aspx

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Août 2004
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 26
    Par défaut
    Citation Envoyé par Guulh Voir le message
    Ah, j'avais mal lu.

    Tu veux avoir toujours deux décimales ?

    A ce moment là, pas besoin de chaîne custom : utilise le format N2.
    cf la doc : http://msdn.microsoft.com/fr-fr/library/dwhawy9k.aspx
    Le format N2 est quasi-parfait! La seule erreur qui subsiste est le formatage des grands nombres : 1234567891234.56 est bien formaté (1 234 567 891 234,56), mais 12345678912345.67 me donne 12 345 678 912 345,70 (perte du 6 et décalage du 7), et 123456789123456.78 donne 123 456 789 123 457,00 (même remarque).

    On dirait qu'avec des nombres de plus de 13 chiffres dans la partie entière ca ne fonctionne plus. Bon c'est pas trop grave, je n'aurai sûrement jamais de nombres si grands. ais j'aimerais bien comprendre !

  6. #6
    Membre expérimenté
    Avatar de StormimOn
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2005
    Messages
    2 593
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2005
    Messages : 2 593
    Par défaut
    A mon avis c'est parce que tes montants sont soit en float / double alors que tu devrais utiliser le type decimal, qui est justement prévu pour ce genre de choses (pas de problème d'arrondis lié à la précision des float/double, ...)

    Ceci fonctionne très bien par exemple
    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    decimal d = 123456789123456.78897987456M;
    string s = d.ToString("n2");

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Août 2004
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 26
    Par défaut
    Citation Envoyé par StormimOn Voir le message
    A mon avis c'est parce que tes montants sont soit en float / double alors que tu devrais utiliser le type decimal, qui est justement prévu pour ce genre de choses (pas de problème d'arrondis lié à la précision des float/double, ...)

    Ceci fonctionne très bien par exemple
    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    decimal d = 123456789123456.78897987456M;
    string s = d.ToString("n2");
    effectivement j'ai des double. Je vais me contenter de ce formatage, de toute façon je n'aurai jamais de nb aussi grands.

    Merci beaucoup !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 9
    Dernier message: 19/04/2013, 16h46
  2. Réponses: 6
    Dernier message: 22/04/2010, 15h56
  3. arrondi avec type double
    Par la drogue c'est mal dans le forum MFC
    Réponses: 6
    Dernier message: 08/04/2005, 17h51
  4. [VB.NET] Variable de type enum avec du string
    Par Mouse dans le forum Windows Forms
    Réponses: 4
    Dernier message: 13/01/2005, 18h22
  5. [LG]Convertir le type double en string
    Par @tom@ dans le forum Langage
    Réponses: 8
    Dernier message: 18/01/2004, 19h20

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo