如何将十六进制颜色字符串解析为整数

4
我正在处理Robolectric的一些代码,具体来说是IntegerResourceLoader。当rawValue0xFFFF0000之类的值时,以下方法会抛出RuntimeException:
@Override
public Object convertRawValue( String rawValue ) {
    try {
        return Integer.parseInt( rawValue );
    } catch ( NumberFormatException nfe ) {
        throw new RuntimeException( rawValue + " is not an integer." );
    }
}

我尝试使用Integer.decode(String),但是它抛出了NumberFormatException异常,尽管语法似乎是正确的。

4个回答

6

decode() 是正确的方法,但它失败了,因为 0xFFFF0000 高于整数的最大限制 0x7fffffff。您可能需要考虑使用长整型。


2
以下方法在rawValue0xFFFF0000之类的值时会抛出RuntimeException异常。
这是因为Integer.parseInt方法无法处理前缀为0x的情况。
我尝试使用Integer.decode(String),但即使语法正确,它也会抛出NumberFormatException异常。根据Integer.decode Javadoc中的说明,该字符串必须表示一个正数,否则将抛出NumberFormatException异常。0xFFFF0000是一个负数,这可能导致异常被抛出。
解决方案:
如果您知道给定的值将采用0x[hexdigits]的形式,则可以使用Integer.parseInt(String, int)方法,它需要表示进制的参数。对于十六进制,进制是16。代码如下:
return Integer.parseInt(rawValue.split("[x|X]")[1], 16);

这里使用正则表达式[x|X]来分割字符串,它会在小写或大写的"x"字符处将rawValue分离开来,然后使用基数16将其传递给parseInt函数以解析十六进制。


1
如果你知道它是0x,你不需要使用split(每次转换颜色时编译正则表达式),而是可以使用一个O(1)操作:parseInt(rawValue.substring(2))。Java字符串已经为substring进行了优化(请参阅java.lang.String中的offsetcount字段)。 - TWiStErRob
1
那不行。我试过了。java.lang.NumberFormatException: Invalid int: "98E91E63",其中98是Alpha。 - sud007
@sud007 我的解决方案要求字符串为“0x98E91E63”,否则你可以使用Integer.parseInt("98E91E63", 16)来解析整数。 - Brian
1
@Brian 我尝试了同样的 Integer.parseInt("98E91E63", 16) 不起作用! - sud007

2

这就是Android的做法:

private int parseColor(String colorString) {
    if (colorString.charAt(0) == '#') {
        // Use a long to avoid rollovers on #ffXXXXXX
        long color = Long.parseLong(colorString.substring(1), 16);
        if (colorString.length() == 7) {
            // Set the alpha value
            color |= 0x00000000ff000000;
        } else if (colorString.length() != 9) {
            throw new IllegalArgumentException("Unknown color");
        }
        return (int)color;
    }
    throw new IllegalArgumentException("Unknown color");
}

1

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