首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在Java中解析C风格程序员的整数

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

Stack Overflow用户
提问于 2016-10-05 02:48:16
回答 1查看 70关注 0票数 1

这个问题很短,但我到处都找不到答案。

是否有一个jdk例程可以将String解析为int,并自动检测和转换C风格的编程约定:

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

谢谢!

编辑:

让我在这里说清楚,我知道我可以处理这个方法。我已经这么做了!我知道基数是什么,也知道Integer.parse(..., radix)!我想问的是,JDK不是已经有了一个处理所有情况的方法吗?一句简单的话...

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-10-05 02:57:13

我不记得在标准JDK中有这样的函数。

如果你想自动检测样式,你可以用switch-caseStrategy pattern编写辅助函数。

首先,检查数字字符串是否以0x开头,如果不是,则检查它是否以0开头。但是如果你有二进制数,这是行不通的。但在你的问题^_^中没有这样的东西。

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

附加示例代码:

代码语言:javascript
复制
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();
    }
}

和测试:

代码语言:javascript
复制
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"));
    }

}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39859629

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档