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

Composants Java Discussion :

[JFormattedTextField] & NumberFormatException, BIZARRE.


Sujet :

Composants Java

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    504
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 504
    Par défaut [JFormattedTextField] & NumberFormatException, BIZARRE.
    Bonjour, j'ai une erreur tout a fait bizarre, j'ai deux champs JFormattedTextField. Je veux que le user puisse seulement rentrer deux chiffres. J'ai donc fait le nécéssaire au niveau du code des champs, voir ci-desous.
    Mais j'ai une erreur tout a fait bizarre, si je met 08 ou 09 j'ai l'erreur suivante :

    Exception occurred during event dispatching:
    java.lang.NumberFormatException: For input string: "8"
    at java.lang.NumberFormatException.forInputString(Unknown Source)
    at java.lang.Integer.parseInt(Unknown Source)
    at java.lang.Integer.valueOf(Unknown Source)
    at java.lang.Integer.decode(Unknown Source)
    at dsi.emc.pac7000.ui.alert.DetailChartRuleUI.informationOk(DetailChartRuleUI.java:202)


    Par contre si je met 01,02,03,04,05,06,07,10,11,12,13...18 et 19, il n'y a pas de probleme. c'est seulement pour 08 et 09. je ne comprends vraiment pas je n'ai jamais vu cela. bref mon code peut surement etre amélioré. je veux juste que l'utilisateur ne puisse rentrer que 2chiffres, et ce qui serait bien c que si il mette seulement 2, je le comprenne car pour l'instant il faut entrer 02... bref si vous pouvais m'aider merci. tout les codes nécéssaires sont fournis ci dessous.
    Merci d'avance.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
      private JFormattedTextField getNbSubGroupMinTextField() {
        if (monChamp == null) {
          try {
            monChamp = new JFormattedTextField(new MaskFormatter("##"));
          } catch (ParseException e) {
            e.printStackTrace();
          }
          monChamp.setColumns(2);
        }
        return monChamp;
      }
    Ensuite pour récupérer la valeur je fais comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
        String nbMinvalue = monChamp.getText();
        int index = nbMinvalue .indexOf(' ');
        if (index >= 0) {
          nbMinvalue = nbMinvalue.substring(0, index);
        }
        if (!nbMinvalue.equals("")) {
          min = Integer.decode(nbMinvalue).intValue();    
        }
    Au passage le code est peut etre à revoir. mais cela n'explique pas l'exception (pour moi !!) .

  2. #2
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 918
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 918
    Billets dans le blog
    54
    Par défaut
    Héhé c'est tout à fait normal selon la norme du language tous les chiffres commencant par 0 sont en ... octal et donc 08 et 09 sont des valeurs totalement INTERDITES

    Pour rappel :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    00  -> 0
    01  -> 1
    02  -> 2
    03  -> 3
    04  -> 4
    05  -> 5
    06  -> 6
    07  -> 7
    010 -> 8
    011 -> 9
    ...
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    504
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 504
    Par défaut
    ok..... merci pour l'info....
    donc comment faire ? lol

  4. #4
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 918
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 918
    Billets dans le blog
    54
    Par défaut
    Je dirai qu'il faut fournir au JFormattedTextField ton propre MaskFormatter (pas de panique) qui délègue tout simplement toutes ses méthodes de vérification au MaskFormatter habituel mais délègue ses méthodes de formattage à un NumberFormat habituel. Le tout en prenant soint de retirer le préfixe 0 pour les chiffres < 10 avant de faire le parsage.
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    504
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 504
    Par défaut
    ok ok , je vais essayer de faire ça. Je n'avais pas penser à l'octal, je croyais que c'était un bug, ou truc comme ça.
    Merci pour ton aide.

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


    Autre solution : utiliser la méthode Integer.valueOf() ou Integer.parseInt() à la place de Integer.decode()...

    Comme l'as dit bouye decode() interprète les nombres de la même manière que le compilateur et détermine donc la base selon la manière dont le chiffre est saisie, alors que ces deux méthodes utilisent par défaut la base 10...

    a++

  7. #7
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 918
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 918
    Billets dans le blog
    54
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    String nbMinvalue = monChamp.getText(); 
    ...
    min = Integer.decode(nbMinvalue).intValue();
    Ah oui je n'avais pas fait gaffe à la manière dont la valeur est récupérée.

    Normalement il est possible de retirer directement une valeur entière d'un JFormattedTextField si on a mit un NumberFormatter dedans :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    JFormattedTextField monChamp = new JFormattedTextField(new NumberFormatter(NumberFormat.getIntegerInstance()));
    ...
    min = ((Number)monChamp.getValue()).intValue();
    N'est-il pas plus facile de faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    Format format = NumberFormat.getIntegerInstance();
    format.setMinimumIntegerDigits(2);
    format.setMaximumIntegerDigits(2);
    JFormattedTextField monChamp = new JFormattedTextField(new NumberFormatter(format));
    ...
    min = ((Number)monChamp.getValue()).intValue();
    Je n'ai pas testé. ... et un problème potentiel que je vois est que peut-être le signe - est accepté. Sinon on peut également jouer avec la classe DecimalFormat qui offre encore plus de contrôle.
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  8. #8
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    504
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 504
    Par défaut
    ca y est g changer le code, je suis passer par des trucs que qq'1 avait deja fait, il y a peut etre plus simple mais ca ca marche tres bien :
    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
    21
    22
    23
    24
    25
    26
    27
    28
     
      private MaskFormatter                                formatter;
      public Constructor() {
    ................
        formatter = new MaskFormatter("##");
        formatter.setPlaceholderCharacter('0');
    ...........
    }
     
      private JFormattedTextField getNbSubGroupMinTextField() {
        if (nbSubGroupMinTextField == null) {
          nbSubGroupMinTextField = new JFormattedTextField();
          nbSubGroupMinTextField.setFont(ParameterUI.PAC7000_FONT);
          initFormattedTextField(nbSubGroupMinTextField);
        }
        return nbSubGroupMinTextField;
      }
     
      private void initFormattedTextField(JFormattedTextField field) {
        if (formatterFactory == null) {
          formatterFactory = new JFormattedTextField.AbstractFormatterFactory() {
            public AbstractFormatter getFormatter(JFormattedTextField field) {
              return formatter;
            }
          };
        }
        field.setFormatterFactory(formatterFactory);
      }
    et pour récupérer et affecter les données :
    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
     
        // Pour affecter
        Integer value = Integer.valueOf(monEntierAAffecter);
        String string = IntegerFormatter.format(value, formatter.getMask());
        monChampTextField.setValue(string);
     
        // Pour récupérer la valeur du champ.
        String min = monChampTextField.getText();
        // Test si la valeur min existe ?
        if (!min.equals("")) {
          try {
            Integer value = Integer.valueOf(min);
            monEntierARecuperer = value.intValue();
          } catch (NumberFormatException e) { //
          }
        }
    Avec en petit plus, une classe qui ne sert pas vraiment à grand chose (ya surment plsu simple)...
    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
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
     
    public class IntegerFormatter {
      public static String format(Integer value, String format) {
        if (value != null) {
          String left = String.valueOf(value);
          String mask = format;
          return getFormattedString(left,mask);
        } else {
          return "00";
        }
      }
     
      public static String getFormattedString(String left, String mask) {
        StringBuffer buffer = new StringBuffer();
        StringBuffer tmp = new StringBuffer();
        int max = mask.length();
        int size;
     
        if (max < left.length()) {
          size = left.length() - max;
          for (int i = left.length() - 1; i >= size; i--) {
            tmp.append(left.charAt(i));
          }
          for (int j = tmp.length() - 1; j >= 0; j--) {
            buffer.append(tmp.charAt(j));
          }
        } else {
          size = max - left.length();
          for (int i = 0; i < size; i++) {
            buffer.append('0');
          }
          buffer.append(left);
        }
     
        return buffer.toString();
      }
    }
    voila, et ca marche impec...
    Je dois dire que c'est compliqué mais qq'1 avait deja fait a peut pres de cette maniere pour des double donc j'ai adapté pour des entiers...

  9. #9
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 918
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 918
    Billets dans le blog
    54
    Par défaut
    Voir non avant-dernier post. Mais comme je n'ai pas testé....
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

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

Discussions similaires

  1. problèmes bizarres avec jdbc
    Par jaimepasteevy dans le forum PostgreSQL
    Réponses: 8
    Dernier message: 12/12/2003, 12h00
  2. taille de structure bizarre ...
    Par lyrau dans le forum C
    Réponses: 3
    Dernier message: 20/11/2003, 10h46
  3. Un String Bizarre
    Par YanK dans le forum Langage
    Réponses: 6
    Dernier message: 07/02/2003, 11h05
  4. Réponses: 4
    Dernier message: 28/09/2002, 00h00

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