Formatear en plantillas de cadena kotlin

199

Kotlin tiene una excelente característica llamada plantillas de cadena. Me encanta de verdad.

 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 plantillas de doble cadena en kotlin, al menos para establecer un número de dígitos después de un separador decimal:

val pi = 3.14159265358979323
val s = "pi = $pi??" // How to make it "pi = 3.14"?
MajesticRa
fuente
¿Hay alguna solución multiplataforma para esto?
KenIchi

Respuestas:

248

Desafortunadamente, todavía no hay soporte incorporado para formatear plantillas de cadena, como solución alternativa, puede 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)

Claramente, hay una funcionalidad aquí que le falta a Kotlin en este momento, lo arreglaremos.

Andrey Breslav
fuente
77
¿Está disponible ahora?
Ragunath Jawahar
44
@RagunathJawahar, la respuesta aún está actualizada, todavía no mejoramos
Andrey Breslav
3
@AndreyBreslav ¿Qué tal ahora? ¿Está esto disponible?
cihan adil siete
37
¿Me equivoco o todavía no está disponible casi 4 años después?
Warkst
66
¡Agrégalo como regalo de Año Nuevo para 2020!
mark mark
132

Como solución alternativa, hay una función stotlib de Kotlin que se puede usar de una manera agradable y totalmente compatible con el formato de cadena de Java (es solo un contenedor alrededor 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
fuente
2
Supongo que se refería a esta documentación: docs.oracle.com/javase/8/docs/api/java/lang/…
stuckj
@Rob Vea también la discusión sobre la documentación
Matt Mc
Funciona en Kotlin 1.3.21
FP libremente
27

La clase String de Kotlin tiene una función de formato ahora, que utiliza internamente el String.formatmé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
usuario1767754
fuente
1
String.Companion.format no se encuentra ahora en Kotlin v1.2.21. ¿Cuál es la alternativa?
Sai
19

Es simple, uso:

val str:String = "%.2f".format(3.14159)
masoomyf
fuente
3

Dado que String.formates solo una función de extensión (consulte aquí ) que llama internamente java.lang.String.format, podría escribir su propia función de extensión utilizando 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
fuente
0

Un par de ejemplos:

infix fun Double.f(fmt: String) = "%$fmt".format(this)
infix fun Double.f(fmt: Float) = "%${if (fmt < 1) fmt + 1 else fmt}f".format(this)

val pi = 3.14159265358979323

println("""pi = ${pi f ".2f"}""")
println("pi = ${pi f .2f}")
Alexander Logger
fuente