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

avec Java Discussion :

problème decimalFormat avec long


Sujet :

avec Java

  1. #1
    Membre habitué
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2005
    Messages
    489
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Janvier 2005
    Messages : 489
    Points : 171
    Points
    171
    Par défaut problème decimalFormat avec long
    Bonjour,
    voilà, je rencontre un peu problème un peu con, je n'arrive pas à formater mon montant comme je le souhaite.

    voici mon code, ce sera plus parlant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    long price = 55070;
    NumberFormat formatter = new DecimalFormat("#0,00");
    String fprice = formatter.format(price);
    Le résultat obtenu est : 5,50,70

    Je ne comprends pas comment j'obtiens ce résultat, ni obtenir le bon (550,70).

    Auriez vous une idée ?

    Merci.
    Vince

  2. #2
    Rédacteur/Modérateur
    Avatar de andry.aime
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    8 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Ile Maurice

    Informations forums :
    Inscription : Septembre 2007
    Messages : 8 391
    Points : 15 059
    Points
    15 059
    Par défaut
    Bonjour,

    Un DecimalFormater sert à formater un nombre avec décimal, mais pas un entier. Si tu veux avoir deux chiffre après la virgule en utilisant "," comme séparateur de décimale, tu dois utiliser un Local.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    double price = 5504546.54;
    NumberFormat nf = NumberFormat.getNumberInstance(Locale.FRANCE);
    DecimalFormat df = (DecimalFormat)nf;
    df.applyPattern("###,###.###");
    String output = df.format(price);
    System.out.println(output);
    Tu auras quelque chose du genre 5 504 546,54.
    Sinon, tu peux nous expliquer le format que tu cherches? Partir d'un entier pour avoir un nombre avec virgule, si tu as plus de 5 chiffres, ...

    A+.

  3. #3
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 559
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 559
    Points : 21 621
    Points
    21 621
    Par défaut
    Bah, partir d'un entier pour afficher un nombre à virgule, c'est en général ce qu'on fait pour les prix -_-°.
    Un prix est un nombre entier de centimes, mais affiché comme un nombre décimal d'euros, avec deux chiffres après la virgule.

    DecimalFormat ne gère pas cela, à moins d'utiliser un BigDecimal pour représenter le prix (nombre à virgule fixe, en l'occurrence deux chiffres après la virgule.) C'est un peu trop compliqué à mon goût.
    En principe il faudrait utiliser NumberFormat.getCurrencyInstance() qui sert exactement à ça. Je ne me rappelle plus pourquoi je ne m'en sers pas.
    Moi personnellement, j'utilise ma propre classe pour afficher l'entier à au moins trois chiffres, et une virgule avant les centimes (plus une gestion des prix de moins d'1 euro.)

  4. #4
    Membre habitué
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2005
    Messages
    489
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Janvier 2005
    Messages : 489
    Points : 171
    Points
    171
    Par défaut
    c'est effectivement un prix que je veux afficher.
    nous les stockons et les transmettons en centimes, mais pour l'affiche, on le formate correctement, du moins on essaie.
    je ne connais pas le nombre de chiffres à l'avance
    Avez-vous une solution ?
    merci

  5. #5
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 559
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 559
    Points : 21 621
    Points
    21 621
    Par défaut
    Sauf erreur dans mes calculs, il suffit de diviser par 100.0 la valeur affichée, et de demander d'afficher exactement deux chiffres après la virgule.

    À moins que vous ayez à afficher des prix de l'ordre du million de milliards de [monnaie utilisée], les calculs flottants double précision feront toujours un arrondi exact à la deuxième décimale près.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    long price = 55070;
    NumberFormat formatter = new DecimalFormat("0.00");
    String fprice = formatter.format(price/100.0);
    Ou sinon, ma méthode à moi, c'est d'afficher le nombre entier avec au minimum trois chiffres, et d'insérer ensuite une virgule devant les deux derniers :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    long price = 55070;
    NumberFormat formatter = new DecimalFormat("000");
    String fprice = formatter.format(price);
    fprice = fprice.subString(0, fprice.length()-2) + ',' + fprice.subString(fprice.length()-2)

  6. #6
    Membre habitué
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2005
    Messages
    489
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Janvier 2005
    Messages : 489
    Points : 171
    Points
    171
    Par défaut
    c'est triste à dire, mais j'ai opté pour le formatage d'un string...
    et ça fonctionne très bien

  7. #7
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 559
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 559
    Points : 21 621
    Points
    21 621
    Par défaut
    Citation Envoyé par vince29 Voir le message
    et ça fonctionne très bien
    Oui certes, mais enfin le but c'est un peu de pas s'emmerder, quoi.

  8. #8
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Salut,

    Citation Envoyé par vince29 Voir le message
    c'est triste à dire, mais j'ai opté pour le formatage d'un string...
    et ça fonctionne très bien
    C'est on format qui n'est pas correct : "#0,00"
    En effet la virgule représente un séparateur entre chiffres. Avec ce format tu indiques que tu veux un séparateur tous les 2 chiffres.

    Et comme tu dois utiliser une locale anglaise, ce séparateur est une virgule...


    • Tu dois utiliser le point "." pour représenter le séparateur entre la partie entière et décimale.
    • Attention également à la locale. Sauf si tu sais ce que tu fais il est préférable de la préciser explicitement.


    Bref new DecimalFormat("#0.00") devrait faire l'affaire...


    A noter qu'on peut faire la même chose avec String.format() (même remarque pour la locale) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    String text = String.format("%.2f", price/100.0);

    a++

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

Discussions similaires

  1. Problème Locate avec espaces
    Par Clezio dans le forum Bases de données
    Réponses: 2
    Dernier message: 10/03/2004, 19h06
  2. Problème mémoire avec une dll par chargement dynamique
    Par widze19 dans le forum C++Builder
    Réponses: 6
    Dernier message: 15/12/2003, 13h20
  3. problèmes bizarres avec jdbc
    Par jaimepasteevy dans le forum PostgreSQL
    Réponses: 8
    Dernier message: 12/12/2003, 12h00
  4. Problème requête avec UNION et ORDER BY
    Par Yann21 dans le forum Langage SQL
    Réponses: 12
    Dernier message: 12/12/2003, 11h02
  5. problème JSP avec JBuilder et Weblogic 7
    Par viny dans le forum JBuilder
    Réponses: 2
    Dernier message: 24/04/2003, 08h07

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