将字符串转换为十六进制抛出 java.lang.NumberFormatException

convert string to hex throws java.lang.NumberFormatException

我有一个像 #FFFFFF 的颜色,我想把它转换成 0xFFFFFF

这是我转换它的代码:

val hexColor = "0x${picture.color.drop(1)}".toInt()

当我 运行 项目时我得到这个错误:

Exception in thread "main" java.lang.NumberFormatException: For input string: 
"0xFFFFFF"

知道为什么会出现此错误吗?

为了将十六进制 String 转换为 base10 数字并返回,请将基数作为参数传递给 toInt()-方法:使用 toInt(16) 表示十六进制数字。

如果您只想将 FFFFFF 转换为 0xFFFFFF,则不需要 .toInt(),其余的代码应该可以正常工作。

如果你想将颜色的值从十六进制转换为十进制,那么你可以使用 .toInt(16) 函数,不带基数 (0x) 开头,如下所示:

val color = picture.color.drop(1).toInt(16)

或使用 Integer.decode(),像这样:

val color = Integer.decode("0x${picture.color.drop(1)}")

在表达式 "0x${picture.color.drop(1)}".toInt() 中,0x 被添加到字符串中,然后被转换为 Int。 0x 对 Int 没有意义。所以先将其转换为 Int:

"0x${picture.color.drop(1).toInt()}"
// #FFFFFF --> 0x16777215 (wrong)

当然,将 0x 放在十进制数字之前会改变其 meaning/value。所以只将 Int 数字转换为十六进制:

"0x${picture.color.drop(1).toInt(16).toString(16)}"
// #FFFFFF --> 0xffffff  (lowercase because that's how it's represented)

但它是一个十六进制字符串。 你之前已经是一个十六进制字符串,前面多了一个#。所以只需 删除它并添加 0x:

"0x${picture.color.drop(1)}"
// #FFFFFF --> 0xFFFFFF

如果要将颜色存储为 int 并 print 十六进制,则合并第 1 部分和第 2 部分:

val actualColourValue = picture.color.drop(1).toInt(16)
println(actualColourValue)  // 16777215
println("0x${actualColourValue.toString(16)}")  // 0xffffff