如何将十六进制颜色字符串解析为整数
Posted
技术标签:
【中文标题】如何将十六进制颜色字符串解析为整数【英文标题】:How to parse hex color String to Integer 【发布时间】:2012-08-29 10:46:35 【问题描述】:我正在编写 Robolectric 中的一些代码,即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." );
我尝试使用 Integer.decode(String),但即使语法似乎正确,也会引发 NumberFormatException。
【问题讨论】:
【参考方案1】:decode()
是正确的调用方法,但它失败了,因为 0xFFFF0000 高于整数的 0x7fffffff 最大限制。您可能需要考虑 Long。
【讨论】:
【参考方案2】:当
rawValue
是0xFFFF0000
之类的东西时,以下方法会抛出RuntimeException
这是因为 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
进行解析它是十六进制的。
【讨论】:
如果您知道它是 0x,则不需要使用 split(每次转换颜色时都会编译一个正则表达式),而是可以使用O(1)
操作:parseInt(rawValue.substring(2))
。 Java 字符串针对substring
进行了优化(请参阅java.lang.String
中的offset
和count
字段)
那行不通。我尝试过这个。 java.lang.NumberFormatException: Invalid int: "98E91E63" whre 98 是 Alpha
@sud007 我的解决方案要求字符串是“0x98E91E63”,否则你可以使用Integer.parseInt("98E91E63", 16)
来解析整数。
@Brian 我试过同样的Integer.parseInt("98E91E63", 16)
不起作用!【参考方案3】:
这就是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");
【讨论】:
【参考方案4】:如果你可以去掉前面的 0x,那么你可以设置 parseInt() 的基数。所以Integer.parseInt(myHexValue,16)
更多信息请参见http://docs.oracle.com/javase/6/docs/api/java/lang/Integer.html#parseInt(java.lang.String, int)
【讨论】:
以上是关于如何将十六进制颜色字符串解析为整数的主要内容,如果未能解决你的问题,请参考以下文章