【问题标题】:Format in Kotlin string templatesKotlin 字符串模板中的格式
【发布时间】:2014-05-29 23:01:32
【问题描述】:

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


【解决方案1】:

不幸的是,在字符串模板中还没有对格式化的内置支持,作为一种解决方法,您可以使用类似的东西:

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

.format(n) 函数,您需要将自己定义为

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

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

【讨论】:

  • 现在可以使用了吗?
  • @RagunathJawahar,答案仍然是最新的,我们还没有改进
  • @AndreyBreslav 现在怎么样?这个可以吗?
  • 是我弄错了还是将近 4 年后仍然无法使用?
  • 添加为 2020 年的新年礼物!
【解决方案2】:

作为一种解决方法,There is a Kotlin stdlib function 可以很好地使用并与 Java 的字符串格式完全兼容(它只是 Java 的 String.format() 的包装器)

查看 Kotlin 的 documentation

您的代码将是:

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

【讨论】:

【解决方案3】:

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

【讨论】:

  • String.Companion.format 现在在 Kotlin v1.2.21 中找不到。有什么替代方案?。
【解决方案4】:

由于String.format 只是一个内部调用java.lang.String.format 的扩展函数(参见here),如果您需要更大的灵活性,您可以使用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

【讨论】:

    【解决方案5】:

    很简单,使用:

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

    【讨论】:

      【解决方案6】:

      几个例子:

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

      【讨论】:

        【解决方案7】:

        它具有字符串格式 示例:

        fun printSum(a: Int, b: Int): Unit {
            println("sum of $a and $b is ${a + b}")
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-10-23
          • 2012-07-22
          • 1970-01-01
          • 2015-07-03
          • 1970-01-01
          • 1970-01-01
          • 2014-11-08
          相关资源
          最近更新 更多