Comment analyser des nombres plus stricts que ce que fait NumberFormat en Java?
-
29-10-2019 - |
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");
}
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