闲暇时间,帮朋友做了一个简单的管理系统,考虑到功能简单,就选择了最原始的RuoYi
项目,没有选在什么RuoYi Plus
、RuoYi Pro
这些功能能多更全面的开源项目。在这个系统中的某些模块会涉及到金额,朋友希望在前端及导出的Execl中都能按金额格式显示。
前端金额格式化
在前端界面将数字按金额格式展示很简单,因为若依
给我们提供了numberFormat
方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
| /** * [number_format 参数说明:] * @param {[type]} number [number:要格式化的数字] * @param {[type]} decimals [decimals:保留几位小数] * @param {[type]} dec_point [dec_point:小数点符号] * @param {[type]} thousands_sep [thousands_sep:千分位符号] * @param {[type]} roundtag [roundtag:舍入参数,默认 "ceil" 向上取,"floor"向下取,"round" 四舍五入] * @return {[type]} [description] * */ export function numberFormat(number, decimals, dec_point, thousands_sep, roundtag) { number = (number + '').replace(/[^0-9+-Ee.]/g, ''); decimals = decimals || 2; dec_point = dec_point || "."; thousands_sep = thousands_sep || ","; roundtag = roundtag || "round"; //"ceil","floor","round" var n = !isFinite(+number) ? 0 : +number, prec = !isFinite(+decimals) ? 0 : Math.abs(decimals), sep = (typeof thousands_sep === 'undefined') ? ',' : thousands_sep, dec = (typeof dec_point === 'undefined') ? '.' : dec_point, s = '', toFixedFix = function(n, prec) { var k = Math.pow(10, prec); return '' + parseFloat(Math[roundtag](parseFloat((n * k).toFixed(prec * 2))).toFixed(prec * 2)) / k; }; s = (prec ? toFixedFix(n, prec) : '' + Math.round(n)).split('.'); var re = /(-?\d+)(\d{3})/; while (re.test(s[0])) { s[0] = s[0].replace(re, "$1" + sep + "$2"); } if ((s[1] || '').length < prec) { s[1] = s[1] || ''; s[1] += new Array(prec - s[1].length + 1).join('0'); } return s.join(dec); }
|
该方法能很好处理好金额格式的展示。在需要格式化的地方直接调用即可,如:
1
| numberFormat(scope.row.amount)
|
后端导出
在Excel
注解中添加一个numberFormat
的属性
1 2 3 4
| /** * 数字类型格式 */ public String numberFormat() default "";
|
在ExcelUtil
的setCellVo
的ColumnType.NUMERIC
的代码段中加入数字格式化的逻辑
1 2 3 4 5 6 7 8 9
| if (StringUtils.isNotNull(value)) { if (StringUtils.isNotEmpty(attr.numberFormat())) { CellStyle numberCellStyle = this.wb.createCellStyle(); DataFormat dataFormat = this.wb.createDataFormat(); numberCellStyle.setDataFormat(dataFormat.getFormat(attr.numberFormat())); cell.setCellStyle(numberCellStyle); } cell.setCellValue(StringUtils.contains(Convert.toStr(value), ".") ? Convert.toDouble(value) : Convert.toInt(value)); }
|
3.在需要格式化的属性上添加注解
1 2
| @Excel(name = "余额",numberFormat = "#,##0.00",cellType = Excel.ColumnType.NUMERIC) private BigDecimal acctBalance;
|
在POI(Apache POI)中,DataFormat 类型有很多。以下列一些常见部分自定义 DataFormat 类型的示例:
- General (0):默认格式,将数据视为文本。
- 0:显示数值,并将未填充的位显示为零(例如:1, 2, 3…)。
- 0.00:显示数字,保留两位小数,将未填充的位显示为零(例如:1.23, 2.45…)。
- #,##0:显示数字,使用逗号作为千位分隔符(例如:1,000, 10,000…)。
- #,##0.00:显示数字,使用逗号作为千位分隔符,保留两位小数(例如:1,000.23, 10,000.45…)。
- #,##0.00_);Red:显示负数为红色括号,并以货币格式显示(例如:$1,234.56, ($1,234.56))。
- 0%:显示数字乘以100,并加上百分号(例如:10%)。
- 0.00E+00:以科学计数法显示数字例如:1.23E+05, 2.45E-02…)。
- d/m/yy or m/d/yy:以日期格式显示。
- dd/mm/yyyy hh:mm:以日期和时间格式显示。
- yy-mm-dd:以短年份、月份和日期格式显示。
- h:mm AM/PM:以小时:分钟和AM/PM表示的时间格式显示。
- [$-F400]h:mm:ss AM/PM:以小时:分钟:秒和AM/PM表示的时间格式显示。
- [$-409]yyyy-mm-dd hh:mm:ss:以完整年份、月份、日期、小时、分钟和秒格式显示。
POI还提供了更多其他的DataFormat类型,可以根据具体需求去创建自定义的DataFormat类型。需要注意的是,某些特定的DataFormat类型可能需要使用特殊的语言代码标识,这就需要参考Apache POI文档或其他资源来了解更多详情。