Formatar em modelos de string kotlin

199

O Kotlin possui um excelente recurso chamado modelos de string. Eu realmente amo isso.

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

Mas é possível ter alguma formatação nos modelos? Por exemplo, eu gostaria de formatar Double em modelos de string no kotlin, pelo menos para definir um número de dígitos após um separador decimal:

val pi = 3.14159265358979323
val s = "pi = $pi??" // How to make it "pi = 3.14"?
MajesticRa
fonte
Existe alguma solução multiplataforma para isso?
KenIchi 21/01

Respostas:

248

Infelizmente, ainda não há suporte interno para formatação em modelos de string, como solução alternativa, você pode usar algo como:

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

a .format(n)função que você precisa para se definir como

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

Claramente, há uma parte da funcionalidade que está faltando no Kotlin no momento, vamos corrigi-la.

Andrey Breslav
fonte
7
Isso está disponível agora?
Ragunath Jawahar 13/03
4
@RagunathJawahar, a resposta ainda está atualizada, ainda não a aprimoramos
Andrey Breslav /
3
@AndreyBreslav Que tal agora? Isso está disponível?
Adil cihan sete
37
Estou enganado ou isso ainda não está disponível quase quatro anos depois?
Warkst 19/01/19
6
Adicione-o como presente de Ano Novo para 2020!
marca mark
132

Como solução alternativa, existe uma função stdlib do Kotlin que pode ser usada de uma maneira agradável e totalmente compatível com o formato String do Java (é apenas um invólucro do Java String.format())

Veja a documentação do Kotlin

Seu código seria:

val pi = 3.14159265358979323
val s = "pi = %.2f".format(pi)
akhy
fonte
2
Suponho que ele quis dizer esta documentação: docs.oracle.com/javase/8/docs/api/java/lang/…
stuckj
@Rob Veja também a discussão sobre a documentação
Matt Mc
Funciona no Kotlin 1.3.21
FP livremente
27

A classe String do Kotlin agora possui uma função de formato , que usa internamente o String.formatmétodo 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)

Uso

val pi = 3.14159265358979323
val formatted = String.format("%.2f", pi) ;
println(formatted)
>>3.14
user1767754
fonte
1
O String.Companion.format não foi encontrado agora no Kotlin v1.2.21. Qual é a alternativa?
Sai
19

É simples, use:

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

Como String.formaté apenas uma função de extensão (veja aqui ) que chama internamente, java.lang.String.formatvocê pode escrever sua própria função de extensão usando o DecimalFormat do Java, se precisar de mais flexibilidade:

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

println(3.14159.format(2)) // 3.14
Willi Mentzel
fonte
0

Alguns exemplos:

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}")
Alexander Logger
fonte