String.toDouble în Kotlin

Text: conversii și formatare Kotlin 1.0 (toDoubleOrNull: 1.1)

Transformă un text într-un număr cu zecimale (Double); toDoubleOrNull returnează null dacă textul nu e număr.

Sintaxă
fun String.toDouble(): Double
fun String.toDoubleOrNull(): Double?

Ce face String.toDouble

"9.75".toDouble() returnează numărul 9.75. Separatorul zecimal este întotdeauna punctul, indiferent de limba sistemului. Sunt acceptate și numerele întregi ("10") și notația științifică ("1.5e3").

Un text cu virgulă zecimală, cum scriem în română ("9,75"), nu este acceptat: toDouble() aruncă NumberFormatException, iar toDoubleOrNull() returnează null. Înlocuiește întâi virgula cu punct.

Ce returnează

Double; toDoubleOrNull returnează Double?.

Exemple

Exemplul 1: Media unor note citite ca text

Fiecare notă este transformată în Double, apoi calculăm media.

fun main() {
    val note = "9.50 8.25 10 7.75".split(" ").map { it.toDouble() }
    println(note)
    println("Media: ${note.average()}")
}

Rezultat

[9.5, 8.25, 10.0, 7.75]
Media: 8.875

Exemplul 2: Virgula zecimală românească

Cu virgulă, conversia eșuează și primim null. După replace(',', '.') funcționează.

fun main() {
    val pret = "12,99"
    println(pret.toDoubleOrNull())
    println(pret.replace(',', '.').toDoubleOrNull())
    println("1.5e3".toDouble())
}

Rezultat

null
12.99
1500.0

Exemplul 3: Validarea unei sume

toDoubleOrNull ne lasă să tratăm separat sumele invalide, fără excepții.

fun main() {
    val sume = listOf("150.5", "o sută", "-20", "75")
    for (s in sume) {
        val valoare = s.toDoubleOrNull()
        when {
            valoare == null -> println("\"$s\" nu este o sumă")
            valoare < 0 -> println("$valoare: suma nu poate fi negativă")
            else -> println("$valoare lei acceptați")
        }
    }
}

Rezultat

150.5 lei acceptați
"o sută" nu este o sumă
-20.0: suma nu poate fi negativă
75.0 lei acceptați

Greșeli frecvente

  • Convertești direct „12,99” introdus de un utilizator român. Fără replace(',', '.') conversia eșuează.
  • Compari rezultatul cu == după calcule: 0.1 + 0.2 == 0.3 este false. Pentru bani, rotunjește sau lucrează în bani întregi (Long).

Comenzi înrudite

  • String.toInt: Transformă un text în număr întreg; toInt aruncă excepție la text invalid, toIntOrNull returnează null.
  • String.format: Construiește un text după un șablon cu marcaje ca %d, %s, %.2f, de exemplu pentru numere cu două zecimale.
  • Double.roundToInt: Rotunjește un Double la cel mai apropiat Int; jumătățile (2.5) se rotunjesc în sus.