Заставить DecimalFormat выдать ParseException, если не вся строка разбирается - PullRequest
2 голосов
/ 19 сентября 2019

Я хочу настроить мой экземпляр DecimalFormat так, чтобы он не мог выполнить синтаксический анализ строки, если не вся строка является доступной для анализа.

Если я запустил приведенный ниже код, то получу вывод:

Я мог бы проанализировать строку, и результат: 2000

Однако я хотел бы, чтобы оно выдало исключение, потому что оно содержит не цифры: MMM

public static void main(String[] args) {
    try {
        DecimalFormat df = new DecimalFormat();
        DecimalFormatSymbols symbols = new DecimalFormatSymbols();
        symbols.setDecimalSeparator(',');
        symbols.setGroupingSeparator('.');
        df.setDecimalFormatSymbols(symbols);
        Number n = df.parse("2.000.MMM,77");
        System.out.println("I could parse the string, and the result is: " + n);
    } catch (ParseException pe) {
        pe.printStackTrace();
    }
}

1 Ответ

2 голосов
/ 19 сентября 2019

Вы можете добавить себе небольшой вспомогательный метод, подобный следующему:

    private static Number parse(DecimalFormat df, String input) throws ParseException {
        final ParsePosition position = new ParsePosition(0);
        final Number result = df.parse(input, position);

        if (position.getErrorIndex() != -1) {
            throw new ParseException("could not parse input='" + input + "'", position.getErrorIndex());
        } else if (position.getIndex() < input.length()) {
            throw new ParseException("input='" + input + "' wasnt processed completely", position.getIndex());
        }

        return result;
    }

Будет сгенерировано исключение, если ввод не был обработан полностью

Вы также можете расширить DecimalFormat и добавитьВышеуказанный метод примерно так:

import java.text.DecimalFormat;
import java.text.ParseException;
import java.text.ParsePosition;

public class ThrowingDecimalFormat extends DecimalFormat {

    public Number parseSafe(String input) throws ParseException {
        final ParsePosition position = new ParsePosition(0);
        final Number result = parse(input, position);

        if (position.getErrorIndex() != -1) {
            throw new ParseException("could not parse input='" + input + "'", position.getErrorIndex());
        } else if (position.getIndex() < input.length()) {
            throw new ParseException("input='" + input + "' wasnt processed completely", position.getIndex());
        }

        return result;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...