Formato en templates de cadenas kotlin

Kotlin tiene una excelente característica llamada templates de strings. Me encanta de verdad.

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

Pero, ¿es posible tener algún formatting en las templates? Por ejemplo, me gustaría formatear el doble en templates de cadena en kotlin, al less 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"? 

Desafortunadamente, aún no hay soporte integrado para formatear en templates de cadenas, como solución alternativa, puede usar algo como:

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

la function .format(n) que necesitarías para definirte a ti mismo como

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

Claramente hay una funcionalidad que falta en Kotlin en este momento, la arreglaremos.

Como solución alternativa, existe una function Kotlin stdlib que se puede utilizar de una forma agradable y totalmente compatible con el formatting String de Java (es solo un contenedor de String.format() de Java String.format() .

Tu código sería:

 val pi = 3.14159265358979323 val s = "pi = %.2f".format(pi) 

La class String de Kotlin ahora tiene una function de formatting , que internamente usa el método String.format 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 

Como String.format es solo una function de extensión (ver aquí ) que internamente llama a java.lang.String.format usted puede escribir su propia function 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 
  • jackson-dataformat-csv no ignora las properties desconocidas
  • ¿Cómo diferenciar entre una reference de miembro llamable encuadernada y una function del mismo tipo en kotlin?
  • Habilitar y deshabilitar una transmisión en kotlin
  • Diferencia entre una class y un object en Kotlin
  • Herencia de la interfaz: extiende una interfaz en Kotlin
  • Ejemplo de Kotlin foreachblock
  • JNI GetShortArrayElements falla con SIGSEGV SEGV_ACCERR
  • Kotlin: cómo henetworkingar la propiedad en la class de datos
  • Reino que devuelve datos obsoletos
  • eclipse organiza import no funciona con files kotlin
  • Analizando JSON con el análisis divertido de Kotlin JS <T> (text: String): T`?