代码之家  ›  专栏  ›  技术社区  ›  user unknown

打印格式调整小数点

  •  0
  • user unknown  · 技术社区  · 7 年前

    我喜欢打印大量介于-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 
    

    有优雅的解决方案吗?

    3 回复  |  直到 7 年前
        1
  •  1
  •   nicodp    7 年前

    实际上,您可以添加 -+ 同样,在格式化之前:

    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
  •  1
  •   SergGr    7 年前

    虽然已经有一个公认的答案,但我会再添加一个,以供将来参考。斯卡拉 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
  •  0
  •   user unknown    7 年前

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

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

    不,加号不是一个选项。