【问题标题】:Best way to get integer part of the string "600sp"?获取字符串“600sp”整数部分的最佳方法?
【发布时间】:2011-04-02 22:31:03
【问题描述】:

我有一个字符串,比如“600sp”,我希望从中获取整数部分 (600)。

如果我执行Integer.valueOf("600sp"),我会因为字符串中遇到的非数字值“s”而出现异常。

获取整数部分最快最干净的方法是什么?

谢谢!

【问题讨论】:

  • 数字部分是否保证先出现?它总是一个三位数的数字吗?
  • 是的,它总是一个可变长度的数字,后跟 sp。

标签: java string integer type-conversion


【解决方案1】:

如果你的字符串格式总是数字后跟一些字符,那么试试这个

mystr.split("[a-z]")[0]

【讨论】:

  • 如果输入空字符串会崩溃,如果输入带有国际字符的字符串会产生无效结果
  • 我将它包装在一个 try-catch 中。如果字符串以字符串以外的任何内容开头,那么我不需要任何内容​​。我自己在 xml 布局(Android 应用程序)中设置了这个值,所以我会注意始终使用一个数字值,其后跟单位 (sp),它是 Android 布局中的 Scaled Pixels。
  • 请注意第一行“如果您的字符串格式...”。我的假设是 mystr 在到达这一点之前会检查错误。
  • 如果数字部分出现在末尾怎么办?例如:“dir213”
【解决方案2】:

根据您输入的限制,您最好使用正则表达式。

    Pattern p = Pattern.compile("(\\d+)");
    Matcher m = p.matcher("600sp");
    Integer j = null;
    if (m.find()) {
        j = Integer.valueOf(m.group(1));
    }

这个正则表达式翻译为“给我字符串开头的一组连续数字,其中至少有 1 个数字”。如果您有其他约束,例如解析实数而不是整数,那么您需要修改代码。

【讨论】:

    【解决方案3】:

    对于更简短、更具体的解决方案,请添加更多上下文。

    StringBuffer numbers = new StringBuffer();
    for(char c : "asdf600sp".toCharArray())
    {
      if(Character.isDigit(c)) numbers.append(c);
    }
    
    System.out.println(numbers.toString());
    

    根据新信息,改进的解决方案:

    Integer.valueOf("600sp".replace("sp",""));
    

    【讨论】:

      【解决方案4】:

      你可以使用

      Integer.valueOf("0" + "600sp".replaceAll("(\\d*).*", "$1"))
      

      注意:

      使用此正则表达式,您将只保留初始数字。


      编辑: "0" + 用于在我没有数字时不会崩溃。谢谢@jherico!

      【讨论】:

      • 如果字符串不包含数字,这将崩溃。
      【解决方案5】:

      如果保证字符串(如您所说)是一个整数,后跟“sp”,我建议不要使用更通用的正则表达式解析器,它也可以接受其他变体(应该作为错误被拒绝)。

      只测试它是否以“sp”结尾,然后解析没有最后两个字符的子字符串。

      【讨论】:

        【解决方案6】:

        我知道这个问题已经回答了,但是你考虑过java.util.Scanner 吗?如果没有正则表达式或其他更复杂的字符串实用程序,它似乎完全符合要求。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2023-03-06
          • 1970-01-01
          • 2010-10-03
          • 2012-11-25
          • 1970-01-01
          • 2015-07-02
          • 2012-11-16
          相关资源
          最近更新 更多