C fprintf%g Scala / Java中的对应关系

时间:2014-02-04 15:57:02

标签: c scala printf

我必须自动比较C程序的文本输出和转换为Scala。不幸的是,我找不到以同样的方式格式化double值的方法。在C中我有例如:

double diff = -1.0;  // just an example
fprintf(stdout, "diff %g\n", diff);

这写成

diff -1

(无小数点)。

在Scala我有

val diff = -1.0;  // just an example
println(f"diff $diff%g\n")

这写成

diff -1.00000

换句话说,%g格式化程序不会这样做。我正在寻找at this document,但无法获得100%兼容的fprintf格式。


修改Without using JNI or writing page long special methods.

3 个答案:

答案 0 :(得分:1)

Scala使用记录的here Java Formatter类。得到你想要的:

scala> "%.0g".format(-1.0)
res0: String = -1

答案 1 :(得分:1)

好的,@ {john-douthat this is an identical question great answer,需要进行一些小调整:

def ¬(x: Double) = {
  val obj = x.toFloat.asInstanceOf[AnyRef]
  String.format("%.6g", obj).replaceFirst("\\.?0+(e|$)", "$1")
}

val diff = -1.0
println(s"diff ${¬(diff)}")
println(s"Pi ${¬(math.Pi)}")

输出:

diff -1
Pi 3.14159

但仍有一些问题。例如,-3.59847e-10输出为-3.59847e-1。这是replaceFirst的正则表达式中的错误。如果有人能比这更好地解决它,我会非常高兴(正则表达式与我有精神错配):

def ¬(x: Double) = {
  val obj = x.toFloat.asInstanceOf[AnyRef]
  val s0  = String.format("%.6g", obj)
  val i0  = s0.lastIndexOf('e')
  val i   = if (i0 < 0) s0.length else i0
  s0.substring(0, i).replaceFirst("\\.?0+($)", "$1") + s0.substring(i)
}

答案 2 :(得分:0)

检查

  val diff = -1.0               //> diff  : Double = -1.0
  "diff %g\n".format(diff)      //> res6: String = "diff -1.00000
                                //| "