public class TestClass {
@FormatBigDecimal
private BigDecimal myDecimal;
public TestClass(BigDecimal myDecimal) throws ParseException, IllegalAccessException {
this.myDecimal = myDecimal;
formatBigDecimalFields();
}
public void setMyDecimal(BigDecimal myDecimal) {
this.myDecimal = myDecimal;
}
public BigDecimal getMyDecimal() {
return myDecimal;
}
/**
In the above method, we are using reflection to get all the fields declared in the class. Then, we are iterating over all the fields and checking whether the @FormatBigDecimal annotation is present on the field. If it is present, we are making the field accessible and getting its value.
We are also getting the format string from the @FormatBigDecimal annotation and using it to create a DecimalFormat object with the desired format. Then, we are formatting the value of the field using the DecimalFormat object and storing the formatted value in a string.
Finally, we are parsing the formatted value back into a BigDecimal object and setting it as the value of the field.
**/
public void formatBigDecimalFields() throws IllegalAccessException, ParseException {
Field[] fields = this.getClass().getDeclaredFields();
for (Field field : fields) {
if (field.isAnnotationPresent(FormatBigDecimal.class)) {
field.setAccessible(true);
BigDecimal value = (BigDecimal) field.get(this);
FormatBigDecimal formatAnnotation = field.getAnnotation(FormatBigDecimal.class);
String formatString = formatAnnotation.format();
NumberFormat format = NumberFormat.getNumberInstance(Locale.US);
DecimalFormat decimalFormat = (DecimalFormat) format;
decimalFormat.applyPattern(formatString);
String formattedValue = decimalFormat.format(value);
BigDecimal formattedDecimal = new BigDecimal(formattedValue);
field.set(this, formattedDecimal);
}
}
}
}
使用方法:
TestClass testClass = new TestClass(new BigDecimal("10000.899"));
System.out.println(testClass.getMyDecimal());
7条答案
按热度按时间gijlo24d1#
BigDecimal是不可变的,对其进行的任何操作(包括setScale(2,BigDecimal.ROUND_HALF_UP))都会生成一个新的BigDecimal。正确的代码应为
输出
注意--由于Java 9
BigDecimal.ROUND_HALF_UP
已被弃用,您现在应该使用RoundingMode.ROUND_HALF_UP
。r8xiu3jd2#
您可以使用上舍入格式
希望这对你有帮助。
cngwdvgl3#
要在JAVA中格式化数字,可以用途:
其中d是变量或数字
或
qni6mghb4#
您需要使用类似
NumberFormat
的内容,并使用与format对应的语言环境4ktjp1zp5#
bigDecimal.setScale就可以了。
nkkqxpd96#
下面的代码可能会有所帮助。
fdbelqdn7#
您可以按以下方式使用自定义注解:自定义注解
然后可以在字段上应用注解,并在构造函数中调用实现方法,如下所示:
使用方法:
将给予:
10000.90