Kotlin Функция String toDouble () не анализирует определенные значения? - PullRequest
0 голосов
/ 22 января 2020

почему мое десятичное строковое значение не преобразуется ?! Значение, которое дает NumberFormatException, прекрасно работает при использовании java .lang.Double.parseDouble, но не рекомендуется использовать java Double при работе в Kotlin

Изображение результатов от использования toDouble ()

двойное значение равно "39.05166667"

Ответы [ 2 ]

3 голосов
/ 22 января 2020

Ваша строка имеет Unicode u+FEFF знак порядка байтов в начале символа, который определяется как " Пробел нулевой ширины ". Он даже не определен как пробел, поэтому trim() не удаляет его!

Я обнаружил, что даже при использовании java.lang.Double.parseDouble произойдет сбой. Возможно, когда вы проверили это, вы случайно перепечатали проблемную c часть строки.

Вы можете проверить это, зарегистрировав длину вашей строки и заметив, что она длиннее, чем ожидалось.

Я не знаю, как вы взяли этот символ в свою строку (возможно, скопировав его из какого-то HTML?), Но вы должны быть в состоянии написать функцию для его обрезки, чтобы безопасно проанализировать его:

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

val number = "39.05166667".fullTrim().toDouble()
0 голосов
/ 22 января 2020

Как сказано в документации kotlin, вы можете использовать toDoubleOrNull () для преобразования строки в Double. Он вернет ноль, если строка не является допустимым представлением типа Double.

Вот пример того, когда значение недопустимо и когда оно действительно:

  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 на Android / Kotlin

...