繁体   English   中英

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

[英]How to parse hex color String to Integer

我正在研究Robolectric中的一些代码,即IntegerResourceLoader 下面的方法是抛出一个RuntimeException时候rawValue0xFFFF0000地址一些诸如:

@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。

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

下面的方法是抛出一个RuntimeException时候rawValue是一些诸如0xFFFF0000

这是因为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以十六进制解析它。

这是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");
}

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM