Kotlin – 字符串格式化

问题描述 投票:0回答:10

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"?
string-formatting kotlin
10个回答
364
投票

不幸的是,还没有对字符串模板中的格式设置的内置支持,作为解决方法,您可以使用类似以下内容:

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

您需要将自己定义为

.format(n)
函数

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

这只适用于 Kotlin/JVM。

显然,Kotlin 目前缺少一项功能,我们会修复它。


192
投票

作为一种解决方法,有一个 Kotlin stdlib 函数,可以很好地使用它,并且与 Java 的字符串格式完全兼容(它只是 Java 的

String.format()
的包装器)

请参阅 Kotlin 的 文档

您的代码将是:

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

45
投票

Kotlin 的 String 类现在有一个 format 函数,它内部使用了 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

42
投票

很简单,使用:

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

8
投票

由于

String.format
只是一个扩展函数(参见 here),它内部调用
java.lang.String.format
,如果您需要更大的灵活性,您可以使用 Java 的 DecimalFormat 编写自己的扩展函数:

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

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

4
投票

几个例子:

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}")


3
投票

科特林 1.9.10

String 的

format
方法接受格式化字符串和任意数量的可空 Any 类型的参数。

fun String.Companion.format(format: String, vararg args: Any?) : String

真实的代码可能如下所示:

fun main() {
    val pi: Double = 3.141592653589
    val gravity: Double = 9.80665
    var str = String.Companion.format("PI = %.2f %n G = %.2f", pi, gravity)

    println(str)
}

其中

%f
是十进制格式的浮点数,
%n
是行分隔符。

结果是:

//   PI = 3.14 
//    G = 9.81

0
投票

它具有 Kotlin for Android TextView 中的字符串格式示例:

val format = String.format("<font color=#3177a3> test1: <b>%s</b><br> test2: <b>%s</b><br> test3: <b>%s</b></font>", "value1", "value2", "value3")
textView.text = format

0
投票

作为多平台的简单解决方案,您可以使用:

import kotlin.math.abs
import kotlin.math.pow

fun Number.simpleFormat(numberDigitsAfterSeparator: Int = 0, decimalSeparator: Char = ','): String {
    if(numberDigitsAfterSeparator < 0)
        throw IllegalArgumentException("numberDigitsAfterSeparator should be >= 0 but is $numberDigitsAfterSeparator")

    val prefix = this.toInt()
    if(numberDigitsAfterSeparator == 0)return "$prefix"

    val sign = if(this.toDouble() >= 0.0) "" else "-"

    val afterSeparatorPart = abs(this.toDouble() - prefix)
    val suffixInt = (10.0.pow(numberDigitsAfterSeparator) * afterSeparatorPart).toInt()
    val suffix = if(afterSeparatorPart >= 1.0) "$suffixInt" else addNullsBefore(suffixInt, numberDigitsAfterSeparator)
    return "$sign${abs(prefix)}$decimalSeparator$suffix"
}

fun addNullsBefore(suffixInt: Int, numberDigitsAfterSeparator: Int): String {
    var s = "$suffixInt"
    val len = s.length
    repeat(numberDigitsAfterSeparator - len) { _ -> s = "0$s" }
    return s
}

测试:

fun main() {


    println((-0.00001).simpleFormat(5))
    println(3.1415927.simpleFormat(2))
    println(3.99.simpleFormat(2))
    println((-3.99).simpleFormat(2))

    println(3.1415927.simpleFormat())
    println(3.99.simpleFormat())
    println((-3.99).simpleFormat())

    println((-3.99).simpleFormat(-1))
}

输出:

-0,00001
3,14
3,99
-3,99
3
3
-3
Exception in thread "main" java.lang.IllegalArgumentException: numberDigitsAfterSeparator should be >= 0 but is -1..

-5
投票

它具有字符串格式 示例:

fun printSum(a: Int, b: Int): Unit {
    println("sum of $a and $b is ${a + b}")
}
© www.soinside.com 2019 - 2024. All rights reserved.