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 :

Convertir une chaine de caractères en nombre décimal


Sujet :

API standards et tierces Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    8
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Mars 2008
    Messages : 8
    Par défaut Convertir une chaine de caractères en nombre décimal
    Bonjour à tous,
    Je rencontre actuellement un problème lors de la lecture d'un nombre saisie par un utilisateur (via un formulaire d'une application web). En effet, l'utilisateur doit pouvoir rentrer un nombre décimal avec un point ou une virgule comme séparateur décimal.

    Dans un premier temps, j'avais réalisé la méthode suivante pour réaliser la conversion de la saisie :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    	public static double parse(String priceformated) throws BusinessException {
    		double result;
    		try {
    			DecimalFormat decimaleFormat = new DecimalFormat("0.00");
    			Number number = decimaleFormat.parse(priceformated);
    			result = number.doubleValue();
    		} catch (ParseException ex) {
    			throw new BusinessException(ex);
    		}
    		return result;
    	}
    Avec cette méthode, les saisies utilisant une virgule comme séparateur sont bien interprétées. Mais si on saisie "10.5" en paramètre, on récupère en sortie un double valant 10.0. Bref, la partie décimale est ignorée si on emploie le point comme séparateur.

    J'ai donc essayé la méthode suivante :
    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 double parse(String priceformated) throws BusinessException {
    		double result;
    		try {
    			char separateurVirgule = ',';
    			NumberFormat nf = (priceformated.indexOf(separateurVirgule) == -1)?NumberFormat.getInstance(Locale.ENGLISH):NumberFormat.getInstance(Locale.FRENCH);
    			Number number = nf.parse(priceformated);
    //			DecimalFormat decimaleFormat = new DecimalFormat("0.00");
    //			Number number = decimaleFormat.parse(priceformated);
    			result = number.doubleValue();
    		} catch (ParseException ex) {
    			throw new BusinessException(ex);
    		}
    		return result;
    	}
    Avec cette nouvelle méthode, tout fonctionne très bien.

    Par contre, je ne sais pas si c'est une bonne façon de faire. Je me demande s'il n'était pas possible dans la première méthode de définir deux séparateurs potentiels de décimales ('.' et ',') et laisser l'objet DecimalFormat parser ma chaine tout seul comme un grand.

    Merci d'avance pour vos commentaires.

  2. #2
    Membre Expert Avatar de Ivelios
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juillet 2008
    Messages
    1 031
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 031
    Par défaut
    Tu peux récupérer ton nombre et le transformer en string.

    Puis tu fait un petit Retour en arrière, ça redevient un nombre.

    TADAMMMM le tour est joué

  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 remplacement pourrait être une solution en effet !


    Mais attention car selon la locale la virgule ou le point peuvent également être utilisé comme séparateur de millier ce qui viendrait tout gacher

    Selon les pays/langue tu a 4 grands formats de représentation des nombres, par exemple :
    • 1,234.56 (par exemple les pays anglophones)
    • 1 234,56 (plusieurs pays européens dont la France, le Luxembourg, ...). A noter que généralement l'espace correspond à un espace insécable (code ascii 160 au lieu de 32).
    • 1.234,56 (plusieurs pays européens dont l'Italie, l'Allemagne, l'Espagne, ...)
    • 1'234.56 (en Suisse)

    Et rien que cela pose problème pour le remplacement. Par exemple : 10,000 représent "dix milles" pour les anglophones, alors qu'on pourrait interpréter cela comme "dix" tout court en France...

    Tout cela pour dire que cela peut être dangereux !!!


    A la rigueur tu pourrais peut-être utiliser la locale du navigateur pour déterminer la locale à utiliser avec le DecimalFormat, ou simplement lui imposer un format précis !!!



    Enfin il faut se méfier du parse() qui ne traite pas forcément toute la chaine : il s'arrête au premier caractère non-conforme sans générer d'erreur s'il arrive à obtenir un nombre (c'est pour cela que tu obtiens un 10.0 au lieu de 10.5).
    Pour éviter cela tu dois vérifier que toute la chaine a bien été lu (voir ce message)

    a++

Discussions similaires

  1. Réponses: 10
    Dernier message: 06/11/2012, 21h27
  2. Convertir une chaine de caractères en nombre
    Par MotorX dans le forum Débuter
    Réponses: 9
    Dernier message: 01/09/2011, 01h40
  3. Convertir une chaine de caractère en tableau
    Par Mysti¢ dans le forum Général Python
    Réponses: 7
    Dernier message: 09/04/2007, 12h20
  4. Réponses: 6
    Dernier message: 14/06/2006, 15h27
  5. [XSL] Convertir une chaine de caractère
    Par bahet dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 11/04/2006, 10h24

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