DecimalFormat преобразует числа с цифрами
Использование DecimalFormat не дает исключения для синтаксического разбора при использовании такого номера:
123hello
который, очевидно, не является числом, и преобразуется в значение 123.0. Как я могу избежать такого поведения?
В качестве побочной заметки hello123 дает исключение, которое является правильным.
Спасибо,
Марсель
Ответы
Ответ 1
Чтобы выполнить точный синтаксический анализ, вы можете использовать
public Number parse(String text,
ParsePosition pos)
Инициализировать pos до 0, и когда он закончит, он даст вам индекс после последнего используемого символа.
Затем вы можете сравнить это с длиной строки, чтобы убедиться, что синтаксический анализ был точным.
http://download.oracle.com/javase/1.4.2/docs/api/java/text/DecimalFormat.html#parse%28java.lang.String,%20java.text.ParsePosition%29
Ответ 2
Развернувшись на ответе @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;
}
Ответ 3
Вы можете проверить его числовое значение с помощью RegEx:
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));
}