0

我目前有一个验证方法,它根据给定的字符串是有效的 Double、Float、Integer、Long 还是 Short 返回一个布尔值。虽然这似乎将诸如“asdf”之类的情况视为无效字符串,但当存在以一系列数字开头的无效数字字符串时,它似乎会失败,例如:“33asd”。该方法如下图所示:

    public static boolean isNumeric(String str, Class<? extends Number> cl) {
    try {
        if (cl.equals(Byte.class)) {
            Byte.parseByte(str);
        } else if (cl.equals(Double.class)) {
            if (NumberUtils.convertStringToDouble(str, "###,###") == null) {
                return false;
            }
        } else if (cl.equals(Float.class)) {
            Float.parseFloat(str);
        } else if (cl.equals(Integer.class)) {
            Integer.parseInt(str);
        } else if (cl.equals(Long.class)) {
            Long.parseLong(str);
        } else if (cl.equals(Short.class)) {
            Short.parseShort(str);
        }
    } catch (NumberFormatException nfe) {
        return false;
    }

    return true;
}

上面使用的 NumberUtils.convertStringToDouble 方法是:

    /**
 * @param number
 *            - The String to convert.
 * @param format
 *            - The format of the string representation of the double (e.g:
 *            "###,###.00")
 * @return The String as a java.lang.Double if its valid; otherwise null.
 */
public static Double convertStringToDouble(String number, String format) {

    try {
        NumberFormat num = new DecimalFormat(format);
        return num.parse(number).doubleValue();
    } catch (ParseException e) {
        return null;
    } catch (NullPointerException ne) {
        return null;
    }
}
4

1 回答 1

2

如文件所述DecimalFormat.parse

解析不一定使用直到字符串末尾的所有字符

所以,当解析器到达字母字符时,它已经有一些东西可以解析成一个合法的数字,然后就停在那里。

于 2013-11-11T14:03:54.620 回答