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"?

¿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.


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)

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

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)

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

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}")
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.