Почему DecimalFormat разрешает символы в качестве суффикса?

Я использую DecimalFormat для синтаксического анализа/проверки ввода. К сожалению, он позволяет использовать символы в качестве суффикса при разборе.

Пример кода:

try {
  final NumberFormat numberFormat = new DecimalFormat();
  System.out.println(numberFormat.parse("12abc"));
  System.out.println(numberFormat.parse("abc12"));
} catch (final ParseException e) {
  System.out.println("parse exception");
}

Результат:

12
parse exception

Я бы предпочел исключение синтаксического анализа для обоих из них. Как я могу сказать DecimalFormat не допускать ввода типа "12abc"?

Ответы

Ответ 1

Из документации NumberFormat.parse:

Разбирает текст с начала данной строки, чтобы создать число. Метод может не использовать весь текст данной строки.

Вот пример, который должен дать вам представление о том, как убедиться, что вся строка рассмотрена.

import java.text.*;

public class Test {
    public static void main(String[] args) {
        System.out.println(parseCompleteString("12"));
        System.out.println(parseCompleteString("12abc"));
        System.out.println(parseCompleteString("abc12"));
    }

    public static Number parseCompleteString(String input) {
        ParsePosition pp = new ParsePosition(0);
        NumberFormat numberFormat = new DecimalFormat();
        Number result = numberFormat.parse(input, pp);
        return pp.getIndex() == input.length() ? result : null;
    }
}

Вывод:

12
null
null

Ответ 2

Используйте перегрузку метода parse(String, ParsePosition) и проверьте после завершения синтаксического анализа .getIndex() ParsePosition, чтобы убедиться, что он соответствует длине ввода.