Java 如何将十六进制颜色字符串解析为整数
我正在研究Robolectric中的一些代码,即Java 如何将十六进制颜色字符串解析为整数,java,integer,hex,robolectric,Java,Integer,Hex,Robolectric,我正在研究Robolectric中的一些代码,即IntegerResourceLoader。当rawValue为0xFFFF0000时,以下方法将抛出RuntimeException: @Override public Object convertRawValue( String rawValue ) { try { return Integer.parseInt( rawValue ); } catch ( NumberFormatException nfe )
IntegerResourceLoader
。当rawValue
为0xFFFF0000时,以下方法将抛出RuntimeException
:
@Override
public Object convertRawValue( String rawValue ) {
try {
return Integer.parseInt( rawValue );
} catch ( NumberFormatException nfe ) {
throw new RuntimeException( rawValue + " is not an integer." );
}
}
我尝试使用,但这会引发NumberFormatException,即使语法似乎正确。如果可以从前面去掉0x,则可以设置parseInt()的基数。所以
Integer.parseInt(myHexValue,16)
有关更多信息,请参见,int)
当rawValue
是0xFFFF0000
这是因为Integer.parseInt
不是为处理0x
前缀而设计的
我尝试使用Integer.decode(String),但这会引发NumberFormatException,即使语法看起来是正确的
从Integer.decode
Javadoc(在您的问题中链接):
此字符序列必须表示正值,否则将引发NumberFormatException
0xFFFF0000
是一个负数,因此这很可能是引发异常的原因
解决方案:
如果您知道给定的值的格式为0x[hexdigits]
,则可以使用以基数为单位的。对于十六进制,基数是16。像这样:
return Integer.parseInt(rawValue.split("[x|X]")[1], 16);
它使用regex
[x | x]
分割字符串,该字符串将在小写或大写“x”字符上分离rawValue
,然后将其以16为基数传递给parseInt
,以十六进制对其进行解析。decode()
是正确的调用方法,但它失败了,因为0xFFFF0000高于整数的0x7fffffff最大限制。你可能需要考虑长时间。 < P>这就是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,则不需要使用split(每次转换颜色时都会编译正则表达式),而是可以使用
O(1)
操作:parseInt(rawValue.substring(2))
。Java字符串针对不起作用的子字符串
进行了优化(请参见Java.lang.String
中的offset
和count
字段)。我试过了。java.lang.NumberFormatException:无效int:“98E91E63”98是什么Alpha@sud007我的解决方案要求字符串为“0x98E91E63”,否则您可以使用Integer.parseInt(“98E91E63”,16)
来解析整数。@Brian我尝试了相同的Integer.parseInt(“98E91E63”,16)
无效!