Kotlin: formato de cadenas

Resuelto Dmitry Romanov asked hace 10 años • 10 respuestas

Kotlin tiene una característica excelente llamada plantillas de cadenas.

val i = 10 
val s = "i = $i" // evaluates to "i = 10"

¿Pero es posible tener algún formato en las plantillas? Por ejemplo, me gustaría formatear Double en plantillas de cadenas en Kotlin, al menos para establecer una cantidad de dígitos después de un separador decimal:

val pi = 3.14159265358979323
val s = "pi = $pi??" // How to make it "pi = 3.14"?
Dmitry Romanov avatar Apr 15 '14 21:04 Dmitry Romanov
Aceptado

Desafortunadamente, todavía no existe soporte integrado para formatear en plantillas de cadenas. Como solución alternativa, puedes usar algo como:

"pi = ${pi.format(2)}"

la .format(n)función que necesitarías para definirte como

fun Double.format(digits: Int) = "%.${digits}f".format(this)

Esto funcionará sólo en Kotlin/JVM.

Claramente hay una pieza de funcionalidad aquí que falta en Kotlin en este momento, la arreglaremos.

Andrey Breslav avatar Apr 15 '2014 15:04 Andrey Breslav

Como solución alternativa, existe una función stdlib de Kotlin que se puede usar de una manera agradable y totalmente compatible con el formato String de Java (es solo un contenedor de Java String.format())

Ver la documentación de Kotlin

Tu código sería:

val pi = 3.14159265358979323
val s = "pi = %.2f".format(pi)
akhy avatar Nov 03 '2015 06:11 akhy

La clase String de Kotlin ahora tiene una función de formatoString.format , que utiliza internamente el método de Java:

/**
 * Uses this string as a format string and returns a string obtained by substituting the specified arguments,
 * using the default locale.
 */
@kotlin.internal.InlineOnly
public inline fun String.Companion.format(format: String, vararg args: Any?): String = java.lang.String.format(format, *args)

Uso

val pi = 3.14159265358979323
val formatted = String.format("%.2f", pi) ;
println(formatted)
>>3.14
user1767754 avatar Dec 08 '2017 00:12 user1767754

Es simple, usa:

val str: String = "%.2f".format(3.14159)
masoomyf avatar Aug 25 '2018 11:08 masoomyf

Dado que String.formates solo una función de extensión (ver aquí ) que llama internamente, java.lang.String.formatpuede escribir su propia función de extensión usando DecimalFormat de Java si necesita más flexibilidad:

fun Double.format(fracDigits: Int): String {
    val df = DecimalFormat()
    df.setMaximumFractionDigits(fracDigits)
    return df.format(this)
}

println(3.14159.format(2)) // 3.14
Willi Mentzel avatar Dec 08 '2017 09:12 Willi Mentzel