在Java中解析C风格的程序员的整数

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (1)
  • 关注 (0)
  • 查看 (20)

我无法在任何地方找到答案。

是否有一个JDK程序,可以解析Stringint,并自动检测并转换成C风格的编程约定:

  • 123(十进制)
  • 0x1ABC(十六进制)
  • 0x1abc(十六进制)
  • 0777(八进制)

谢谢!

编辑:

让我在这里说清楚,我知道我可以用这种方法。我已经这样做了!我知道什么是基数和关于Integer.parse(..., radix)!我要问的是,JDK是否已经有了处理所有情况的方法。整个批次的单线程......

提问于
用户回答回答于

我不记得标准JDK中的这种功能。

如果你想自动检测样式,你可以使用switch-caseor 编写帮助函数Strategy pattern

首先,检查数字字符串是否以0x,如果不是,请检查它是否始于0。但如果你有二进制数,这将不起作用。但是在你的问题中没有这样的^ _ ^。

请参见Integer.parse(String s,radix)方法。

附加示例代码:

public class RadixDetector {

    private static final int RADIX_HEX = 16;
    private static final int RADIX_OCTAL = 8;

    public static int detectRadix(String number) {

        if (number.toLowerCase().startsWith("0x") && isValidHex(number)) {
            return RADIX_HEX;
        } else if (number.startsWith("0") && isValidOctal(number)) {
            return RADIX_OCTAL;
        } else {
            throw new NumberFormatException("Unknown or unable to detect radix for: " + number);
        }
    }

    public static boolean isValidHex(String number) {
        Pattern hexPattern = Pattern.compile("0[xX][0-9a-fA-F]+");
        return hexPattern.matcher(number).matches();
    }

    public static boolean isValidOctal(String number) {
        Pattern hexPattern = Pattern.compile("0[1-7][0-7]*");
        return hexPattern.matcher(number).matches();
    }
}

并测试:

public class NumberRadixTests {

    @Test
    public void testRadixDetection() {
        assertEquals(16, RadixDetector.detectRadix("0xabcd"));
        assertEquals(16, RadixDetector.detectRadix("0xABCD"));
        assertEquals(16, RadixDetector.detectRadix("0xAFFF"));
        assertEquals(16, RadixDetector.detectRadix("0x0"));
        assertEquals(16, RadixDetector.detectRadix("0X0"));
        assertEquals(16, RadixDetector.detectRadix("0XFFF"));
        assertEquals(8, RadixDetector.detectRadix("0123"));
        assertEquals(8, RadixDetector.detectRadix("011"));
        assertEquals(8, RadixDetector.detectRadix("0777"));
        assertEquals(8, RadixDetector.detectRadix("0666"));
    }

    @Test
    public void testHexRegex() {
        assertTrue(RadixDetector.isValidHex("0xabcd"));
        assertTrue(RadixDetector.isValidHex("0Xabcd"));
        assertTrue(RadixDetector.isValidHex("0xAbcd"));
        assertTrue(RadixDetector.isValidHex("0xa0cd"));
        assertTrue(RadixDetector.isValidHex("0x9bc1"));
        assertTrue(RadixDetector.isValidHex("0x9bc1"));
        assertFalse(RadixDetector.isValidHex("x9bc1"));
        assertFalse(RadixDetector.isValidHex("0xbtc1"));
        assertFalse(RadixDetector.isValidHex("0xx9bc1"));
        assertFalse(RadixDetector.isValidHex("00x9bc1"));
        assertFalse(RadixDetector.isValidHex("0x9pc1"));
        assertFalse(RadixDetector.isValidHex("0x"));
        assertFalse(RadixDetector.isValidHex("077"));
    }

    @Test
    public void testOctalRegex() {
        assertTrue(RadixDetector.isValidOctal("077"));
        assertTrue(RadixDetector.isValidOctal("067"));
        assertTrue(RadixDetector.isValidOctal("07777"));
        assertTrue(RadixDetector.isValidOctal("017"));
        assertFalse(RadixDetector.isValidOctal("08"));
        assertFalse(RadixDetector.isValidOctal("8"));
        assertFalse(RadixDetector.isValidOctal("777"));
        assertFalse(RadixDetector.isValidOctal("0x"));
        assertFalse(RadixDetector.isValidOctal("08"));
        assertFalse(RadixDetector.isValidOctal("01238"));
    }

}

扫码关注云+社区

领取腾讯云代金券