我不记得标准JDK中有这样的功能。
如果你想自动检测风格,你可以用switch-case或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"));
}
}