我必须自动比较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
格式。
答案 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
//| "