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

답변:


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 7

37
내가 4 년 후에도 실수를합니까?
Warkst

6
2020 년을위한 새해 선물로 추가하십시오!
마크 마크

133

이 문제를 해결 코 틀린 다음 stdlib 기능이 멋진 방식으로 사용하고 자바의 문자열 형식과 완전히 호환 될 수있다 (이것은 자바의 주변 단지 래퍼 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

코 틀린에서 작동 1.3.21
FP Freely

28

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
현재 Kotlin v1.2.21에는 String.Companion.format이 없습니다. 대안은 무엇입니까?.
Sai


3

내부적으로 호출 String.format하는 확장 함수 ( here 참조 ) 이므로 유연성이 더 필요한 경우 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.