有没有一种方法可以使用Antation格式化带有固定长度添加分隔符的数字?I总是接收10个整数位置和2个小数,得到12 的固定长度
我使用的字段说明:
@Field(at=576, length=12, format="###.##")
private BigDecimal impTotal;
有一个例子:
Received: 00000000000150
Value expected: 1.50
我用这个来解决它,但我认为它可以减缓这个过程:
public BigDecimal getImpTotal() {
return impTotal.divide(new BigDecimal(100));
}
正如您所注意到的,您提供的模式不会强制字符串成为您所期望的。您可以按照当前的方式进行,但当您必须进行反向运算并以固定长度格式输出值时,您必须乘以100才能获得所需的输出。
最好使用TypeHandler实现来为您完成所有这些操作。我不能评论你的实现与类型处理程序的性能,你需要对它进行基准测试
您需要实现org.beanio.types.TypeHandler
接口。有关的进一步解释,请参阅JavaDoc评论
import org.beanio.types.TypeHandler;
public class MyImpTotalTypeHandler implements TypeHandler {
private static final BigDecimal BIG_DECIMAL_100_2 = new BigDecimal(100).setScale(2, RoundingMode.HALF_UP);
private static final BigDecimal BIG_DECIMAL_100 = new BigDecimal(100).setScale(0, RoundingMode.HALF_UP);
/**
* We are essentially receiving a (Big)Integer that must be converted to a BigDecimal.
*
* @see org.beanio.types.TypeHandler#parse(java.lang.String)
*/
@Override
public Object parse(final String value) throws TypeConversionException {
System.out.printf("Parsing value: %s%n", value);
return new BigDecimal(value).divide(BIG_DECIMAL_100_2);
}
/**
* To output the value from which this BigDecimal was created, we need to multiply the value with 100.
*
* {@inheritDoc}
*
* @see org.beanio.types.TypeHandler#format(java.lang.Object)
*/
@Override
public String format(final Object value) {
System.out.printf("Formatting value: %s%n", value);
return value != null ? ((BigDecimal) value).multiply(BIG_DECIMAL_100).toPlainString() : "";
}
@Override
public Class<?> getType() {
return BigDecimal.class;
}
}
然后,您必须向StreamBuilder
注册类型处理程序
final StreamBuilder builder = new StreamBuilder(this.getClass().getSimpleName())
// your set up here
// add a TypeHandler to handle the implTotal
.addTypeHandler("MyImpTotalTypeHandler", BigDecimal.class, new MyImpTotalTypeHandler())
然后在您希望使用的字段上引用此类型处理程序:
@Field(at = 576, length = 12, handlerName = "MyImpTotalTypeHandler")
private BigDecimal impTotal;
您还可以考虑扩展现有的org.beanio.types.BigDecimalTypeHandler
,但它可能不像您自己的实现那么简单。