จัดรูปแบบในเท็มเพลตสตริง kotlin


199

Kotlin มีคุณสมบัติที่ยอดเยี่ยมที่เรียกว่าแม่แบบสตริง ผมรักมัน.

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

แต่เป็นไปได้หรือไม่ที่จะมีการจัดรูปแบบในเทมเพลต? ตัวอย่างเช่นฉันต้องการจัดรูปแบบ Double ในเทมเพลตสตริงใน kotlin อย่างน้อยก็เพื่อกำหนดจำนวนหลักหลังตัวแยกทศนิยม:

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

มีวิธีแก้ไขปัญหาแบบมัลติแพลตฟอร์มหรือไม่?
KenIchi

คำตอบ:


249

น่าเสียดายที่ยังไม่มีการสนับสนุนการจัดรูปแบบในเทมเพลตสตริงในตัวคุณสามารถใช้บางสิ่งเช่น:

"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 แล้วตอนนี้ล่ะ? มีให้หรือไม่
cihan adil เจ็ด

37
ฉันเข้าใจผิดหรือยังไม่สามารถใช้งานได้เกือบ 4 ปีต่อมาหรือไม่
Warkst

6
เพิ่มเป็นของขวัญปีใหม่สำหรับปี 2020!
ทำเครื่องหมายเครื่องหมาย

133

วิธีการแก้ปัญหาคือมีฟังก์ชั่น Kotlin stdlibที่สามารถใช้งานได้อย่างดีและเข้ากันได้อย่างสมบูรณ์กับรูปแบบ String ของ Java (เป็นเพียงตัวห่อหุ้มรอบ ๆ Java String.format())

ดูเอกสารของ Kotlin

รหัสของคุณจะเป็น:

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

2
ฉันเดาว่าเขาหมายถึงเอกสารนี้: docs.oracle.com/javase/8/docs/api/java/lang/…
2560 เวลา 17:35 น.

@Rob ดูการอภิปรายเกี่ยวกับเอกสาร
Matt Mc

ทำงานใน Kotlin 1.3.21
FP ได้อย่างอิสระ

28

คลาส String ของ Kotlin มีฟังก์ชั่นการจัดรูปแบบในขณะนี้ซึ่งใช้String.formatวิธีการของ 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)

การใช้

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

1
ไม่พบ String.Companion.format ใน Kotlin v1.2.21 ทางเลือกคืออะไร?
สาย


3

เนื่องจากString.formatเป็นเพียงฟังก์ชันส่วนขยาย (ดูที่นี่ ) ซึ่งเรียกภายในjava.lang.String.formatคุณสามารถเขียนฟังก์ชันส่วนขยายของคุณเองโดยใช้DecimalFormatของ Java หากคุณต้องการความยืดหยุ่นมากขึ้น:

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.