java对金额元与分的转化

  • 2018-03-08
  • 963
  • 0
  • 2

昨天在公司,突然和同事讨论到项目上金额的问题!之前数据库设计使用的是整数类型(以分为单位的金额),使用一个封装类去进行单位的转换!但是昨天突然意识到一个问题 :元的单位是float,分的单位是int ,那么势必会出现类型转换是的数据丢失问题!遂写了个测试类 ,对之前的封装类进行了测试!果不其然是有问题的!进行类型互转时小数丢失了或者进行了四舍五入!既然发现了问题,那么下面就是该如何解决了!

首先考虑到的是数据类型互转会进行数据丢失!分->元 或 元->分   无非是将数据乘以100或者除以100(小数保留2位),数据的丢失是因为数据转换的问题,那么我们可以将类型先转换为String类型,通过正则去进行转换!然后进行数据转换(乘除100)然后转为对应的数据类型就好!

下面在网上搜索了一下相关的正则表达式(本人不喜自己去拼—  —!),还在真找到了和我想法一样的帖子!然后将其放进代码,编写测试类进行了测试,ok正好解决了类型问题!下面贴出来源及代码。

来自开源中国社区:张徽悦的个人空间

代码如下:

分转元

/**
 * 金额为分的格式
 */
public static final String CURRENCY_FEN_REGEX = "\\-?[0-9]+";

/**
 * 将分为单位的转换为元 (除100)
 *
 * @param amount
 * @return
 * @throws Exception
 */
public static BigDecimal fen2Yuan(String amount) {
    if (!amount.matches(CURRENCY_FEN_REGEX)) {
        throw new RuntimeException("金额格式错误|"+amount);
    }
    return BigDecimal.valueOf(Long.valueOf(amount)).divide(new BigDecimal(100));
}

/**
 * 将分为单位的转换为元 (除100)
 *
 * @param amount
 * @return
 * @throws Exception
 */
public static BigDecimal fen2Yuan(int amount) {
    if (!String.valueOf(amount).matches(CURRENCY_FEN_REGEX)) {
        throw new RuntimeException("金额格式错误|"+amount);
    }
    return BigDecimal.valueOf(Long.valueOf(amount)).divide(new BigDecimal(100));
}

public static BigDecimal fen2Yuan(Long amount) {
    if (!String.valueOf(amount).matches(CURRENCY_FEN_REGEX)) {
        throw new RuntimeException("金额格式错误|"+amount);
    }
    return BigDecimal.valueOf(Long.valueOf(amount)).divide(new BigDecimal(100));
}

元转化分

public static final  String CURRENCY_YUAN_REGEX="^(([0-9]|([1-9][0-9]{0,9}))((.[0-9]{1,2})?))$";
    /**
     * 将分为单位的转换为元 (除100)
     *
     * @param amount
     * @return
     * @throws Exception
     */
    public static String fen2YuanStr(String amount) {
        if (!amount.matches(CURRENCY_FEN_REGEX)) {
            throw new RuntimeException("金额格式错误|"+amount);
        }
        return BigDecimal.valueOf(Long.valueOf(amount)).divide(new BigDecimal(100)).toString();
    }


    /**
     * 将元为单位的参数转换为分 , 只对小数点前2位支持
     *
     * @param yuan
     * @return
     * @throws Exception
     */
    public static int yuan2FenInt(String yuan){
//        BigDecimal anmount = new BigDecimal(yuan);
//        int fen = (int)(anmount.doubleValue() * 100);
//        return fen;
        BigDecimal fenBd = new BigDecimal(yuan).multiply(new BigDecimal(100));
        fenBd = fenBd.setScale(0, BigDecimal.ROUND_HALF_UP);
        return fenBd.intValue();
    }

评论

还没有任何评论,你来说两句吧

发表评论