我有三个字符串,例如“A”,“B”,“C”。我必须产生的字符串的结果,从连接它们,只有第二个字符串必须填补空白,以给定的长度。
这是我的第一次尝试,由直觉和一般Scala newbiness指导:
val s1 = "A"
val s2 = "B"
val s3 = "C"
val padLength = 20
val s = s1 + s2.padTo(padLength, " ") + s3
这是错误的,因为padTo返回一个SeqLike,它的toString不返回内部的字符串,而是一个类似于Vector的表示。
在Scala中,最好的习惯方法是什么?
8条答案
按热度按时间hgtggwj01#
String
可以(通过这里隐式转换为StringOps
)被认为是一个 * 字符 * 的集合,所以你的填充应该是:在
String
上调用.padTo(padLength, " ")
实际上会返回Seq[Any]
,因为在序列中会同时出现字符和字符串。fcg9iug32#
你还没说你想往左还是往右。只需使用格式:
或者,在Scala 2.10之前(或者如果你需要“20”作为参数):
使用负填充将填充空间添加到右侧而不是左侧。
qnyhuwrf3#
有人应该提到你应该打开警告:
请注意,这样做(本身)没有错。
也许有一个用例:
或更好
由于这不是您的用例,也许您应该询问是否希望使用冗长且充满危险的API。
所以丹尼尔的答案才是正确的。我不知道为什么他的例子中的格式字符串看起来如此可怕,但它通常看起来更温和,因为在大多数可读的字符串中,您只需要在少数地方格式化字符。
需要添加虚假格式化程序的一种情况是需要换行符:
我认为这个函数应该处理f”$a%n$B”。哦,等等,2.11年就修好了。
所以现在真的没有理由不插进去了。
unguejic4#
有一个
formatted
方法可用。举例来说:format
:但我只会使用它,如果
padLength
可以直接嵌入。如果在其他地方定义了它(如在您的示例中),您可以使用
padTo
,就像Ellaysama指出的那样。如果你想“向左填充”,你可以使用一个隐式类:
0kjbasz65#
这一方法:
但感觉不太稳定
slwdgvem6#
这一点值得添加到Misc重新表述中:
这样就能为周日的教堂节省一些钱
我开始相信在这个非常不稳定的提交中利用mkString。
sqserrrh7#
oknwwptz8#
我相信Scala最惯用的方法是在一个由
.toString
方法转换为String
的单个空格Char
上使用*
操作符,所以它是: