【问题标题】:How to parse hex color String to Integer如何将十六进制颜色字符串解析为整数
【发布时间】:2012-08-29 10:46:35
【问题描述】:

我正在编写 Robolectric 中的一些代码,即IntegerResourceLoader。当rawValue0xFFFF0000 之类的东西时,以下方法会抛出 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。

【问题讨论】:

    标签: java integer hex robolectric


    【解决方案1】:

    decode() 是正确的调用方法,但它失败了,因为 0xFFFF0000 高于整数的 0x7fffffff 最大限制。您可能需要考虑 Long。

    【讨论】:

      【解决方案2】:

      rawValue0xFFFF0000 之类的东西时,以下方法会抛出RuntimeException

      这是因为 Integer.parseInt 不是为处理 0x 前缀而设计的。

      我尝试使用 Integer.decode(String),但即使语法似乎正确,也会引发 NumberFormatException。

      来自Integer.decodeJavadoc(链接在您的问题中):

      此字符序列必须表示正值,否则将引发 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 中的offsetcount 字段)
      • 那行不通。我尝试过这个。 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)

        【讨论】:

          猜你喜欢
          • 2019-06-09
          • 1970-01-01
          • 2011-04-08
          • 2023-03-25
          • 2016-04-07
          • 1970-01-01
          • 2011-09-26
          • 2012-11-24
          相关资源
          最近更新 更多