【问题标题】:Extract last number after decimal提取小数点后的最后一个数字
【发布时间】:2017-08-31 12:12:03
【问题描述】:

我正在从 url 连接中获取一段 JSON 文本,并将其保存到当前的字符串中:

...//setting up url and connection
BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream()));
String str = in.readLine();

当我打印str时,我正确找到了数据{"build":{"version_component":"1.0.111"}}

现在我想从 str 中提取 111,但我遇到了一些麻烦。

我试过了 String afterLastDot = inputLine.substring(inputLine.lastIndexOf(".") + 1);

但我最终得到111"}}

我需要一个通用的解决方案,以便如果我有 String str = {"build":{"version_component":"1.0.111111111"}};,该解决方案仍然有效并提取 111111111(即,我不想硬编码提取小数点后的最后三位)

【问题讨论】:

  • 嗯。那么你在哪里使用正则表达式?
  • 你可以做 JSON
  • json.getBuild.getVersion_component
  • 您发布的代码没有意义。你的意思是整个事情都在一个字符串中?即"String str = {\"build\":{\"version_component\":\"1.0.111\"}};" 或者你的意思是String str = "{\"build\":{\"version_component\":\"1.0.111\"}};"
  • 字符串值必须以"开头并以"结尾

标签: java json regex substring


【解决方案1】:

使用正则表达式 (Rexp), 你可以这样解决你的问题;

Pattern pattern = Pattern.compile("111") ;
Matcher matcher = pattern.matcher(str) ;
while(matcher.find()){
    System.out.println(matcher.start()+" "+matcher.end());
    System.out.println(str.substring(matcher.start(), matcher.end()));
}

【讨论】:

  • 我对硬编码问题中所述的答案不感兴趣
【解决方案2】:

请,您可以尝试以下代码: ... int index = inputLine.lastIndexOf(".")+1 ; String afterLastDot = inputLine.substring(index, index+3);

【讨论】:

    【解决方案3】:

    只使用 JSON api

    JSONObject obj = new JSONObject(str);
    String versionComponent= obj.getJSONObject("build").getString("version_component");
    

    然后只拆分并取最后一个元素

    versionComponent.split("\\.")[2];
    

    【讨论】:

    • 错了。首先,他的代码中的str 是 0 意义!
    • 加上你给1.0.111
    【解决方案4】:

    如果您不能使用 JSON 解析器,那么您可以使用这个基于正则表达式的提取:

    String lastNum = str.replaceAll("^.*\\.(\\d+).*", "$1");
    

    RegEx Demo

    ^.* 是贪心匹配,匹配直到最后一个 DOT 之前的所有内容以及我们放入第 1 组的 1 个或多个数字以用于替换。

    【讨论】:

    • 如果 str 包含 1.0.111 而不是一次呢?
    • @user648026: OP 想要提取小数点后的最后一个数字
    【解决方案5】:

    找到您需要的字符串的startend 索引以及substring(start, end)

    // String str = "{"build":{"version_component":"1.0.111"}};" cannot compile without escaping
    String str = "{\"build\":{\"version_component\":\"1.0.111\"}}";
    
    int start = str.lastIndexOf(".")+1;
    int end = str.lastIndexOf("\"");
    String substring = str.substring(start,end);
    

    【讨论】:

    • 如果 str 包含 1.0.111 而不是一次呢?
    猜你喜欢
    • 2019-07-12
    • 1970-01-01
    • 2019-08-19
    • 2019-07-21
    • 1970-01-01
    • 1970-01-01
    • 2021-10-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多