Scala 如何参数化StringContext使用的格式字符串?

Scala 如何参数化StringContext使用的格式字符串?,scala,formatting,scala-macros,Scala,Formatting,Scala Macros,假设我有一行这样的代码: log.info(f"$name%-20s $amt%7.2f") 我想要的是使20(名称的宽度)本身可以参数化。我该怎么做 如果我还想使amt的7.2宽度也参数化,该怎么办。可能吗 [编辑:我希望将20和7.2等内容放入变量中,这样它们就不会硬编码为格式字符串。] 我曾尝试直接使用StringContext,但似乎我不了解在以下情况下发生的宏扩展: StringContext(...).f(...) 你的回答与事实并不遥远: val amt=1234.1234d

假设我有一行这样的代码:

log.info(f"$name%-20s $amt%7.2f")
我想要的是使
20
(名称的宽度)本身可以参数化。我该怎么做

如果我还想使
amt
7.2
宽度也参数化,该怎么办。可能吗

[编辑:我希望将
20
7.2
等内容放入变量中,这样它们就不会硬编码为格式字符串。]

我曾尝试直接使用
StringContext
,但似乎我不了解在以下情况下发生的宏扩展:

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

你的回答与事实并不遥远:

val amt=1234.1234d
val name=“詹姆斯”
println(f“|$name%20s$amt%7.2f”)
收益率:

|詹姆斯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
收益率
$name%20s$amt%7.2f


我想我使用了另一种语言

您可以实现您的StringContext
注:
s“a=${a},b=${b}”
s作为
StringContext(“a=”,“,b=”).s(a,b)

//试验

val amt = 1234.1234d
val name = "James"
val len = Format("20s")
val prec = Format("7.2f")

myFormat"$name%$len,$amt%$prec," //"               James,1234.12,"

你可以分两部分来做

val name = "Jan"
val nLen = -10  //name length

val amt = 1.1
val ff = 5.3  //float format

s"%${nLen}s".format(name) + s"%${ff}f".format(amt)
//res0: String = Jan       1.100
或者在一次过程中

s"%${nLen}s%${ff}f".format(name, amt)
//res1: String = Jan       1.100

谢谢,但我希望能找到一种方法,将20放入一个变量中,这样20就不会硬编码到格式字符串中
s"%${nLen}s%${ff}f".format(name, amt)
//res1: String = Jan       1.100