这个问题很短,但我到处都找不到答案。
是否有一个jdk例程可以将String
解析为int
,并自动检测和转换C风格的编程约定:
谢谢!
编辑:
让我在这里说清楚,我知道我可以处理这个方法。我已经这么做了!我知道基数是什么,也知道Integer.parse(..., radix)
!我想问的是,JDK不是已经有了一个处理所有情况的方法吗?一句简单的话...
发布于 2016-10-05 02:57:13
我不记得在标准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"));
}
}
https://stackoverflow.com/questions/39859629
复制相似问题