2012-09-04 52 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"); 
} 
相关问题