验证字符串是否为十六进制

2022-09-01 04:49:28

我有一个像“09a”这样的字符串,我需要一个方法来确认文本是否是十六进制的。我发布的代码做了类似的事情,它验证字符串是十进制数。我想做同样的事情,但对于十六进制。

    private static boolean isNumeric(String cadena) {
    try {
        Long.parseLong(cadena);
        return true;
    } catch (NumberFormatException nfe) {
        JOptionPane.showMessageDialog(null,"Uno de los números, excede su capacidad.");
        return false;
    }
}

答案 1

有一个重载的 Long.parseLong 接受第二个参数,指定基数:

Long.parseLong(cadena,16);

作为替代方法,您可以循环访问字符串中的字符,并在其上调用 Character.digit(c,16)(如果其中任何一个返回它不是有效的十六进制数字)。如果字符串太大而无法放入 a 中,这尤其有用(如注释中指出的那样,如果使用第一种方法,这将导致异常)。例:-1long

private static boolean isNumeric(String cadena) {
    if ( cadena.length() == 0 || 
         (cadena.charAt(0) != '-' && Character.digit(cadena.charAt(0), 16) == -1))
        return false;
    if ( cadena.length() == 1 && cadena.charAt(0) == '-' )
        return false;

    for ( int i = 1 ; i < cadena.length() ; i++ )
        if ( Character.digit(cadena.charAt(i), 16) == -1 )
            return false;
    return true;
}

顺便说一句,我建议将“测试有效数字”和“向用户显示消息”的问题分开,这就是为什么我只是在上面的示例中返回而不是先通知用户。false

最后,您可以简单地使用正则表达式:

cadena.matches("-?[0-9a-fA-F]+");

答案 2

可怕的滥用例外。永远不要这样做!(不是我,而是Josh Bloch的《Effective Java》)。无论如何,我建议

private static final Pattern HEXADECIMAL_PATTERN = Pattern.compile("\\p{XDigit}+");

private boolean isHexadecimal(String input) {
    final Matcher matcher = HEXADECIMAL_PATTERN.matcher(input);
    return matcher.matches();
}