web-dev-qa-db-ja.com

JavaのBigDecimalから末尾のゼロを削除する

_RoundingMode.HALF_UP_とともにBigDecimalから末尾のゼロを削除する必要があります。例えば、

_Value        Output

15.3456  <=> 15.35
15.999   <=> 16            //No trailing zeros.
15.99    <=> 15.99
15.0051  <=> 15.01
15.0001  <=> 15           //No trailing zeros.
15.000000<=> 15           //No trailing zeros.
15.00    <=> 15           //No trailing zeros.
_

stripTrailingZeros() は機能しますが、次のような状況では科学表記法を返します。

_new BigDecimal("600.0").setScale(2, RoundingMode.HALF_UP).stripTrailingZeros();
_

この場合、_6E+2_を返します。これはJSFのカスタムコンバーターで必要です。エンドユーザーにとってはいかもしれません。それで、これを行う適切な方法は何ですか?

50
Tiny

toPlainString() を使用します

BigDecimal d = new BigDecimal("600.0").setScale(2, RoundingMode.HALF_UP).stripTrailingZeros();
System.out.println(d.toPlainString()); // Printed 600 for me

私は(まだ)JSFには興味がありませんが、コンバーターは次のようになります。

@FacesConverter("bigDecimalPlainDisplay")
public class BigDecimalDisplayConverter implements Converter {
    @Override
    public Object getAsObject(FacesContext context, UIComponent component, String value) {
        throw new BigDecimal(value);
    }

    @Override
    public String getAsString(FacesContext context, UIComponent component, Object value) {
        BigDecimal  bd = (BigDecimal)value;
        return bd.setScale(2, RoundingMode.HALF_UP).stripTrailingZeros().toPlainString();
    }
}

そして、xhtmlで:

<h:inputText id="bigDecimalView" value="#{bigDecimalObject}" 
    size="20" required="true" label="Value">
    <f:converter converterId="bigDecimalPlainDisplay" />
</h:inputText>
60
Adrian Adamczyk

stripTrailingZeros() もうまくいかないことに注意してください。

これについて:

val = new BigDecimal("0.0000").stripTrailingZeros();
System.out.println(val + ": plain=" + val.toPlainString());

val = new BigDecimal("40.0000").stripTrailingZeros();
System.out.println(val + ": plain=" + val.toPlainString());

val = new BigDecimal("40.50000").stripTrailingZeros();
System.out.println(val + ": plain=" + val.toPlainString());

出力(Java 7):

0.0000: plain=0.0000
4E+1: plain=40
40.5: plain=40.5

出力(Java 8):

0: plain=0
4E+1: plain=40
40.5: plain=40.5

0.0000 Java 7の問題は、Java 8で次のように修正されます Java修正

28
Cornel B

String.format() でこれを達成することもできます。

final BigDecimal b = new BigDecimal("600.0").setScale(2, RoundingMode.HALF_UP);
String f = String.format("%.0f", b);
System.out.println(f); //600
5
MrLore

BigDecimalオブジェクトでこれを行い、フォーマッタでStringに変換しない場合は、Java 8で2つの手順を実行できます。

  1. stripTrailingZeros()
  2. スケール<0の場合、スケールを0に設定します。

このスニペットを試して、動作をよりよく理解できます

BigDecimal bigDecimal = BigDecimal.valueOf(Double.parseDouble("50"));
bigDecimal = bigDecimal.setScale(2);
bigDecimal = bigDecimal.stripTrailingZeros();
if (bigDecimal.scale()<0)
    bigDecimal= bigDecimal.setScale(0);
System.out.println(bigDecimal);//50
bigDecimal = BigDecimal.valueOf(Double.parseDouble("50.20"));
bigDecimal = bigDecimal.setScale(2);
bigDecimal = bigDecimal.stripTrailingZeros();
if (bigDecimal.scale()<0)
    bigDecimal= bigDecimal.setScale(0);
System.out.println(bigDecimal);//50.2
bigDecimal = BigDecimal.valueOf(Double.parseDouble("50"));
bigDecimal = bigDecimal.setScale(2);
bigDecimal = bigDecimal.stripTrailingZeros();
System.out.println(bigDecimal);//5E+1
bigDecimal = BigDecimal.valueOf(Double.parseDouble("50.20"));
bigDecimal = bigDecimal.setScale(2);
bigDecimal = bigDecimal.stripTrailingZeros();
System.out.println(bigDecimal);//50.2
2

BigDecimalで計算を行ってから、半分に切り上げる必要があります。

    BigDecimal toPay = new BigDecimal(1453.00005);
    toPay = toPay.multiply(new BigDecimal(1)).setScale(2, RoundingMode.HALF_UP)

それは私のために働いた。

1
TomekLach

DecimalFormat を使用できます。例えば:

BigDecimal value = new BigDecimal("15.3456").setScale(2, BigDecimal.ROUND_HALF_UP));
String valueString = new DecimalFormat("#.##").format(value);
System.out.println(valueString); //15.35

試してみてください。

0
Liem Nguyen