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

Langage Java Discussion :

NumberFormat laxiste ?


Sujet :

Langage Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Inscrit en
    Juillet 2004
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 10
    Par défaut NumberFormat laxiste ?
    Bonjour,

    Un petit soucis avec NumberFormat :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    public class Test {
     
        /**
         * @param args
         */
        public static void main(String[] args) {
            try {
                System.out.println(NumberFormat.getIntegerInstance().parse("1ze"));
            } catch (ParseException e) {
                e.printStackTrace(System.err);
            }
        }
     
    }
    Résultat : "1" !

    En faisant ça, je m'attends à ce qu'une ParseException soit levé, mais non il ignore les caractères alphabétiques et m'affiche un beau "1". Après avoir chercher un peu partout et n'ayant pas trouvé de classe qui ferait ce que j'attends (c'est-à-dire lever une exception quand la chaîne de caractères n'est pas STRICTEMENT un entier), est-ce que l'un d'entre vous connaitrait une classe qui ferait le taf ou est-ce qu'il faut que je me la programme ?

  2. #2
    Membre éclairé
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Septembre 2006
    Messages
    572
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 572
    Par défaut
    Integer.parseInt pete si c'est pas un int.

    Sinon, le truc a programmer, ça devrait pas etre trop compliqué :

    chaine.matches("\\d+");

  3. #3
    Membre habitué
    Inscrit en
    Juillet 2004
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 10
    Par défaut
    D'accord pour Integer.parseInt mais ça ne me donne pas un Formatter...
    Donc pas de connaissance d'un formatter qui réagirait comme Integer.parseInt et Integer.toString ?

  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
    Salut,

    Citation Envoyé par Blackseb Voir le message
    Après avoir chercher un peu partout
    Qu'est-ce que tu appelles "un peu partout" ?

    Par ce que dans la doc de la méthode parse(String) ce comportement est bien décrit, et qu'il y a un lien vers parse(String,ParsePosition) qui permet de savoir si la chaine a été lu complètement...

    De plus chacun des types Number propose une méthode parse() qui fonctionne exactement comme tu le désires... et c'est indiquer dans la FAQ : Comment convertir une chaîne en nombre ?


    Je ne pense pas que l'info soit difficile à trouver...

    a++

  5. #5
    Membre habitué
    Inscrit en
    Juillet 2004
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 10
    Par défaut
    Citation Envoyé par adiGuba Voir le message
    Qu'est-ce que tu appelles "un peu partout" ?

    Par ce que dans la doc de la méthode parse(String) ce comportement est bien décrit, et qu'il y a un lien vers parse(String,ParsePosition) qui permet de savoir si la chaine a été lu complètement...
    Oui ça j'avais vu que ce qui était décrit dans la documentation correspondait à ce qu'il se passait. Autrement j'aurais peut-être dit "bug"

    Citation Envoyé par adiGuba Voir le message
    De plus chacun des types Number propose une méthode parse() qui fonctionne exactement comme tu le désires... et c'est indiquer dans la FAQ : Comment convertir une chaîne en nombre ?
    Comme j'ai répondu à Faiche, ça ne me donne pas un Formatter...

  6. #6
    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 Blackseb Voir le message
    Oui ça j'avais vu que ce qui était décrit dans la documentation correspondait à ce qu'il se passait. Autrement j'aurais peut-être dit "bug"
    Et qu'est-ce qui t'empêche d'utiliser parse(String,ParsePosition) ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    ParsePosition pp = new ParsePosition(0);
    Number number = NumberFormat.getIntegerInstance().parse(source, pp);
    if (pp.getIndex()!=source.length()) {
        throw new ParseException("For input string : '" + source + "'", pp.getIndex());
    }
    a++

  7. #7
    Membre habitué
    Inscrit en
    Juillet 2004
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 10
    Par défaut
    Citation Envoyé par adiGuba Voir le message
    Et qu'est-ce qui t'empêche d'utiliser parse(String,ParsePosition) ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    ParsePosition pp = new ParsePosition(0);
    Number number = NumberFormat.getIntegerInstance().parse(source, pp);
    if (pp.getIndex()!=source.length()) {
        throw new ParseException("For input string : '" + source + "'", pp.getIndex());
    }
    a++
    Oui désolé j'ai pas cadré ma demande...

    En fait j'ai un JFormattedTextField qui utilise un AbstractFormatter. La solution simple que j'avais trouvé pour faire du formattage de nombre est d'utiliser la classe NumberFormatter qui utilise un NumberFormat. Je n'ai donc pas la main sur l'appel de la fonction parse (enfin sauf à reprogrammer un Formatter).

    Je posais juste la question parce que je ne dois pas être le premier à vouloir utiliser un NumberFormat pour valider les données d'un JFormattedTextField et que la châine "1ze" par exemple soit refusée (or elle est acceptée et transformée en "1" ).

  8. #8
    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 Blackseb Voir le message
    Je n'ai donc pas la main sur l'appel de la fonction parse (enfin sauf à reprogrammer un Formatter).
    Il suffit d'implémenter ton propre Formatter :
    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
    	AbstractFormatter nf = new AbstractFormatter() {
    		private final NumberFormat NF = NumberFormat.getIntegerInstance();
     
    		@Override
    		public Object stringToValue(String source) throws ParseException {
    			ParsePosition pp = new ParsePosition(0);
    			Number number = NumberFormat.getIntegerInstance().parse(source, pp);
    			if (pp.getIndex()!=source.length()) {
    			    throw new ParseException("For input string : '" + source + "'", pp.getIndex());
    			}
    			return number;
    		}
     
    		@Override
    		public String valueToString(Object value) throws ParseException {
    			return NF.format(value);
    		}
    	};
    a++

  9. #9
    Membre émérite

    Étudiant
    Inscrit en
    Octobre 2007
    Messages
    510
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2007
    Messages : 510
    Par défaut
    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
     
    BufferedReader input = new BufferedReader(
                            new InputStreamReader(System.in));
     while (true) {
                try {
                    String inputline = input.readLine();
                    double reponse = Double.valueOf(inputline).doubleValue();
                    return reponse;
                } catch (java.io.IOException exc) { 
                       System.out.println("ERROR");
                }
                  catch (NumberFormatException exc) { }
                       System.out.println("ERROR");
                }
    ...
    System.out.println(reponse);
    moi je ferai comme ca c'est long et peut etre pas trés jolie mais je pense que ca marche

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

Discussions similaires

  1. [D6] Export Excel - NumberFormat - date et heure
    Par Lung dans le forum API, COM et SDKs
    Réponses: 5
    Dernier message: 14/03/2006, 08h10
  2. [Ole Excel]OLE Error avec numberformat
    Par ired dans le forum API, COM et SDKs
    Réponses: 5
    Dernier message: 13/03/2006, 20h55
  3. [Const et Case] Delphi Laxiste ?
    Par Manopower dans le forum Langage
    Réponses: 15
    Dernier message: 05/10/2005, 13h46
  4. Excel et Numberformat
    Par jeanmichel.lovichi dans le forum API, COM et SDKs
    Réponses: 4
    Dernier message: 18/11/2004, 18h50
  5. [NumberFormat] : utilisation de la methode parse()
    Par richard_34b dans le forum Collection et Stream
    Réponses: 11
    Dernier message: 20/10/2004, 15h07

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