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

API standards et tierces Java Discussion :

Formater nombre décimal avec 1er chiffre significatif et dans la mesure du possible 2 décimales


Sujet :

API standards et tierces Java

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 38
    Points : 22
    Points
    22
    Par défaut Formater nombre décimal avec 1er chiffre significatif et dans la mesure du possible 2 décimales
    bonjour

    Je dois formatter des nombres décimaux avec toujours au moins le 1er chiffre significatif et, dans la mesure du possible, 2 décimales maxi seulement,

    Par exemple:
    10000.0001 => 10 000
    100.008 => 100.01
    0.01 => 0.01
    0.00001 => 0.0001

    Le tout devant bien sûr ête "locale dependent"...

    J'ai farfouillé DecimalFormat et le Formatter sans trouver mon bonheur.. Ai je raté quelque chose ? Avez vous d'autres pistes ?

    merci !

  2. #2
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    rien raté a priori, c'est juste pas dispnible tel quel. Vous allez devoir jouer avec plusieurs format et des if/else il me semble

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 38
    Points : 22
    Points
    22
    Par défaut
    Citation Envoyé par tchize_ Voir le message
    rien raté a priori, c'est juste pas dispnible tel quel. Vous allez devoir jouer avec plusieurs format et des if/else il me semble
    zut, pour une fois que je ne rate rien

    merci tout de même pour cette confirmation

    je ne suis pas expert apache commons et semblable (là encore une petite recherche n'a rien donné): savez vous si on peut y trouver une telle chose ?

  4. #4
    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,


    Une solution serait de vérifier le nombre de fractions affichable, et de modifier cela à la volée selon la valeur à formater :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
        public static String format(NumberFormat nf, double d) {
            // On récupère le nombre maximum de fractions :
            final int maxFraction = nf.getMaximumFractionDigits();
            // On calucle la valeur minimum positive affichable :
            final double min = 1.0 / Math.pow(10.0, maxFraction) ;
     
            final String result;
            // Si la valeur à formatter est comprise
            // entre cette valeur négative et positive :
            if ( -min < d && d < min ) {
                try {
                    // On modifie le nombre de fractions :
                    nf.setMaximumFractionDigits(Integer.MAX_VALUE);
                    // On formate la chaine :
                    result =  nf.format(d);
                } finally {
                    // On restaure le nombre de fractions :
                    nf.setMaximumFractionDigits(maxFraction);
                }
            } else {
                // Sinon on formate normalement :
                result = nf.format(d);
            }
            return result;
        }

    a++

  5. #5
    Expert éminent sénior
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Points : 12 977
    Points
    12 977
    Par défaut
    Cette transformation va probablement te forcer à passer par du BigDecimal avec un setScale(decimalCount, BigDecimal.ROUND_UP).
    C'ets en effet la seule façon de faire un arrondi montant systématique sans devoir tout se fader à la main.
    En effet les autres méthodes d'arrondi proposées dans java mettront ta valeur à 0.
    Hey, this is mine. That's mine. All this is mine. I'm claiming all this as mine. Except that bit. I don't want that bit. But all the rest of this is mine. Hey, this has been a really good day. I've eaten five times, I've slept six times, and I've made a lot of things mine. Tomorrow, I'm gonna see if I can't have sex with something.

  6. #6
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    pas que je sache, c'est un besoin spécifique à votre application, c'est la première fois que je vois un tel requis :-)

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 38
    Points : 22
    Points
    22
    Par défaut
    Citation Envoyé par adiGuba Voir le message
    Salut,


    Une solution serait de vérifier le nombre de fractions affichable, et de modifier cela à la volée selon la valeur à formater :
    merci

    @sinok:
    mon post initial est en fait erroné. Il faut lire:
    0.00001 => 0.00001

    désolé :$
    par contre l'histoire de l'arrondi est à vérifier avec NumberFormat

    @tchize_
    C'est bien possible en effet. Sacrés utilisateurs

  8. #8
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    a noter que pour déterminer la précision nécessaire, Math.log10(valeur) est utile

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 38
    Points : 22
    Points
    22
    Par défaut
    au final, ça donne ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
        public static String formatWithAtLeastOneMeaningfulNumber(final Locale locale, final int targetedDecimalNumber,
                final double value)
        {
            NumberFormat nf = NumberFormat.getInstance(locale);
            int effectiveDecimalNumber = targetedDecimalNumber;
            if ((value > -1) & (value < 1) & (value != 0))
            {
                double tempValue = Math.abs(value) * Math.pow(10, targetedDecimalNumber);
                while (tempValue < 1)
                {
                    tempValue *= 10;
                    effectiveDecimalNumber++;
                }
            }
            nf.setMaximumFractionDigits(effectiveDecimalNumber);
            return nf.format(value);
        }
    et ça passe ces tests:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
     
        public void testFormatWithAtLeastOneMeaningfulNumber() throws Exception
        {
            String output = StringHelper.formatWithAtLeastOneMeaningfulNumber(Locale.ENGLISH, 2, 10);
            assertEquals("10",output);
            output = StringHelper.formatWithAtLeastOneMeaningfulNumber(Locale.ENGLISH, 2, 0);
            assertEquals("0",output);
            output = StringHelper.formatWithAtLeastOneMeaningfulNumber(Locale.ENGLISH, 2, 10.1);
            assertEquals("10.1",output);
            output = StringHelper.formatWithAtLeastOneMeaningfulNumber(Locale.ENGLISH, 2, 0.1);
            assertEquals("0.1",output);
            output = StringHelper.formatWithAtLeastOneMeaningfulNumber(Locale.ENGLISH, 2, 0.0001);
            assertEquals("0.0001",output);
            output = StringHelper.formatWithAtLeastOneMeaningfulNumber(Locale.ENGLISH, 2, -0.1);
            assertEquals("-0.1",output);
            output = StringHelper.formatWithAtLeastOneMeaningfulNumber(Locale.ENGLISH, 2, -0.0001);
            assertEquals("-0.0001",output);
            output = StringHelper.formatWithAtLeastOneMeaningfulNumber(Locale.ENGLISH, 2, -10.0001);
            assertEquals("-10",output);
            output = StringHelper.formatWithAtLeastOneMeaningfulNumber(Locale.ENGLISH, 2, 10.008);
            assertEquals("10.01",output);
            output = StringHelper.formatWithAtLeastOneMeaningfulNumber(Locale.ENGLISH, 2, 10.001);
            assertEquals("10",output);
        }
    => adiguba: je n'ai pas bien compris ton code, d'où le mien plutôt différent.

    Tout éclairage bienvenu

  10. #10
    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
    Citation Envoyé par livenono Voir le message
    => adiguba: je n'ai pas bien compris ton code,
    J'utilise un NumberFormat par défaut, sauf pour les nombres qui ne peuvent pas y être affiché où j'affiche alors toutes les fractions...

    Tu n'as pas compris quoi en particulier ???

    Citation Envoyé par livenono Voir le message
    d'où le mien plutôt différent.
    Il n'y a pas de mal !!! Bien au contraire

    a++

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

Discussions similaires

  1. Nombres de chiffres significatif avec fortran
    Par VauRDeC dans le forum Fortran
    Réponses: 7
    Dernier message: 09/06/2012, 03h42
  2. Requête : Format Nombre avec 14 décimales !
    Par PascaLem dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 28/03/2009, 12h06
  3. Réponses: 1
    Dernier message: 21/04/2008, 16h00
  4. Comment formater le resultat avec 2 chiffres avec SUM de SQL
    Par sondo dans le forum Bases de données
    Réponses: 15
    Dernier message: 23/06/2006, 14h41
  5. Réponses: 3
    Dernier message: 10/02/2006, 15h31

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