【问题标题】:Parsing a Hexadecimal String to an Integer throws a NumberFormatException?将十六进制字符串解析为整数会引发 NumberFormatException?
【发布时间】:2012-07-07 20:12:02
【问题描述】:

所以,在 Java 中,你知道如何像这样声明整数:

int hex = 0x00ff00;

我认为你应该能够扭转这个过程。我有这个代码:

Integer.valueOf(primary.getFullHex());

其中 primary 是自定义 Color 类的对象。它的构造函数接受一个整数表示不透明度(0-99)和一个十六进制字符串(例如00ff00)。

这是getFullHex 方法:

public String getFullHex() {
    return ("0x" + hex);
}

当我调用这个方法时,它给了我这个NumberFormatException

java.lang.NumberFormatException: For input string: "0xff0000"

我不明白发生了什么。谁能解释一下?

【问题讨论】:

    标签: java integer parseint hex


    【解决方案1】:

    这会有帮助吗?

    Integer.parseInt("00ff00", 16)
    

    16 表示您应该将字符串解释为基于 16 的(十六进制)。使用2可以解析二进制数,8代表八进制。 10 是默认值,解析十进制数。

    在您的情况下,Integer.parseInt(primary.getFullHex(), 16) 将无法工作,因为 0x 前缀由 getFullHex() 前缀 - 摆脱,你会没事的。

    【讨论】:

    • 谢谢!我不知道Integer.parseInt(..) 可以带另一个参数!感谢您为我解决这个问题!
    • 不工作 java.lang.NumberFormatException: Invalid int: "0x920B540C", color2 = Integer.parseInt(color_2,16); (带 argbA)
    • 即使从输入字符串"0x920B540C"中去掉0x前缀并以16进制解析,十六进制920B540C还是十进制2450215948,大于a的最大值32 位签名 int 可以保存(十进制 2147483647,十六进制 0x7FFFFFFF - 请参阅 Integer.MAX_VALUE)。您必须改用 64 位有符号 long(Java 没有无符号整数类型)。
    • 我来这里是为了寻找一个优雅的解决方案来摆脱 0x。所以 -1 不提Integer.decode()
    【解决方案2】:

    Integer.valueOf(string) 采用十进制表示。您必须指定数字为十六进制格式,例如

    int value = Integer.valueOf("00ff0000", 16); 
    

    注意Integer.valueOf(string,16);不接受 0x 前缀。如果您的字符串包含0x 前缀,则可以使用Integer.decode("0x00ff0000");

    【讨论】:

    • 嘿,这仅适用于 00ff0000 不适用于 80ff0000 。我有像 String hex="803BB9FF"; 这样的字符串我想把它转换成 int color=0x803BB9FF 请帮忙
    • @AshishSahu 如果您不描述会发生什么以及您期望会发生什么,就不可能提供帮助。 0x803BB9FF 为 -2143569409(因为 Java 中的 int 已签名)。那么 -2143569409 的“不工作”是什么?
    • 我有 8char 颜色字符串,例如“803BB9FF”,现在我想将其转换为 int 值,例如 0x803BB9FF (int) 我尝试使用“003bb9ff”,然后它可以正常工作,但不能使用 80 前缀
    • 但是感谢您的回复我的投票+。现在我得到了另一个解决方案: int color=Color.parseColor("#"+"803bb9ff");
    • Integer.decode 正是我所需要的! - 它基本上是 parseInt,但可以处理更多种类的输入格式
    【解决方案3】:

    尝试使用解码方法:

    Integer.decode("0x00ff00");
    

    可解码字符串:

    • Signopt DecimalNumeral
    • Signopt 0x HexDigits
    • Signopt 0X HexDigits
    • Signopt #HexDigits
    • Signopt 0 个八进制数

    你可以在这里阅读 https://docs.oracle.com/javase/7/docs/api/java/lang/Integer.html#decode(java.lang.String)

    【讨论】:

    • 最佳答案恕我直言。
    • 只是补充一点,这不处理二进制 (0b...) 前缀
    【解决方案4】:

    parseInt 方法只接受数字部分,而不接受任何类型的“base”指示符,例如十六进制的“0x”或八进制的“0”。像这样使用它

    int decimal = Integer.parseInt("1234", 10);
    int octal = Integer.parseInt("1234", 8);
    int hex = Integer.parseInt("1234", 16);
    

    【讨论】:

      【解决方案5】:

      应该这样做:

      String hex = "FA"; 
      int intValue = Integer.parseInt(hex, 16);
      

      如果要生成整数的十六进制表示,请使用

      String hex = Integer.toHexString(12); 
      

      【讨论】:

        【解决方案6】:

        这行得通吗?

        Long.parseUnsignedLong(value, 16);
        

        【讨论】:

          猜你喜欢
          • 2013-10-22
          • 2011-04-08
          • 2023-03-25
          • 1970-01-01
          • 2015-08-02
          • 1970-01-01
          • 2012-08-29
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多