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

时间:2012-09-04 18:15:34

标签: java integer hex robolectric

我正在研究Robolectric中的一些代码,即IntegerResourceLoader。当RuntimeException 0xFFFF0000 之类的内容时,以下方法会抛出rawValue

@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 个答案:

答案 0 :(得分:6)

decode()是正确的调用方法,但它失败,因为0xFFFF0000高于0x7fffffff整数的最大限制。你可能想要考虑Long。

答案 1 :(得分:2)

  

以下方法在RuntimeException rawValue0xFFFF0000时抛出Integer.parseInt

这是因为0x并非旨在处理Integer.decode前缀。

  

我尝试使用Integer.decode(String),但即使语法看起来是正确的,也会引发NumberFormatException。

来自0xFFFF0000 Javadoc(在你的问题中链接):

  

这个字符序列必须表示正值,否则将抛出NumberFormatException。

0x[hexdigits]是一个负数,所以这可能是导致异常被抛出的原因。

<强>解决方案:

如果您知道给定的值将采用return Integer.parseInt(rawValue.split("[x|X]")[1], 16); 格式,那么您可以使用Integer.parseInt(String, int)取基数。对于十六进制,基数是16.像这样:

[x|X]

这使用正则表达式rawValue来拆分字符串,这将在小写或大写“x”字符上分隔parseInt,然后将其传递给{{1}} 16的基数用十六进制解析它。

答案 2 :(得分: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");
}

答案 3 :(得分:1)

如果你可以从前面剥离0x,那么你可以设置parseInt()的基数。所以Integer.parseInt(myHexValue,16)

有关详细信息,请参阅http://docs.oracle.com/javase/6/docs/api/java/lang/Integer.html#parseInt(java.lang.String,int)