web-dev-qa-db-fra.com

Format dans les modèles de chaîne kotlin

Kotlin possède 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 un formatage dans les modèles? Par exemple, j'aimerais formater Double dans des modèles de chaîne dans kotlin, tout 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"?
124
MajesticRa

Malheureusement, il n’existe pas encore de prise en charge intégrée du formatage dans les modèles de chaîne. En guise de solution de contournement, vous pouvez utiliser quelque chose comme:

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

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

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

Il y a clairement une fonctionnalité qui manque ici à Kotlin pour le moment, nous allons la réparer.

160
Andrey Breslav

En guise de solution de contournement, Il existe une fonction Kotlin stdlib qui peut être utilisée de manière conviviale et parfaitement compatible avec le format String de Java (il ne s'agit que d'une enveloppe autour de la String.format() de Java).

Votre code serait:

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

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

Usage

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

C'est simple, Utilisez:

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

Étant donné que String.format est uniquement une fonction d'extension (voir here ) qui appelle Java.lang.String.format en interne, vous pouvez écrire votre propre fonction d'extension à l'aide de 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
2
Willi Mentzel

Un grand nombre de réponses font référence à String.format et aux informations associées, mais pas à la position correcte dans la dernière branche principale. Pour référence, this est où il se trouve maintenant.

0
Martmists