DecimalFormat преобразует числа с не-цифрами
Использование DecimalFormat не дает исключения синтаксического анализа при использовании такого типа чисел:
123hello
, который, очевидно, на самом деле не является числом и преобразуется в значение 123.0. Как я могу избежать такого поведения?
В качестве примечания hello123 действительно дает исключение, которое является правильным.
Спасибо, Марсель
3 ответа:
Для точного разбора можно использовать
public Number parse(String text, ParsePosition pos)
Инициализируйте pos до 0, и когда он будет завершен, он даст вам индекс после последнего символа, который был использован.
Затем вы можете сравнить это с длиной строки, чтобы убедиться, что синтаксический анализ был точным.
Расширяя ответ @Kal, вот служебный метод, который вы можете использовать с любым форматером для "строгого" разбора (использует Apache commons StringUtils):
public static Object parseStrict(Format fmt, String value) throws ParseException { ParsePosition pos = new ParsePosition(0); Object result = fmt.parseObject(value, pos); if(pos.getIndex() < value.length()) { // ignore trailing blanks String trailing = value.substring(pos.getIndex()); if(!StringUtils.isBlank(trailing)) { throw new ParseException("Failed parsing '" + value + "' due to extra trailing character(s) '" + trailing + "'", pos.getIndex()); } } return result; }
Вы можете проверить, что он числовой, используя регулярное выражение:
String input = "123hello"; double d = parseDouble(input); // Runtime Error public double parseDouble(String input, DecimalFormat format) throws NumberFormatException { if (input.equals("-") || input.equals("-.")) throw NumberFormatException.forInputString(input); if (!input.matches("\\-?[0-9]*(\\.[0-9]*)?")) throw NumberFormatException.forInputString(input); // From here, we are sure it is numeric. return format.parse(intput, new ParsePosition(0)); }