【问题标题】:Parse a C-style programmer's integer in Java在 Java 中解析 C 风格程序员的整数
【发布时间】:2016-10-04 18:48:16
【问题描述】:

这个很短,但我在任何地方都找不到答案。

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

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

谢谢!

编辑:

让我在这里说清楚,我知道我可以手动处理这种方法。我已经这样做了!我知道基数是什么以及关于Integer.parse(..., radix)!我要问的是,JDK 是否已经有了处理所有情况的方法。一条线就可以了...

【问题讨论】:

  • 嗯,十进制和八进制很容易。没有冒犯,但你不可能看起来那么努力。所有的数字类都有一个parse 方法。
  • 关键搜索词:基数
  • @Carcigenicate 我知道这一切,我已经看起来那么努力了。查看我的编辑。
  • @drrob 很抱歉,否则。我的错。

标签: java parsing integer radix


【解决方案1】:

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

如果你想自动检测风格,你可以用switch-caseStrategy 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"));
    }

}

【讨论】:

  • 是的,我已经使用它手动编写了一个方法......但似乎是一个足够常见的用例,应该有一个单线方法(而不是自己测试每个案例)......
  • @drrob 对不起,删除了多余的信息,重写了答案
  • 非常感谢,但我已经这样做了。我想自动检测,而不必重新发明在我看来很常见的情况。我猜答案是否定的,你必须写出每个案例......
  • @drrob 说真的,我不记得标准JDK中有这样的功能。
  • @drrob 自动检测整数基数远非常见用例。
猜你喜欢
  • 1970-01-01
  • 2012-11-25
  • 2011-12-04
  • 2012-11-06
  • 2023-03-18
  • 2014-10-01
  • 2011-10-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多