Format dans les modèles de chaîne kotlin


199

Kotlin a une excellente fonctionnalité appelée modèles de chaînes. Je l'aime vraiment.

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

Mais est-il possible d'avoir une mise en forme dans les modèles? Par exemple, je voudrais formater Double dans des modèles de chaîne en kotlin, au moins pour définir un nombre de chiffres après un séparateur décimal:

val pi = 3.14159265358979323
val s = "pi = $pi??" // How to make it "pi = 3.14"?

Existe-t-il une solution multiplateforme à cela?
KenIchi

Réponses:


248

Malheureusement, il n'y a pas encore de support intégré pour le formatage dans les modèles de chaîne, comme solution de contournement, vous pouvez utiliser quelque chose comme:

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

la .format(n)fonction dont vous auriez besoin pour vous définir

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

Il y a clairement un élément de fonctionnalité qui manque à Kotlin pour le moment, nous allons le corriger.


7
Est-ce disponible maintenant?
Ragunath Jawahar

4
@RagunathJawahar, la réponse est toujours à jour, nous ne l'avons pas encore amélioré
Andrey Breslav

3
@AndreyBreslav Et maintenant? Est-ce disponible?
cihan adil sept

37
Suis-je dans l'erreur ou n'est-ce toujours pas disponible près de 4 ans plus tard?
Warkst

6
Ajoutez-le comme cadeau du Nouvel An pour 2020!
marquez le

132

Comme solution de contournement, il existe une fonction stdlib de Kotlin qui peut être utilisée de manière agréable et entièrement compatible avec le format String de Java (ce n'est qu'un wrapper autour de JavaString.format() )

Voir la documentation de Kotlin

Votre code serait:

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

2
Je suppose qu'il voulait dire cette documentation: docs.oracle.com/javase/8/docs/api/java/lang/…
stuckj

@Rob Voir aussi la discussion sur la documentation
Matt Mc

Fonctionne dans Kotlin 1.3.21
FP Librement le

28

La classe String de Kotlin a maintenant une fonction de formatage , qui utilise en interne la String.formatméthode 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)

Usage

val pi = 3.14159265358979323
val formatted = String.format("%.2f", pi) ;
println(formatted)
>>3.14

1
String.Companion.format est introuvable dans Kotlin v1.2.21. Quelle est l'alternative?.
Sai

19

C'est simple, utilisez:

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

3

Étant donné qu'il String.formatne s'agit que d'une fonction d'extension (voir ici ) qui appelle en interne, java.lang.String.formatvous pouvez écrire votre propre fonction d'extension en utilisant DecimalFormat de Java si vous avez besoin de plus de flexibilité:

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

println(3.14159.format(2)) // 3.14

0

Quelques exemples:

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}")
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.