Удаление конечных нулей из BigDecimal в Java
Мне нужно удалить конечные нули из 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, где он может быть уродливым для конечных пользователей. Итак, каков правильный способ сделать это?
Ответы
Ответ 1
Используйте 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>
Ответ 2
Обратите внимание, что 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 fix.
Ответ 3
Вы также можете выполнить это с помощью 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
Ответ 4
Вы должны сделать некоторые вычисления в BigDecimal, а затем округлите его наполовину вверх, например.
BigDecimal toPay = new BigDecimal(1453.00005);
toPay = toPay.multiply(new BigDecimal(1)).setScale(2, RoundingMode.HALF_UP)
Это сработало для меня.
Ответ 5
Вы можете использовать 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
Попробуйте сами.
Ответ 6
Если вы хотите сделать это в своем объекте BigDecimal и не преобразовать его в String с форматированием, вы можете сделать это на Java 8 с помощью двух шагов:
- stripTrailingZeros()
- если масштаб < 0 setScale to 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