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

Java Discussion :

BigDecimal(nbreàDécimales_String) accepte ',' plutôt que '.' comme séparateur des décimales.


Sujet :

Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    263
    Détails du profil
    Informations personnelles :
    Âge : 74
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2008
    Messages : 263
    Par défaut BigDecimal(nbreàDécimales_String) accepte ',' plutôt que '.' comme séparateur des décimales.
    Bonjour,

    Mon programme doit lire les données d'un fichier .csv, lequel contient des caractères constituées de nombres décimaux, au format "41" ou "87,50".

    Le séparateur de décimale est donc une virgule et non un point et celui-ci n'est pas toujours présent. Il n'y a pas d'intérêt ici pour un "séparateur de groupe", pour les milliers, les millions, les milliards ...

    Dans ma méthode de transformation des valeurs en champ de mesures (nombres à décimales) vers BigDecimal,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    BigDecimal bd = new BigDecimal(0,0f);
    génère une erreur NumberFormatException. Cette erreur n'apparaît plus s'il y a un '.' au lieu d'une ','.

    Mais les valeurs sont passées plutôt sous forme de chaîne de caractères. La première expression de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
            try
            {
                bd = new BigDecimal(champDeLigneCsv[1]);
                bd.setScale(1, BigDecimal.ROUND_DOWN).toString();
            } catch (NumberFormatException ex)
            {
                bd = null;
            } finally
            {
                mesPuiss.setMesPuissHPl(bd);
            }
    génère aussi 'NumberFormatException' lorsque le champs comporte un nombre à décimales, par exemple "87,65". Pas d'erreur si p.ex. "41".

    J'effectue à présent un essai avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        NumberFormat foNbre = NumberFormat.getNumberInstance(Locale.GERMAN);
        DecimalFormat foDéc = (DecimalFormat)foNbre;
    mais ça bloque.

    Ou bien devrais-je plutôt étudier la solution basée sur la classe 'DecimalFormatSymbols' ? A première vue pas car il ne s'agit pas de changer les symboles apparaissant dans les nombres formatés qui sont produits par une méthode 'format()'.

    Directions à essayer mais sans garantie d'aboutir : Problem while converting String to Bigdecimal

    Que faut-il programmer pour que des chaînes de caractères correspondant à de simples nombres à décimales, le séparateur de décimales ',' soit substitué au '.' ?

    Merci d'avance pour votre aide..

  2. #2
    Modérateur
    Avatar de Gugelhupf
    Homme Profil pro
    Analyste Programmeur
    Inscrit en
    Décembre 2011
    Messages
    1 326
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Analyste Programmeur

    Informations forums :
    Inscription : Décembre 2011
    Messages : 1 326
    Billets dans le blog
    12
    Par défaut
    ... peut-être un ptit coup de :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    if(maChaine.replace('.', ',').matches("^[0-9]+,?[0-9]+$")){
         BigDecimal d = new BigDecimal(maChaine);
    }
    Si un BigDecimal peut commencer par 0, et ne pas considérer ça comme un octal, ça devrait être OK.
    N'hésitez pas à consulter la FAQ Java, lire les cours et tutoriels Java, et à poser vos questions sur les forums d'entraide Java

    Ma page Developpez | Mon profil Linkedin | Vous souhaitez me contacter ? Contacter Gokan EKINCI

  3. #3
    Expert éminent
    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
    Billets dans le blog
    1
    Par défaut
    Salut,


    Le plus propre reste quand même d'utiliser un DecimalFormat associé à la bonne locale :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    	DecimalFormat df = (DecimalFormat) NumberFormat.getNumberInstance(Locale.FRANCE);
    	df.setParseBigDecimal(true);
     
    	BigDecimal bd = (BigDecimal) df.parse("87,50");

    a++

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    263
    Détails du profil
    Informations personnelles :
    Âge : 74
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2008
    Messages : 263
    Par défaut
    Merci bien, Gugelhupf et adiGupa, pour ces deux solutions qui fonctionnent.

    Gugelhupf, entretemps j'avais essayé avec un simple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    chDCar = champDeLigneCsv[1].replace(',', '.');
    , soit la version simplifiée de ta solution, et cela suffisait déjà.

    La solution de adiGupa exige de capter éventuellement 'parseException' :
    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
            NumberFormat foNbre = NumberFormat.getNumberInstance(Locale.FRANCE);
            DecimalFormat foDéc = (DecimalFormat)foNbre;
            foDéc.setParseBigDecimal(true);
     
            try
            {
                bd = (BigDecimal) foDéc.parse(champDeLigneCsv[1]);
                bd.setScale(1, BigDecimal.ROUND_DOWN).toString();
            } catch (ParseException ex)
            {
                bd = null;
            } finally
            {
                mesPuiss.setMesPuissHPl(bd);
            }
    Merci bien.

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 06/12/2012, 11h54
  2. [2.x] séparateur des décimales
    Par laupas dans le forum Symfony
    Réponses: 10
    Dernier message: 06/06/2012, 11h16
  3. Réponses: 7
    Dernier message: 01/09/2009, 20h24
  4. Récupérer le séparateur des décimales
    Par Dadou74 dans le forum Général JavaScript
    Réponses: 12
    Dernier message: 09/02/2007, 12h00
  5. Réponses: 3
    Dernier message: 11/11/2005, 11h59

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