Question

Je valide la saisie utilisateur à partir d'un formulaire.

J'analyse l'entrée avec NumberFormat , mais c'est mal et permet presque tout.Existe-t-il un moyen d'analyser un nombre plus strict?

Par exempleJe voudrais ne pas autoriser ces trois entrées, pour un entier, mais Numberformat les autorise toutes:

NumberFormat nf = NumberFormat.getNumberInstance();
nf.setParseIntegerOnly(true);

Number numberA = nf.parse("99.731");    // 99 (not what the user expect)
Number numberB = nf.parse("99s.231");   // 99 (invalid)
Number numberC = nf.parse("9g9");       // 9  (invalid)

System.out.println(numberA.toString());
System.out.println(numberB.toString());
System.out.println(numberC.toString());

Pas de solution correcte

Autres conseils

Peut-être que cela aide:

String value = "number_to_be_parsed".trim();
NumberFormat formatter = NumberFormat.getNumberInstance();
ParsePosition pos = new ParsePosition(0);
Number parsed = formatter.parse(value, pos);
if (pos.getIndex() != value.length() || pos.getErrorIndex() != -1) {
    throw new RuntimeException("my error description");
}

(Merci à Analyse stricte des nombres sur mynetgear.net )

Il existe de nombreuses façons de procéder:

  • regex - vérifiez si elle génère un code-code
  • avec matches("\\d+") - javax.validation
  • apache commons @Digits(fraction=0, integer=5)

Integer.parseInt(String) lancera une NumberFormatException sur tous vos exemples.Je ne sais pas si c'est ce que vous recherchez, mais c'est définitivement "plus strict".

Utilisez DecimalFormat avec une chaîne de modèle de format.

Jetez un œil à DecimalFormat qui est une sous-classe de NumberFormat http://docs.oracle.com/javase/6/docs/api/java/text/DecimalFormat.html

DecimalFormat myFormatter= new DecimalFormat ("###. ###");

Je n'utiliserais pas la routine de format de nombre de Java, en particulier avec les paramètres régionaux si vous vous inquiétez de la validation.

    Locale numberLocale = new Locale(“es”,”ES");
    NumberFormat nf = NumberFormat.getInstance(numberLocale);
    ParsePosition pos = new ParsePosition(0);
    Number test = nf.parse("0.2", pos);

Vous vous attendez à ce qu'il y ait un problème ici, mais non .. test est égal à 2 et pos a un index de 3 et un index d'erreur de -1.

J'ai renoncé à écrire ma propre classe de validation et j'ai opté pour NEBULA WIDGETS FormattedText

Il a été écrit sur l'API du widget SWT, mais vous pouvez facilement adapter le Classe NumberFormatter

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top