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

Collection et Stream Java Discussion :

[NumberFormat] : utilisation de la methode parse()


Sujet :

Collection et Stream Java

  1. #1
    Membre à l'essai
    Inscrit en
    Août 2004
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 21
    Points : 14
    Points
    14
    Par défaut [NumberFormat] : utilisation de la methode parse()
    Bonjour

    Je souhaite convertir une chaine en double ; j'essaie d'utiliser et d'adapter le code donné sur ce site (dans la faq java) mais ça ne marche pas

    Voici mon code :
    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
    	public static final double stringToDouble(String chaine,int minIntDigits,int minFractionDigits,int maxFractionDigits,boolean isGroupingUsed) {
    	    if (isVide(chaine)) {
    	        return 0d;
    	    }
    	    NumberFormat formatNombre = getFormatNombre(minIntDigits,minFractionDigits,maxFractionDigits,isGroupingUsed);
    	    double valRet=VAL_NEG_MIN_DOUBLE;
    	    try {
    		    String parse=formatNombre.parse(chaine).toString();
    	        System.out.println("formatNombre.parse("+chaine+") = '"+parse+"'");
    	        valRet =  formatNombre.parse(chaine).doubleValue();
    	    } catch (Exception e) {
    			System.out.println("ERREUR 'ApplicationUtil.stringToDouble' : conversion de la chaine '"+chaine+" impossible !");	        
    	    }
    	    return valRet;
    	}
    si chaine vaut "1 200,00", la methode formatNombre.parse(chaine) me renvoie 1 alors que j'aimerais avoir 1200

    Ou est l'erreur ?

    Merci d'avance pour vos éclaircissements

  2. #2
    Membre actif Avatar de bidi
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    262
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2004
    Messages : 262
    Points : 266
    Points
    266
    Par défaut
    essaye plutôt

    Double.parseDouble(chaine);

    ;-)

  3. #3
    Membre à l'essai
    Inscrit en
    Août 2004
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 21
    Points : 14
    Points
    14
    Par défaut
    Citation Envoyé par bidi
    essaye plutôt

    Double.parseDouble(chaine);

    ;-)
    cela me génère une exception !

  4. #4
    Membre actif Avatar de bidi
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    262
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2004
    Messages : 262
    Points : 266
    Points
    266
    Par défaut
    c parceque tu a un espace dans ta string g l'impression...
    "1 200,00".

  5. #5
    Membre actif Avatar de bidi
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    262
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2004
    Messages : 262
    Points : 266
    Points
    266
    Par défaut
    ha non tiens, c parceque le séparateur pour les décimales doit être un point et pas une virgule

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    42
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 42
    Points : 44
    Points
    44
    Par défaut
    Avec le "Double.parseDouble(chaine);" il faut que tu enlève avant les espaces dans ta chaine de caractère et que tu remplaces la virgule par un point.

    Et oublie par de gérer l'exception "NumberFormatException"

  7. #7
    Membre éprouvé
    Profil pro
    Architecte technique
    Inscrit en
    Mars 2002
    Messages
    966
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France

    Informations professionnelles :
    Activité : Architecte technique

    Informations forums :
    Inscription : Mars 2002
    Messages : 966
    Points : 1 085
    Points
    1 085
    Par défaut
    Quels sont tes delimiteur de groupe et délimiteur décimal...

    Il te renvoie 1 parceque je penque que tu n'utilises pas le bon délimiteur...

    Secundo le doubleValue() est une très mauvaise idée car tu perds de la précision (arrondis du double)...

  8. #8
    Membre éprouvé
    Profil pro
    Architecte technique
    Inscrit en
    Mars 2002
    Messages
    966
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France

    Informations professionnelles :
    Activité : Architecte technique

    Informations forums :
    Inscription : Mars 2002
    Messages : 966
    Points : 1 085
    Points
    1 085
    Par défaut
    Citation Envoyé par jemini_fr
    Avec le "Double.parseDouble(chaine);" il faut que tu enlève avant les espaces dans ta chaine de caractère et que tu remplaces la virgule par un point.

    Et oublie par de gérer l'exception "NumberFormatException"
    Solution stupide à mon avis...

    Ce qui reviens exactement à utiliser un DecimalFormat (je pense que c'est à peu près de choses ce qu'il doit faire)...

  9. #9
    Membre à l'essai
    Inscrit en
    Août 2004
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 21
    Points : 14
    Points
    14
    Par défaut
    Citation Envoyé par bidi
    c parceque tu a un espace dans ta string g l'impression...
    "1 200,00".
    Oui, je pense cela aussi ; mais comment peut on donc convertir en double une chaine représentant un nombre "localisé"

    Pour information :
    la chaine que je passe en arguments de cette fonction provient d'un formulaire html/struts ;
    Cette chaine a été initialisée à partir d'une valeur d'un double (issu d'un champ d'une table de B.D.) et ce en utilisant le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    public static final String doubleToString(double nombre,int minIntDigits,int minFractionDigits,int maxFractionDigits,boolean isGroupingUsed) {
    	    String valRet="";
    	    if (nombre==0) {
    	        return "";
    	    }
    	    NumberFormat formatNombre = getFormatNombre(minIntDigits,minFractionDigits,maxFractionDigits,isGroupingUsed);
    		return formatNombre.format(nombre);
     
    	}
    Mon idée était de partager l'objet formatNombre (instance de NumberFormat) dans les 2 méthodes de conversion (double vers String et vice-versa) ; mais ca marche pas !

  10. #10
    Membre éprouvé
    Profil pro
    Architecte technique
    Inscrit en
    Mars 2002
    Messages
    966
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France

    Informations professionnelles :
    Activité : Architecte technique

    Informations forums :
    Inscription : Mars 2002
    Messages : 966
    Points : 1 085
    Points
    1 085
    Par défaut
    Moi j'ai eu ce problème venant de struts :

    - soit tes délimiteurs ne sont pas bon (ils dépendent de la Locale), don utilise DecimalFormatSymbols pour les forcer...

    - et si ça ne marche pas c'est que tu as un espace insécable   (A0) au lieu d'un espace (20). Cela m'arrivais souvent quand je générais une page et que je la postais avec struts, alor j'ai écris mon parseur de Decimal...

    De plus pourquoi ne pas créer un NumberFormat à chaque fois ???

    A+

    8)

  11. #11
    Membre éprouvé
    Profil pro
    Architecte technique
    Inscrit en
    Mars 2002
    Messages
    966
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France

    Informations professionnelles :
    Activité : Architecte technique

    Informations forums :
    Inscription : Mars 2002
    Messages : 966
    Points : 1 085
    Points
    1 085
    Par défaut
    Exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    DecimalFormat formatter = new DecimalFormat("###,##0.00");
    DecimalFormatSymbols symbols = new DecimalFormatSymbols();
    symbols.setDecimalSeparator(',');
    symbols.setGroupingSeparator(' ');
    formatter.setDecimalFormatSymbols(symbols);
    formatter.parse(...);

  12. #12
    Membre à l'essai
    Inscrit en
    Août 2004
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 21
    Points : 14
    Points
    14
    Par défaut
    Citation Envoyé par thibaut
    Exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    DecimalFormat formatter = new DecimalFormat("###,##0.00");
    DecimalFormatSymbols symbols = new DecimalFormatSymbols();
    symbols.setDecimalSeparator(',');
    symbols.setGroupingSeparator(' ');
    formatter.setDecimalFormatSymbols(symbols);
    formatter.parse(...);
    Ok ; ca marche ; merci beaucoup

    Par contre, pour faire la conversion, ma méthode finale est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    formatNombre.parse(chaine).doubleValue();

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

Discussions similaires

  1. utilisation de la methode random
    Par jiji83 dans le forum Langage
    Réponses: 2
    Dernier message: 21/02/2007, 03h25
  2. Réponses: 1
    Dernier message: 01/02/2007, 12h57
  3. [debutant] Utiliser String et methodes
    Par jcaspar dans le forum Langage
    Réponses: 1
    Dernier message: 21/12/2006, 12h07
  4. [POO] Utilisation d'une methode
    Par chtom dans le forum Langage
    Réponses: 2
    Dernier message: 21/11/2006, 14h47

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