【发布时间】:2018-01-23 22:43:59
【问题描述】:
我喜欢打印很多介于 -1 和 1 之间的数字,并且需要将它们按小数点对齐。
我得到的 %2.2f 是:
val (a, b) = (0.38, -0.38); println (f"${a}%2.2f\n${b}%2.2f ")
0,38
-0,38
我喜欢得到的是:
0,38
-0,38
有没有优雅的解决方案?
【问题讨论】:
我喜欢打印很多介于 -1 和 1 之间的数字,并且需要将它们按小数点对齐。
我得到的 %2.2f 是:
val (a, b) = (0.38, -0.38); println (f"${a}%2.2f\n${b}%2.2f ")
0,38
-0,38
我喜欢得到的是:
0,38
-0,38
有没有优雅的解决方案?
【问题讨论】:
您实际上可以做的是在格式之前添加-+:
scala> val (a, b) = (0.38, -0.38); println (f"${a}%-+2.2f\n${b}%-+2.2f")
+0.38
-0.38
a: Double = 0.38
b: Double = -0.38
你会在号码前得到+。
编辑:
如果你知道数字的位数(%n.m 的第一个数字表示数字的长度),你实际上可以这样:
scala> printf("%5.2f", a);
0.38
scala> printf("%5.2f", b);
-0.38
【讨论】:
虽然已经有一个公认的答案,但我会再添加一个以供将来参考。 Scala f"" 字符串插值器实际上使用了Java formatting infrastructure,在 Java 文档中您可能会发现以下标志:
' ''\u0020'要求输出包含一个用于非负值的额外空格 ('\u0020')。
所以你可能真的想使用它。这是一个显示差异的示例:
val arr = Array(0.38, -0.38, 10.38, -10.38, 123.38, -123.38)
println("Without space:")
arr.foreach(a => println(f"${a}%6.2f"))
println("----------------")
println("With space:")
arr.foreach(a => println(f"${a}% 6.2f"))
产生以下输出:
Without space:
0,38
-0,38
10,38
-10,38
123,38
-123,38
----------------
With space:
0,38
-0,38
10,38
-10,38
123,38
-123,38
注意 123.38/-123.38 的区别,即存在“溢出”的情况
【讨论】:
解决方法很简单:第一个数字不表示点之前的数字,而是数字总和,如果太短也不会产生错误消息。所以对于点后面的 2 位数字,加点,前面加上一个数字和一个可选的减号,我总共需要 5 位数字,然后就可以了:
val (a, b) = (0.38, -0.38); println (f"${a}%5.2f\n${b}%5.2f ")
0,38
-0,38
不,加号不是一个选项。
【讨论】: