2016-05-13 7 views
1

小数点以下の桁数を最大値に設定したいと考えています。 another similar and popular question hereがありますが、それは私が探しているものではありません。フォーマットは最大小数点以下N桁まで

私はこのような何かを探しています、のは、私は最大にしたいとしましょう。 2つの場所なので、これは次のようになります。

1.00 -> "1" (not "1.00") 
1.20 -> "1.2" (not "1.20") 
1.23 -> "1.23" 
1.234 -> "1.23" 
1.235 -> "1.24" 

違い他の質問には、私はそれらを必要としない場合、私は、カンマの後ろに末尾のゼロを望んでいないということです。

私はないMath.round()、またはのDecimalFormatで、これはString.format()となんとかであるかどうかを知りたいのです。上に示したもう1つの質問は、DecimalFormatのソリューションを提供します。

答えは、引数としてNを与えられた変数である必要はありません。私はちょうど例としてNを選びました。

+0

ご質問の2番目の回答をご覧ください。 – Arkadiy

+0

[BigDecimalを使って](http://stackoverflow.com/a/13758367/836214)(リンク先の質問からの回答の1つ) – Krease

+0

解決策はString.format()で行われるように投稿されています。 – PseudoAj

答えて

2

あなたはDecimalFormatを使用することができます。

あなたは、ロケール固有の文字列に小数をフォーマットするときにDecimalFormatクラスを使用することができます。

文書を引用。このクラスを使用すると、先頭と末尾のゼロ、接頭辞と接尾辞、グループ分け(千単位)、小数点記号の表示を制御できます。

ポンド記号(#)は数字を表し、ピリオドは小数点 セパレータのプレースホルダです。

public void test(){ 
    DecimalFormat df = new DecimalFormat("#.##"); 
    System.out.println(df.format(1.00)); 
    System.out.println(df.format(1.20)); 
    System.out.println(df.format(1.23)); 
    System.out.println(df.format(1.234)); 
    System.out.println(df.format(1.235)); 
} 

出力:

1 
1.2 
1.23 
1.23 
1.24 

更新:あなたが質問を更新し、String.Formatのを使用していたことから、SOで検索すると、このthreadを発見し、トリックプラス正規表現を利用します。だから、あなたはこのようなものを使用することができます

public static void main (String[] args) throws java.lang.Exception 
{ 
    System.out.println(fmt(1.00)); 
    System.out.println(fmt(1.20)); 
    System.out.println(fmt(1.23)); 
    System.out.println(fmt(1.234)); 
    System.out.println(fmt(1.235)); 
} 

public static String fmt(double d) 
{ 
    if(d == (long) d) 
     return String.format("%d",(long)d); 
    else 
     return String.format("%.2f",d).replaceAll("0*$", ""); 
} 

出力は次のようになります。

1 
1.2 
1.23 
1.23 
1.24 

とにかく、私はのDecimalFormat代わりを使用します。

Javaコード:

+0

'N 'という言葉で小数点以下の桁数をどのように入れますか? – 4castle

+0

@ 4castleフォーマット文字列の小数点以下に* N * '#'記号があることを確認してください。 – EJP

+0

これをフォーマッタでエンコードする方法はありますか、 'StringBuilder'を使ってループ内にパターンを構築する必要がありますか? – 4castle

0

あなたはまだString.format()でそれをしたい場合は、別の解決策は、ここでのソリューションですParseN.java

public class ParseN{ 

    public static void main(String []args){ 
     System.out.println(parseN(1.00)); 
     System.out.println(parseN(1.20)); 
     System.out.println(parseN(1.23)); 
     System.out.println(parseN(1.234)); 
     System.out.println(parseN(1.235)); 
    } 

    static String parseN(Double d) 
    { 
     String s = String.format("%.2f", d); 
     s = s.indexOf(".") < 0 ? s : s.replaceAll("0*$", "").replaceAll("\\.$", ""); 
     return s; 
    } 
} 

が出力:

1 
1.2 
1.23 
1.23 
1.24 

は完全にそれを願っていますあなたの質問に答えます。また、 thisを参照してください。

+0

2正規表現を '\\。?0 * $'にまとめることができます。また、結果の文字列には常に小数点が存在するため、 'indexOf'三項は必要ありません。書式文字列に 'N 'を付けると、これはまだ完全な答えかもしれません。 – 4castle

2

またそうのようなsetMaximumFractionDigits(...)を使用してDecimalFormatの書式設定を制御できます。

double d = 1.234567; 
DecimalFormat df = new DecimalFormat(); 
for (int i = 2; i < 6; ++i) { 
    df.setMaximumFractionDigits(i); 
    System.out.println(df.format(d)); 
} 

これはStringBuilderまたは類似を使用してフォーマットを生成するよりもあなたのユースケースのために良いかもしれません。

+0

デフォルトでは、 'DecimalFormat'は[RoundingMode.HALF_EVEN'](https://docs.oracle.com/javase/7/docs/api/java/math/RoundingMode.html#HALF_EVEN)を使用します。 「5」。これを修正するには、 'df.setRoundingMode(RoundingMode.HALF_UP);を実行します。 – 4castle

関連する問題