Java :由于 NumberFormat 异常,需要使用 String 参数而不是 Int 参数获得与 Integer.toHexString() 相同的功能

Java : Need to get the same functionality of the Integer.toHexString() with a String parameter and not an Int parameter due to NumberFormat Exception

我有这行 Java 代码,如果表示为 String 的数字大于 2,147,483,647,它将抛出 NumberFormatException。

因为:

The int data type is a 32-bit signed two's complement integer. It has a minimum value of -2,147,483,648 and a maximum value of 2,147,483,647

代码抛出 NumberFormatException:

String largeNumberAsAString = "9999999999";
Integer.toHexString(Integer.parseInt(largeNumberAsAString)); // NumberFormatException

由于 NumberFormatException,我如何使用 String 参数而不是 int 参数获得与 Integer.toHexString() 相同的功能?

使用BigInteger来避免原始intlong的数值限制:

BigInteger x = new BigInteger("9999999999999999999999"); // Default radix is 10
String x16 = x.toString(16);                             // Radix 16 indicates hex
System.out.println(x16);

class 方便地公开了一个采用 String 的构造函数,它被解释为数字的十进制表示形式。

Demo.

试试这个方法:

 String largeNumberAsAString = "9999999999";
    System.out.println(Integer.toHexString(BigDecimal.valueOf(Double.valueOf(largeNumberAsAString)).intValue())); 

使用Integer.parseUnsignedInt

当数字大于2^31但小于2^32时,即在负整数范围内, 你可以这样做:

int n = Integer.parseUnsignedInt("CAFEBABE", 16);

(我这里用的是十六进制,这样更容易看出上面我们正好在那个范围内。)

但是 9_999_999_999 也超出了 unsigned int 范围。

如果您的输入值可以任意大,那么 涉及 BigInteger 是您最好的选择。

但是,如果您的值小于 263,那么您可以只使用 Long 而不是 Integer:

String dec = "9999999999";
String hex = Long.toHexString(Long.parseLong(dec));
System.out.println(hex);                             // 2540be3ff

Live demo.