将十六进制字符串解析为整数时抛出NumberFormatException异常?

48

在Java中,您知道如何像这样声明整数:

int hex = 0x00ff00;

我认为你应该能够反转这个过程。我有以下的代码:

Integer.valueOf(primary.getFullHex());

primary是一个自定义颜色类的对象。它的构造函数接受一个Integer类型的不透明度参数(0-99)和一个十六进制字符串(e.g. 00ff00)。

这是getFullHex方法:

public String getFullHex() {
    return ("0x" + hex);
}

当我调用这个方法时,它会给我这个NumberFormatException

java.lang.NumberFormatException: For input string: "0xff0000"

我不理解正在发生什么。能否有人请解释一下?

6个回答

97

这会有帮助吗?

Integer.parseInt("00ff00", 16)

16 表示你应该将字符串解释为 16 进制数。使用 2 可以解析二进制数,8 表示八进制。默认情况下是 10,解析十进制数。

在你的情况下,primary.getFullHex() 方法返回的字符串前缀带有 0x ,因此 Integer.parseInt(primary.getFullHex(), 16) 无法正常工作 - 去掉前缀就可以了。


1
谢谢!我不知道 Integer.parseInt(..) 可以接受另一个参数!感谢你为我澄清这一点! - mattbdean
不起作用 java.lang.NumberFormatException: 无效的 int: "0x920B540C",color2 = Integer.parseInt(color_2,16);(带 argbA) - user3402040
1
即使您从输入字符串“0x920B540C”中删除“0x”前缀并将其解析为16进制,十六进制“920B540C”是十进制“2450215948”,这比32位有符号int可以容纳的最大值(十进制“2147483647”,十六进制“0x7FFFFFFF”-请参见Integer.MAX_VALUE)更大。您必须改用64位有符号long(Java没有无符号整数类型)。 - Remy Lebeau
2
我来到这里寻找一个优雅的解决方案,以摆脱0x。所以,没有提到Integer.decode(),我给它打了-1分。 - Line

40

1
在我看来,最佳答案。 - Pablo Santa Cruz
只是补充一下,这个程序无法处理二进制(0b...)前缀。 - Ben Kushigian

40

Integer.valueOf(string)假设传入的是十进制数。如果需要处理十六进制数据,需要指定数据格式,例如:

int value = Integer.valueOf("00ff0000", 16); 
请注意,Integer.valueOf(string,16); 不接受以 0x 为前缀的字符串。如果您的字符串包含 0x 前缀,您可以使用 Integer.decode("0x00ff0000");。

1
嘿,这只对00ff0000有效,而不是80ff0000。我有一个字符串,像这样:String hex="803BB9FF"; 我想将其转换为int color=0x803BB9FF,请帮忙。 - Ashish Sahu
@AshishSahu 当您不描述发生了什么以及您期望发生什么时,帮助是不可能的。0x803BB9FF是-2143569409(因为Java中的int是有符号的)。那么关于-2143569409有什么“不起作用”的问题呢? - nos
我有一个8位字符颜色字符串,例如“803BB9FF”,现在我想将其转换为int值,如0x803BB9FF(int)。我尝试使用“003bb9ff”,那么它可以工作,但是使用80前缀时无法工作。 - Ashish Sahu
3
谢谢回复并投了我的一票+。现在我有另一个解决方案:int color=Color.parseColor("#"+"803bb9ff"); - Ashish Sahu
3
Integer.decode 确实是我所需要的!它基本上就是 parseInt,但可以处理更多种类的输入格式。 - Krease
0x803BB9FFInteger.MAX_VALUE(0x7FFFFFFF)大,所以Integer.parseInt()Integer.decode()无法处理它。请使用Long代替。 - Remy Lebeau

3

parseInt 方法仅接受数字部分,不接受任何 "基数" 标识符,如十六进制的 "0x" 或八进制的 "0"。使用方法如下:

int decimal = Integer.parseInt("1234", 10);
int octal = Integer.parseInt("1234", 8);
int hex = Integer.parseInt("1234", 16);

2
"最初的回答":这个方案可行吗?
Long.parseUnsignedLong(value, 16);

这对我有用。我正在使用“800b6b0b”:2,148,231,947,刚好超过32位限制。 - indigo

0

这应该可以:

String hex = "FA"; 
int intValue = Integer.parseInt(hex, 16);

如果你想生成一个整数的十六进制表示,可以使用以下方法:

String hex = Integer.toHexString(12); 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接