【问题标题】:print format adjust decimal point打印格式调整小数点
【发布时间】: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 

有没有优雅的解决方案?

【问题讨论】:

    标签: scala format decimal


    【解决方案1】:

    您实际上可以做的是在格式之前添加-+

    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
    

    【讨论】:

    • 是的,没错,但不是一个选项。我从不写前面加号的数字,我认识的其他人也没有。该符号并没有提高负数的可见性,而是降低了负号的重要性。它不符合人体工程学。
    • 是的,我同时发现了自己。 :)
    【解决方案2】:

    虽然已经有一个公认的答案,但我会再添加一个以供将来参考。 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 的区别,即存在“溢出”的情况

    【讨论】:

      【解决方案3】:

      解决方法很简单:第一个数字不表示点之前的数字,而是数字总和,如果太短也不会产生错误消息。所以对于点后面的 2 位数字,加点,前面加上一个数字和一个可选的减号,我总共需要 5 位数字,然后就可以了:

       val (a, b) = (0.38, -0.38); println (f"${a}%5.2f\n${b}%5.2f ")
        0,38
       -0,38 
      

      不,加号不是一个选项。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-08-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-10-22
        相关资源
        最近更新 更多