Định dạng trong các mẫu chuỗi kotlin


199

Kotlin có một tính năng tuyệt vời được gọi là mẫu chuỗi. Tôi thực sự yêu thích nó.

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

Nhưng nó có thể có bất kỳ định dạng trong các mẫu? Ví dụ: tôi muốn định dạng Double trong các mẫu chuỗi trong kotlin, ít nhất là để đặt một số chữ số sau dấu phân cách thập phân:

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

Có bất kỳ giải pháp đa nền tảng cho điều này?
KenIchi

Câu trả lời:


248

Thật không may, chưa có hỗ trợ tích hợp để định dạng trong các mẫu chuỗi, như một cách giải quyết, bạn có thể sử dụng một cái gì đó như:

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

các .format(n)chức năng bạn cần phải xác định mình là

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

Hiện tại rõ ràng có một phần chức năng bị thiếu từ Kotlin, chúng tôi sẽ sửa nó.


7
Điều này có sẵn bây giờ?
Ragunath Jawahar

4
@RagunathJawahar, câu trả lời vẫn được cập nhật, chúng tôi vẫn chưa cải thiện về vấn đề này
Andrey Breslav 13/03/2015

3
@AndreyBreslav Làm thế nào bây giờ? Cái này có sẵn không?
cihan adil bảy

37
Tôi đã nhầm lẫn hay điều này vẫn chưa có sẵn gần 4 năm sau?
Warkst

6
Thêm nó như một món quà năm mới cho năm 2020!
đánh dấu đánh dấu

132

Như một giải pháp thay thế, có một hàm stdlib của Kotlin có thể được sử dụng một cách tốt đẹp và hoàn toàn tương thích với định dạng Chuỗi của Java (nó chỉ là một trình bao bọc xung quanh Java String.format())

Xem tài liệu của Kotlin

Mã của bạn sẽ là:

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

2
Tôi đoán anh ấy có ý nghĩa tài liệu này: docs.oracle.com/javase/8/docs/api/java/lang/ Kẻ
mắc kẹt

@Rob Xem thêm thảo luận về tài liệu
Matt Mc

Hoạt động trong Kotlin 1.3,21
FP Tự do

27

Hiện tại lớp String của Kotlin có chức năng định dạng , sử dụng String.formatphương thức Java trong nội bộ :

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

Sử dụng

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

1
String.Compmate.format hiện không tìm thấy trong Kotlin v1.2.21. Sự thay thế là gì?
Sai

19

Nó đơn giản, sử dụng:

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

3

String.formatchỉ là một hàm mở rộng (xem tại đây ) mà nội bộ gọi java.lang.String.formatbạn có thể viết hàm mở rộng của riêng bạn bằng cách sử dụng DecimalFormat của Java nếu bạn cần linh hoạt hơn:

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

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

0

Một vài ví dụ:

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}")
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.