DecimalFormat转换非数字的数字

时间:2011-07-06 17:28:43

标签: java decimalformat parseexception

使用DecimalFormat时,在使用这种数字时不会出现语法异常:

123hello

这显然不是一个数字,并转换为123.0值。我怎样才能避免这种行为?

作为旁注,hello123确实给出了一个例外,这是正确的。

谢谢, 烫发

3 个答案:

答案 0 :(得分:9)

要进行精确解析,可以使用

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

答案 1 :(得分: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;
}

答案 2 :(得分:0)

您可以使用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));
}