【问题标题】:Kotlin parse double from stringKotlin 从字符串中解析双精度
【发布时间】:2025-12-15 19:10:01
【问题描述】:

在 Kotlin 中如何从字符串中解析双精度数或浮点数,如下所示:

var st: String? = "90 min"

尝试使用 toDoubleOrNull 但总是返回 0 或 null。

【问题讨论】:

    标签: android kotlin


    【解决方案1】:

    如果您确定数字始终位于开头,则使用split() 和空格作为分隔符,并从返回的列表中取出第一项并将其解析为Double

    val value = st!!.split(" ")[0].toDoubleOrNull()
    

    如果开头或中间有空格,请使用:

    val value = st!!.trim().split("\\s+".toRegex())[0].toDoubleOrNull() 
    

    substringBefore() 的另一种方式:

    val value = st!!.trim().substringBefore(" ").toDoubleOrNull()
    

    或者如果字符串中只有 1 个整数,则使用 replace() 删除每个非数字字符:

    val value = st!!.replace("\\D".toRegex(), "").toDoubleOrNull()
    

    【讨论】:

      【解决方案2】:

      你可以试试(假设你的字符串中只有一个数字序列)。

      否则,请查看其他答案

      val inputString = "123. Test"
      val regex = "\\d+(\\.\\d+)?".toRegex()
      val match = regex.find(inputString)
      
      if (match != null) {
          println("Result: " + match.value)
      } else {
          println("Result: Not found")
      }
      

      【讨论】:

      • 这需要更新以匹配 Doubles 而不仅仅是 Int。
      【解决方案3】:

      这应该可以...

      val pattern = Pattern.compile("\\d+") // the regex
      val matcher = pattern.matcher("hello123hgj") // your string
      val doubles = ArrayList<Double>() // results
      while (matcher.find())
      { // for each match
        doubles.add(Double.parseDouble(matcher.group())) // convert to double
      }
      

      【讨论】:

        【解决方案4】:

        这取决于你需要什么。如果你只需要得到 90 并且字符串总是以同样的方式格式化,你就可以

        var string = "90 min"
        var floatFromString = string.substring(0,2).toFloat()
        

        但最好学习如何使用 LocalDate 和 DateTimeFormatter

        【讨论】:

        • 请考虑如果字符串是"9999 min""area 51""3 boys""test 123 test" 之一,此实现将如何失败
        最近更新 更多