1. 踩坑经历
上周,一个用户反馈他创建的某个销售单无法打开,但其余销售单都可以正常打开,当时查看了生产环境的ERROR日志,发现抛了这样的异常:java.lang.NumberFormatException: For input string: "E"。
相信大家对这个异常都不陌生,很显然,是因为将字符串转换为数字时抛出的,比如下面这样:
但仔细查看了用户报错的单据,也没有发现哪里有输入“E”这样的字符串(请原谅我第一时间没有想到是科学计数法造成的,哈哈),最后把生产环境的这条数据插入到了开发环境中,定位到原来是因为将金额转换为大写时导致的,报错的关键代码如下所示:
String totalAmountStr = String.valueOf(totalAmount / 100.0);
String amountCN = MoneyUtils.toChinese(totalAmountStr);
其中totalAmount是一个long类型的变量,之所以除以100.0,是因为我们数据库中存储金额都是按分为单位存储的(相信很多小伙伴也是这么存储的),第2行代码主要是为了将金额转换为大写,比如将105000.50转换为壹拾万零伍仟元伍角。
用户报错的那个单据,totalAmount为2700万,转换为分就是:2700000000,执行完