[英]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.