JavaでNumberformatが何をするかよりも厳格な数字を解析する方法は?
-
29-10-2019 - |
質問
フォームからのユーザー入力を検証しています。
入力を解析します NumberFormat
, 、しかし、それは悪であり、ほとんど何でも許しています。数字をより厳格に解析する方法はありますか?
たとえば、整数のためにこれらの3つの入力を許可しませんが、 Numberformat
それらすべてを許可します:
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());
正しい解決策はありません
他のヒント
多分これは役立ちます:
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");
}
(ありがとう mynetgear.netでの厳格な数字)
それを行うには多くの方法があります:
- Regex-それかどうかを確認してください
matches("\\d+")
- と
javax.validation
-@Digits(fraction=0, integer=5)
- Apache Commons
IntegerValidator
Integer.parseInt(String)
すべての例にnumberformatexceptionを投げます。それがあなたが探しているものかどうかはわかりませんが、それは間違いなく「より厳格」です。
フォーマットパターン文字列を使用してDecimalFormatを使用します。
NumberformatのサブクラスであるDecimalformatをご覧ください http://docs.oracle.com/javase/6/docs/api/java/text/decimalformat.html
decimalformat myformatter = new DecimalFormat( "###。###");
特に検証を心配している場合は、Javaの数値形式のルーチンを使用しません。
Locale numberLocale = new Locale(“es”,”ES");
NumberFormat nf = NumberFormat.getInstance(numberLocale);
ParsePosition pos = new ParsePosition(0);
Number test = nf.parse("0.2", pos);
ここには問題があると予想されますが、いいえ。テストは2に等しく、POSのインデックスは3のインデックスと-1のエラーインデックスがあります。
私は自分の検証クラスを書くことをあきらめ、一緒に行きました 星雲ウィジェット formattedText
SWTウィジェットAPIに書かれましたが、簡単に適応できます NumberFormatterクラス