Kotlin: formato de cadenas
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"?
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.
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)
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
Es simple, usa:
val str: String = "%.2f".format(3.14159)
Dado que String.format
es solo una función de extensión (ver aquí ) que llama internamente, java.lang.String.format
puede 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