2

浮動小数点数を最大桁数でフォーマットしようとしていますが、不要な末尾ゼロは必要ありません。g代わりに使用するとうまくいくと思いfました(この質問を参照)

def testF(d: Double) = f"$d%1.2f"
def testG(d: Double) = f"$d%1.2g"

これはかなり奇妙に動作します。

testF(3.1415)  // --> 3.14 ok
testF(3.1)     // --> 3.10 hmmm, don't want that zero

testG(3.1415)  // --> 3.1 what the ?

わかりましたので、おそらく の桁を 1 増やす必要がありますg

def testG(d: Double) = f"$d%1.3g"

testG(3.1415)  // --> 3.14 ok
testG(3.1)     // --> 3.10 grmpf

では、2 つの質問があります。1 つは、一体なぜg1 桁を落として、末尾のゼロを気にしないように見えるのでしょうか? 2、どうやって手に入れることができますか

testX(3.1415)  // --> 3.14
testX(3.1)     // --> 3.1

?

4

3 に答える 3

4

Java DecimalFormatを使用できますが、目を楽しませない場合があります。

def testX(d: Double) = new java.text.DecimalFormat("#.##").format(d)

また、最初の質問に答えるために、なぜ一体がg1桁落ちて、末尾のゼロを気にしないように見えるのか

浮動小数点変換 'e'、'E'、および 'f' の場合、精度は小数点以下の桁数です。変換が 'g' または 'G' の場合、精度は丸め後の結果の大きさの合計桁数です。

フォーマッタの詳細

于 2013-06-13T14:24:08.307 に答える
3

C の世界の printf と同様に、Java (および Scala)Formatterには最小フィールド幅と最大フィールド幅の両方が含まれています (%sフォーマット指定子用)。

// Minimum field width -- right-aligned
scala> "%23s".format(23)
res0: String = "                     23"

// Minimum field width -- left-aligned
scala> "%-23s".format(23)
res1: String = "23                     "

// Maximum field width with right truncation
scala> "%.3s".format(12345)
res2: String = 123

// Minimum and maximum width -- right aligned
scala> "%3.3s".format(1)
res3: String = "  1"

// Minimum and maximum width -- left aligned
scala> "%-3.3s".format(1)
res4: String = "1  "
于 2013-06-13T15:01:38.397 に答える
1

このバージョンはどうですか?

の使用にFormattable%sフォーマットが必要ですが、好きなように解釈するためのフォーマット引数が与えられます。

は-interpolationFormattableの途中でポップアップする可能性があります。これは、通常は かカスタム のいずれかを使用するためです。fformattoStringformatTo

package object succinctly {
  import java.util.{ Formattable, FormattableFlags, Formatter }
  import scala.language.implicitConversions
  implicit class Succinctly(val __thing: Double) extends AnyVal {
    @inline def succinctly(s: String): String = s format fmtable(__thing)
    @inline def succinctly: Formattable = fmtable(__thing)
  }
  private[this] val trailing = "(.*\\...*?)(0*)".r
  private[this] def fmtable(a: Double) = new Formattable {
    override def formatTo(formatter: Formatter, flags: Int, width: Int, precision: Int) = formatter.out append (
      if (precision <= 0) a.toInt.toString
      else s"%${width}.${precision}f" format a.asInstanceOf[java.lang.Double] match { case trailing(num, _) => num }
    )
  }
}

package succinctly {
  import scala.language.postfixOps
  import scala.math._
  object Test extends App {
    Console println (Pi succinctly "%1.2s")
    Console println (3.1 succinctly "%1.2s")
    Console println (3.0 succinctly "%1.2s")
    Console println f"${3.1 succinctly}%1.2s"
  }
}

-interpolator はマクロであるため、多少のコストはかかりますが、doubles を Trailless に昇格させて に変更するカスタム Interpolator を作成することも考えられます%f%sf

于 2013-06-14T04:10:24.587 に答える