BeanIO:为不带分隔符的整数和小数位数设置固定长度的数字格式



有没有一种方法可以使用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,但它可能不像您自己的实现那么简单。

相关内容

  • 没有找到相关文章

最新更新