簡體   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