Kotlin String toDouble() 函数不解析某些值?

Kotlin String toDouble() function not parsing certain values?

为什么我的十进制字符串值没有转换?!给出 NumberFormatException 的值在使用 java.lang.Double.parseDouble 时工作得很好,但不建议在使用 Kotlin

时使用 java Double's

Image of results from using toDouble()

double 值为“ 39.05166667”

你的字符串有一个 Unicode u+FEFF byte order mark character at the beginning, which is defined as a "Zero width no-break space”。它甚至没有被定义为空格,所以 trim() 没有删除它!

我发现即使使用java.lang.Double.parseDouble,它也会失败。也许当你检查这个时,你无意中重新输入了字符串中有问题的部分。

您可以通过记录您的字符串的长度并观察它比预期长一个来检查它。

我不知道你是如何将这个字符放入你的字符串中的(也许是从某些 HTML 中复制它?),但你应该能够编写一个函数来 trim 它到安全地解析它:

fun String.fullTrim() = trim().replace("\uFEFF", "")

val number = "39.05166667".fullTrim().toDouble()

正如 kotlin 文档所说,您可以使用 "toDoubleOrNull()" 将字符串转换为 Double。如果字符串不是 Double 的有效表示,它将 return null。

以下是该值何时无效以及何时有效的示例:

  fun main(args: Array) {

    val dstr1 = "1.234567899999"
    val double1: Double? = dstr1.toDouble()
    println(double1)
    // 1.234567899999

    val dstr2 = "A1.23";
    val double2: Double? = dstr2.toDouble()
    // Exception in thread "main" java.lang.NumberFormatException: For input 
  string: "A1.23"

    val double2: Double? = dstr2.toDoubleOrNull()
    println(double2)
    // null
  }

如果错误仍然存​​在,请尝试全新 Android 构建。 Kotlin 的问题跟踪器上有一个错误,即 Gradle 构建任务没有完全正确地定义所有内容,偶尔需要干净的构建。这已针对最新版本的 Kotlin 得到修复。这个问题之前已经在这里回答过:String to Double on Android/Kotlin