メソッドを使用して double をフォーマットすると、doubletoString
の完全な精度が得られます。例 ( Scala構文を使用):
java.text.MessageFormat.format ("{0}", Math.PI.toString)
以下を含む文字列になります。
3.141592653589793
ただし、この値はローカライズされていません。double 値を boxed として渡すと、次のようになりDouble
ます。
java.text.MessageFormat.format ("{0}", Math.PI.asInstanceOf[AnyRef])
(AnyRef
はJavaと同等の Scala 型です)の場合、結果は精度が切り捨てられたローカライズされた文字列になります。Object
3.142
書式文字列にさらにヒントを追加しても、結果は同じです。
java.text.MessageFormat.format ("{0,number}", Math.PI.asInstanceOf[AnyRef])
カスタム形式を指定することで、完全な精度を得ることができます。
java.text.MessageFormat.format ("{0,number,#.###############}", Math.PI.asInstanceOf[AnyRef])
ただし、これには double の大きさと精度に関するある程度の知識が必要です。( Piだけでなく) double 値を出力していて、値の完全な精度を保持したい場合、このアプローチは、書式文字列を動的に変更する必要があることを意味します。 ) フォーマット文字列は、実際にはリソース バンドルから取得されます。
たとえば、 の double 値を考えてみましょう1.0e37
。最初に文字列に変換し、フォーマット文字列として "{0}" を使用すると、適切ではあるがローカライズされていない文字列値になります1.0E37
。これをDouble
"{0,number}" の書式文字列でボックス化して渡すと、ばかげた値が得られます10,000,000,000,000,000,000,000,000,000,000,000,000
。
要するに、最初に double を文字列に変換せずに double の完全な精度を維持するフォーマット文字列を見つけることができないようです。これは、ペストのように避けたいものです。double の完全な精度をローカライズされた値として出力する数値書式文字列はありますか?
更新:
double を文字列に変換する必要がない理由を明確にするために:
toString
私が知る限り、有効なJava double リテラル値を返します。文字列として、結果は に渡されるときにローカライズされませんMessageFormat.format
。たとえば、 value のローカライズされた形式を出力したいとします1234.567
。toString
を返し"1234.567"
、MessageFormat.format
そのままにしておきます。罰金。私は自分の精密出力を持っています。ただし、ドイツでは、これは"1.234,567"
. 米国/英国でも、これは"1,234.567"
.- boxed
Integer
、Boolean
、またはその他の非浮動小数点プリミティブ型をMessageFormat.format
(単純な "{ n }" 形式で) に渡すと、適切にローカライズされた完全精度の出力が得られます。ローカライズされた出力が失われるため、最初にこれらの値を文字列に変換する必要はありません。これは、double (および float とBigDecimal
s) を別の方法で処理し、それらを に渡す前に文字列に変換する必要があることを意味しMessageFormat.format
ます。(さらに、毎回それを忘れずに行う必要があります。)