在EasyExcel读取文件的过程中, 发现有一个NumberFormat注解, 该注解主要是在读取excel时对数字进行格式化处理数据, 查询得知,该功能参考的是DecimalFormat, 也是jdk中提供的数字格式转换类.
1 介绍
在easyexcel的jar包中, 有两个注解 Numbermat和DateTimeFormat.
1 Numbermat注解中引用自DecimalFormat类.
DecimalFormat类是jdk中java.text.包下的一个具体子类, 用于格式化十进制数字. 其抽象父类是NumberFormat, 其作用于格式化和解析任何区域设置的数字, 继承于公共父类Format.
2 DateTimeFormat注解引用自SimpleDateFormat类
SimpleDateFormat也是jdk中java.text.包下的一个具体子类,其抽象父类是DateFormat,继承于公共父类Format.
DecimalFormat 包含一个模式(RoundingMode,舍入模式进行格式化, 默认的是HALF_EVEN) 和一组符号.
2 语法
符号 | 位置 | 本地化 | 说明 |
---|---|---|---|
0 | 数字 | 是 | 阿拉伯数字 |
# | 数字 | 是 | 阿拉伯数字如果不存在就显示为空 |
. | 数字 | 是 | 小数分隔符或货币小数分隔符 |
- | 数字 | 是 | 减号 |
, | 数字 | 是 | 分组分隔符 |
E | 数字 | 是 | 分割科学技术法中的尾数和指数。在前缀和后缀中无需添加引号 |
; | 子模式边界 | 是 | 分隔正数和负数子模式 |
% | 前缀或后缀 | 是 | 乘以100并显示为百分数 |
/u2030 | 前缀或后缀 | 是 | 乘以1000并显示为千分数 |
¤ (\u00A4) | 前缀或后缀 | 否 | 货币记号,由货币符号替换。如果两个同时出现,则用国际货币符号替换。如果出现在某个模式中,则使用货币小数分隔符,而不使用小数分隔符 |
’ | 前缀或后缀 | 否 | 用于在前缀或或后缀中为特殊字符加引号,例如 “‘#’#” 将 123 格式化为 “#123”。要创建单引号本身,请连续使用两个单引号:“# o’'clock” |
3 案例
public class MyDecimalFormatDemo {
public static void main(String[] args) {
// 金额转千分位,##0.00 保留两位小数
DecimalFormat format = new DecimalFormat(",##0.00");
// 设置舍入模式 四舍五入
format.setRoundingMode(RoundingMode.HALF_UP);
System.out.println(format.format(new BigDecimal("12000.345")));
System.out.println("---------------------------------");
DecimalFormat format2 = new DecimalFormat("#.##");
// 设置舍入模式 四舍五入
format2.setRoundingMode(RoundingMode.HALF_UP);
System.out.println(format2.format(new BigDecimal("12000.345")));
System.out.println(format2.format(new BigDecimal("12000.304")));
System.out.println("---------------------------------");
DecimalFormat format3 = new DecimalFormat("0.00");
// 设置舍入模式 四舍五入
format3.setRoundingMode(RoundingMode.HALF_UP);
System.out.println(format3.format(new BigDecimal("12000.345")));
System.out.println(format3.format(new BigDecimal("12000.304")));
}
/*
运行结果:
12,000.35
---------------------------------
12000.35
12000.3
---------------------------------
12000.35
12000.30
*/
}
4 拓展
1 在EasyExcel中,NumberFormat注解, 也是用于读取excel时, 进行数字格式转换, 其中value值默认为空, 舍入模式默认为RoundingMode.HALF_UP.
如可直接设置参数@NumberFormat(“0.00”), 保留两位小时
@NumberFormat("0.00")
@ExcelProperty(value = "付款金额")
private String payMoney;
2 在BigDecimal字段想要添加不为空的校验时, 不能直接使用@NotEmpty注解,因其不支持该注解校验, 可通过@NotNull和@DecimalMin组合校验.
反例:
// 错误
@NotEmpty()
private BigDecimal payMoney;
正例:
// 错误
@NotNull()
@DecimalMin("0")
private BigDecimal payMoney;