2014-04-15 26 views
72

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

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

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

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

Trả lời

86

Thật không may, không có hỗ trợ tích hợp cho định dạng trong mẫu chuỗi, như khắc phục, 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) = java.lang.String.format("%.${digits}f", this) 

có rõ ràng là một mảnh o f chức năng ở đây là mất tích từ Kotlin tại thời điểm này, chúng tôi sẽ sửa chữa nó.

+3

Đây có phải là sẵn ngay bây giờ ? –

+2

@RagunathJawahar, câu trả lời vẫn được cập nhật, chúng tôi đã không cải thiện trên nó chưa –

+0

@AndreyBreslav Định dạng nội suy chuỗi/giá trị kép như thế nào? Có phải điểm phụ thuộc vào dấu thập phân hay luôn là dấu chấm? –

60

Là một workaround, There is a Kotlin stdlib function 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 Java (nó chỉ là một wrapper quanh String.format() Java)

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

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

Xem thêm [tài liệu] (https://stackoverflow.com/questions/23086291/format-in-kotlin-string-templates) cho hàm đó –

+8

Dude liên kết tài liệu của bạn là câu hỏi này .. ?? – Rob

+2

Tôi đoán anh ấy có nghĩa là tài liệu này: https://docs.oracle.com/javase/8/docs/api/java/lang/String.html#format-java.util.Locale-java.lang.String- java.lang.Object ...- – stuckj

3

Kotlin của Lớp chuỗi hiện có chức năng format, trong đó nội bộ sử dụng phương thức String.format của 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) 

Cách sử dụng

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

String.Companion. không tìm thấy định dạng trong Kotlin v1.2.21. Phương án thay thế là gì ?. –

1

Kể từ String.format chỉ là một chức năng mở rộng (xem here) mà trong nội bộ gọi java.lang.String.format bạn có thể viết chức năng mở rộng của riêng bạn sử dụng Java của DecimalFormat 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 
Các vấn đề liên quan