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 :

conversion d'une chaine par un NumberFormat


Sujet :

Collection et Stream Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de kerinel
    Profil pro
    Inscrit en
    Février 2007
    Messages
    103
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 103
    Par défaut conversion d'une chaine par un NumberFormat
    Bonjour,
    Peut être pas la rubrique ad-hoc, j'ai longtemps hésité entre ici et swing, mais cela relève quand même avant tout du texte.

    J'ai un petit problème de conversion d'une String en float.
    Au départ j'utilisais l'instruction suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    echel=(formatNombre.parse(s)).floatValue();
    où echel est un float déclaré plus haut, formatNombre un NumberFormat obtenu grâce à la "Locale" utilisée (pas forcément celle par défaut sur le système mais celle sélectionnée par l'utilisateur), et s une String récupérée sur un JTextField.

    L'intérêt est que avec une Locale en_US lorsque je tape
    1,236.52
    j'ai bien le nombre 1236 en partie entière et 52 en partie décimale
    avec la Locale fr_FR j'ai 1 en partie entière et 236 en partie décimale (et le 52 n'est pas pris en compte.)

    Mais si je tape 1y236 ('y' ou n'importe quoi d'autre d'ailleurs), j'obtiens 1. Il ne lève pas de NumberFormatException (par contre si je tape "y" directement il lève bien une exception). D'ailleurs si je tape 1.236,52 j'obtiens seulement 1 (alors qu'il me semblait bien que le point correspond au séparateur de millier).

    le fait de pouvoir introduire un caractère quelconque sans lever d'erreur est-il un comportement normal du NumberFormat ?

    J'ai donc essayé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    echel=(Float.valueOf(s)).floatValue();
    mais du coup je perd la possibilité d'écrire les nombres correctement en fonction de la Locale et si je tape 1,236 je lève une Exception, ce qui pour un utilisateur francophone n'est pas logique (et pour un américain non plus puisque pour lui aussi cette écriture est correcte et correspond 1236).

    Y-a-t-il
    - soit moyen de paramétrer le NumberFormat pour qu'il lève une Exception lorsqu'il rencontre un caractère ?

    - voir sur le Float.valueOf(s) pour reconnaitre correctement les points et les virgules en fonction de Locale (mais j'y crois déjà moins)

    - soit filtrer directement sur le JTextFiled pour ne pas tenir compte des caractères autre qu'un nombre un point ou une virgule, mais il me reste le problème du point qui ne passe pas en français et je perd la possibilité de passer d'autres formats de nombre sans les connaitre a priori (ben oui si un jour je veux traduire mon programme en chinois ?).

    merci pour votre aide,

    bon code,
    kerinel

  2. #2
    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 comportement du parse() est tout à fait correcte puisque ceci est indiqué dans sa documentation :
    The method may not use the entire text of the given string.

    Pour être sûr que toute la chaine a été traité tu dois utiliser la méthode parse(String,ParsePosition) et récupérer les informations en retour, comme par exemple avec cette méthode :


    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
    	public static Number parseAll(NumberFormat nf, String source) throws ParseException {
    		ParsePosition parsePosition = new ParsePosition(0);
    		Number result = nf.parse(source, parsePosition);
     
    		// Si une erreur a été décelée on la remonte tel quel :
    		if (parsePosition.getErrorIndex()>=0) {
    			throw new ParseException("Unparseable number: \"" + source + "\"",
    		            parsePosition.getErrorIndex());
    		}
     
    		// Si le parse n'a pas traité toute la chaine on remonte une erreur
    		// (cela signifie qu'il a ignoré des caractères)
    		if (parsePosition.getIndex()!=source.length()) {
    			char c = source.charAt(parsePosition.getIndex());
    			throw new ParseException("Unparseable number: \"" + source + "\", "
    					+ String.format(" bad character : '%c' (\\u%04x)", c, (int)c),
    		            parsePosition.getIndex());
    		}
    		return result;
    	}
    a++

  3. #3
    Membre confirmé Avatar de kerinel
    Profil pro
    Inscrit en
    Février 2007
    Messages
    103
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 103
    Par défaut
    Super ça fonctionne bien.
    Hormis le fait qu'il refuse le point comme séparateur de millier en français mais bon ce n'est pas non plus très usité...
    Merci encore

    Bon code,
    kerinel

  4. #4
    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
    Citation Envoyé par kerinel Voir le message
    Hormis le fait qu'il refuse le point comme séparateur de millier en français mais bon ce n'est pas non plus très usité...
    Surtout que normalement c'est l'espace insécable (\u00a0) qui est utilisé


    Si tu veux personnaliser le séparateur il faut passer par les DecimalFormat et DecimalFormatSymbols...

    a++

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

Discussions similaires

  1. [Système] Remplacer une chaine par un lien hypertexte
    Par Bisûnûrs dans le forum Langage
    Réponses: 10
    Dernier message: 06/06/2007, 09h34
  2. conversion d'une chaine de caractère en int
    Par greg13 dans le forum C++
    Réponses: 3
    Dernier message: 25/08/2005, 16h18
  3. [string->HTML] Conversion d'une chaine en HTML
    Par salome dans le forum API standards et tierces
    Réponses: 2
    Dernier message: 24/07/2005, 16h27
  4. [Property] Comment déclarer une chaine par defaut ?
    Par Clorish dans le forum Composants VCL
    Réponses: 8
    Dernier message: 07/09/2004, 22h11
  5. Conversion d'une chaine de char en numerique
    Par simone.51 dans le forum SQL Procédural
    Réponses: 2
    Dernier message: 25/03/2004, 16h47

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