Kotlin文字列テンプレートでのフォーマット


199

Kotlinには、文字列テンプレートと呼ばれる優れた機能があります。私はそれを本当に愛しています。

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

しかし、テンプレートに書式を設定することは可能ですか?たとえば、kotlinの文字列テンプレートでDoubleをフォーマットしたいのですが、少なくとも小数点の後に桁数を設定します。

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

これに対するマルチプラットフォームのソリューションはありますか?
KenIchi

回答:


248

残念ながら、文字列テンプレートのフォーマットに対する組み込みサポートはまだありません。回避策として、次のようなものを使用できます。

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

.format(n)あなたとして自分自身を定義する必要があると思い機能

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

ここには明らかに現時点でKotlinから欠落している機能の一部があります。修正します。


7
これは現在利用できますか?
Ragunath Jawahar

4
@RagunathJawahar、答えはまだ最新で、まだ改善していません
Andrey Breslav

3
@AndreyBreslav今はどうですか?これは利用できますか?
シハンアディル2018

37
私は間違っているのですか、それともほぼ4年後にまだ利用できないのですか?
Warkst

6
2020年の新年のプレゼントとして追加してください!
マークマーク

132

回避策として、適切な方法で使用でき、Javaの文字列形式と完全に互換性のあるKotlin stdlib関数があります(JavaのラッパーにすぎませんString.format())。

Kotlinのドキュメントを参照

あなたのコードは次のようになります:

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

2
:私は彼がこのドキュメント意味を推測しているdocs.oracle.com/javase/8/docs/api/java/lang/...
stuckj

@Rob ドキュメントに関する説明も参照
Matt Mc

Kotlin 1.3.21で動作
FP Freely

27

KotlinのStringクラスには、内部的にJavaのメソッドを使用するフォーマット関数がありますString.format

/**
 * 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)

使用法

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

1
String.Companion.formatは現在Kotlin v1.2.21にはありません。代替手段は何ですか?
サイ

19

そのシンプルな使い方:

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

3

より内部的に呼び出すString.format拡張関数(ここを参照)だけなので、より柔軟性が必要な場合は、java.lang.String.formatJavaのDecimalFormatを使用して独自の拡張関数を記述できます。

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

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

0

いくつかの例:

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}")
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.