2012-09-04 91 views
4

我正在Robolectric的一些代碼,即IntegerResourceLoader。下面的方法拋出RuntimeExceptionrawValue0xFFFF0000地址一些諸如:如何解析十六進制顏色字符串整數

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

回答

6

decode()是調用的正確方法,但因爲0xFFFF0000高於整數的0x7fffffff最大限制而失敗。你可能想考慮Long。

+1

這是正確的。 Long.decode()解決了這個問題。謝謝。 –

1

如果你可以去掉前面的0x,那麼你可以設置parseInt()的基數。所以Integer.parseInt(myHexValue,16)

瞭解更多信息

+0

Integer.decode這是否適合你。 –

2

下面的方法是拋出見http://docs.oracle.com/javase/6/docs/api/java/lang/Integer.html#parseInt(java.lang.String,INT)一RuntimeExceptionrawValue0xFFFF0000

這樣的東西。這是因爲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,然後將其傳遞以parseInt爲基數,以十六進制解析。

+1

如果你知道它是0x,你不需要使用split(每次你轉換一個顏色時編譯一個正則表達式),你可以使用'O(1)'操作:'parseInt(rawValue.substring(2) )'。 Java字符串針對'substring'進行了優化(參見'java.lang.String'中的'offset'和'count'字段) – TWiStErRob

+1

這不起作用。我嘗試過這個。 java.lang中。NumberFormatException:Invalid int:「98E91E63」whre 98 is Alpha – sud007

+0

@ sud007我的解決方案要求字符串是「0x98E91E63」,否則你可以用'Integer.parseInt(「98E91E63」,16)'來解析整數。 – Brian

2

這是機器人是如何做的:

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"); 
} 
相關問題