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 に答える