首页 > 解决方案 > 如何参数化 StringContext 使用的格式字符串?

问题描述

假设我有这样一行代码:

log.info(f"$name%-20s $amt%7.2f")

我想要的是使20(的宽度name)本身可以参数化。我怎样才能做到这一点?

如果我也想让7.2宽度amt也参数化怎么办。那可能吗?

[编辑:我希望将和之类的东西20放在7.2变量中,这样它们就不会在格式字符串中硬编码。]

我试过StringContext直接使用,但似乎我不明白发生了什么宏扩展:

StringContext(...).f(...)

标签: scalaformattingscala-macros

解决方案


你离事实不远:

val amt= 1234.1234d
val name = "James"
println(f"|$name%20s $amt%7.2f|")

产量:

| James 1234,12|

关于传递 20 和 7.2 作为参数:模板可以生成为:

val len = 20
val prec = 7.2
val template = s"$$name%${len}s $$amt%${prec}f"

产生: $name%20 $amt%7.2f

但是字符串插值似乎并不是解决方案,因为它甚至被脱糖到 StringContext 中,它是在编译时完成的,然后 s"$template yield $name%20s $amt%7.2f

我想我有这个用另一种语言工作


推荐阅读