【问题标题】:Convert String to Number, Java将字符串转换为数字,Java
【发布时间】:2014-06-17 07:49:58
【问题描述】:

编辑:澄清将任何有效的数字编码从字符串转换为数字

对于所有可接受的整数格式,尤其是在 Integer.parseInt 下抛出 NumberFormatException 的格式,如何将字符串转换为数字,例如整数。比如代码

...
int i = 0xff;
System.out.println(i);
String s = "0xff";
System.out.println( Integer.parseInt(s) );
....

将在第四行抛出 NumberFormatException,即使该字符串显然是十六进制整数的有效编码。我们可以假设我们已经知道编码是一个有效的数字,比如通过对照正则表达式检查它。最好也检查溢出(如 Integer.parseInt 所做的那样),但如果必须将其作为单独的步骤来完成,那就没问题了。

我可以遍历每个数字并手动计算合成,但这会非常困难。有没有更好的办法?

编辑:很多人都在用十六进制回答这个问题,这很好,但并不完全符合我的要求(这是我的错,我以十六进制为例)。我想知道是否有办法解码所有有效的java 编号。 Long.decode 绝对适合仅捕获十六进制,但在

上失败
222222L

这是一个完全有效的long。我是否必须分别捕获每种不同的数字格式?我假设您已经使用正则表达式来判断它是什么类别的数字,即区分浮点数、整数等。

【问题讨论】:

  • 如果你放弃0x,你可以打电话给Integer.parseInt(s, 16)
  • @dg123 这对十六进制有帮助,但一般不能解决问题——例如,不能捕获 111_111_111 或 1111111L。
  • @Blorgbeard 这也不是一个通用的解决方案。我当然可以手动检查所有情况,尽管这看起来确实是检查十六进制数字的好方法
  • 不要将数字与数字文字混淆。后者只是语法糖。

标签: java string numbers


【解决方案1】:

您需要指定要解析的数字的基数:

Integer.parseInt(s,16);

如果你有 "0x" 启动它,这将失败,所以你可以添加一个检查:

if (s.startsWith("0x")) {
    s = s.substring(2);
}
Integer.parseInt(s,16);

编辑

作为对这不是特定于十六进制问题的信息的回应,我建议您编写自己的方法来解析您喜欢的所有数字格式并在 Integer.decode 之上构建,这可以使您不必处理几个案例。

我会说使用regex 或创建您自己的方法来验证其他格式:

public static int manualDecode(String s) throws NumberFormatException {

    // Match against #####L long format
    Pattern p = Pattern.compile("\\d+L");  // Matches ########L
    Matcher m = p.matcher(s);
    if (m.matches()) {
        return Integer.decode(s.substring(0,s.length()-1));
    }

    // Match against that weird underscore format
    p = Pattern.compile("(\\d{1,3})_((\\d{3})_)*?(\\d{3})"); // Matches ###_###_###_###_###
    m = p.matcher(s);
    if (m.matches()) {
        String reformattedString = "";
        char c;
        for (int i = 0; i < s.length(); i++) {
            c = s.charAt(i);
            if ( c >= '0' && c <= '9') {
                reformattedString += c;
            }
        }
        return Integer.decode(reformattedString);
    }
    // Add as many more as you wish
    throw new NumberFormatException();
}

public int parseIntExtended(String s) {
    try {
        return Integer.decode(s);
    } catch (NumberFormatException e) {
        return manualDecode(s);
    }
}

【讨论】:

  • 并从字符串中删除 0x
  • 如果你这样做,Parseint 似乎会捕获十六进制,但它不会捕获 111_111_111,这是一个有效的整数文字
  • @en_Knight 我刚刚看到你所做的关于这不是十六进制特定的编辑。
【解决方案2】:

你可以的

System.out.println(Integer.decode(s));

【讨论】:

  • 这是 100% 的路要走!
  • 值得注意的是,这仅适用于表示正整数的十六进制值。例如:System.out.println(Integer.decode("0xfffffff4")); 将抛出 NumberFormatException
  • 这仅适用于十六进制,但不会解码所有整数。例如 111_111_111 是有效整数,但会抛出数字格式异常
【解决方案3】:

Integer.decode 应该可以解决问题:

public class a{
    public static void main(String[] args){
        String s="0xff";
        System.out.println(Integer.decode(s));
    }
}

【讨论】:

    【解决方案4】:

    您也可以尝试使用BigInteger,但您必须先删除0x 或从0 替换x

    int val = new BigInteger("ff", 16).intValue(); // output 255
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-02-11
      • 2011-11-25
      • 1970-01-01
      • 2023-03-17
      • 2013-01-29
      • 2011-01-08
      • 2011-08-06
      • 2013-12-19
      相关资源
      最近更新 更多