66

BigDecimalと一緒に末尾のゼロを削除する必要がありRoundingMode.HALF_UPます。例えば、

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のカスタムコンバーターでこれが必要です。それで、これを行う適切な方法は何ですか?

4

6 に答える 6

95

使用する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>
于 2013-07-21T09:33:11.183 に答える
40

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

Java 7の0.0000問題は、Java 8 では次のJava 修正によって修正されています。

于 2013-09-20T13:09:18.947 に答える
5

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
于 2013-07-21T09:37:49.077 に答える