字符串数字分转元
public String convertCent2Yuan(String money) {
if (!checkCentMoney(money)) {
throw new CommonException("{}分转元错误,非法字符串!", money);
}
return BigDecimalUtil.divide(new BigDecimal(money), new BigDecimal("100"), 2).toPlainString();
}
public boolean checkCentMoney(String value) {
// 判断字符串是否是正数(钱)
if (StringUtils.isNotEmpty(value)) {
return value.matches("^([1-9][0-9]*)");
}
return false;
}
BigDecimalUtil简单封装了BigDecimal.java类中的devide方法!
汇率(保留几位小数,scale就填几)
public String convertCent2Yuan(String numStr, int scale) {
if (!checkCentMoney(numStr)) {
throw new CommonException("{}错误,非数字字符串!", numStr);
}
return BigDecimalUtil.divide(new BigDecimal(numStr), new BigDecimal("1" + serialZero(scale)), scale).toPlainString();
}
private String serialZero(int scale) {
StringBuilder ret = new StringBuilder();
for (int i = 0; i < scale; i++) {
ret.append("0");
}
return ret.toString();
}
JPA 使用原生SQL语句更新
@Modifying
@Query(value = "update TB_SYS_USER set frozen2 = frozen2 + #{frozen2} where id = #{id} and #{frozen2} >= 0", nativeQuery = true)
int update(@Param("id") Long id, @Param("frozen2") BigDecimal frozen2);
对象内部属性连续处理,注意幂等性(做两次减法操作,很危险)
@Data
@Accessors(chain = true)
@AllArgsConstructor
@NoArgsConstructor
public class AvailableVO {
@ApiModelProperty("可用餘額")
private String available;
@ApiModelProperty("餘額有效截止日期,格式yyyyMMdd")
private String permitEnd;
@ApiModelProperty("币种")
private String currency;
@ApiModelProperty("狀態,-1 暫停服務 0 未激活 1 正常")
private Integer status;
}
public static void main(String[] args) {
AvailableVO ret = new AvailableVO ();
ret.setAvailable("220.20");
BigDecimal needSub = new BigDecimal("800");
ret.setAvailable(BigDecimalUtil.subtract(new BigDecimal(ret.getAvailable()), needSub == null ? new BigDecimal("0.00") : needSub, 2).toPlainString());
System.err.println(ret.setAvailable(BigDecimalUtil.subtract(new BigDecimal(ret.getAvailable()), needSub == null ? new BigDecimal("0.00") : needSub, 2).toPlainString()));
}