[英]How to parse hex color String to Integer
我正在研究Robolectric中的一些代码,即IntegerResourceLoader
。 下面的方法是抛出一个RuntimeException
时候rawValue
是0xFFFF0000地址一些诸如:
@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.