提交 | 用户 | 时间
|
e7c126
|
1 |
package com.iailab.framework.common.util.number; |
H |
2 |
|
|
3 |
import cn.hutool.core.math.Money; |
|
4 |
import cn.hutool.core.util.NumberUtil; |
|
5 |
|
|
6 |
import java.math.BigDecimal; |
|
7 |
import java.math.RoundingMode; |
|
8 |
|
|
9 |
/** |
|
10 |
* 金额工具类 |
|
11 |
* |
|
12 |
* @author iailab |
|
13 |
*/ |
|
14 |
public class MoneyUtils { |
|
15 |
|
|
16 |
/** |
|
17 |
* 金额的小数位数 |
|
18 |
*/ |
|
19 |
private static final int PRICE_SCALE = 2; |
|
20 |
|
|
21 |
/** |
|
22 |
* 百分比对应的 BigDecimal 对象 |
|
23 |
*/ |
|
24 |
public static final BigDecimal PERCENT_100 = BigDecimal.valueOf(100); |
|
25 |
|
|
26 |
/** |
|
27 |
* 计算百分比金额,四舍五入 |
|
28 |
* |
|
29 |
* @param price 金额 |
|
30 |
* @param rate 百分比,例如说 56.77% 则传入 56.77 |
|
31 |
* @return 百分比金额 |
|
32 |
*/ |
|
33 |
public static Integer calculateRatePrice(Integer price, Double rate) { |
|
34 |
return calculateRatePrice(price, rate, 0, RoundingMode.HALF_UP).intValue(); |
|
35 |
} |
|
36 |
|
|
37 |
/** |
|
38 |
* 计算百分比金额,向下传入 |
|
39 |
* |
|
40 |
* @param price 金额 |
|
41 |
* @param rate 百分比,例如说 56.77% 则传入 56.77 |
|
42 |
* @return 百分比金额 |
|
43 |
*/ |
|
44 |
public static Integer calculateRatePriceFloor(Integer price, Double rate) { |
|
45 |
return calculateRatePrice(price, rate, 0, RoundingMode.FLOOR).intValue(); |
|
46 |
} |
|
47 |
|
|
48 |
/** |
|
49 |
* 计算百分比金额 |
|
50 |
* |
|
51 |
* @param price 金额(单位分) |
|
52 |
* @param count 数量 |
|
53 |
* @param percent 折扣(单位分),列如 60.2%,则传入 6020 |
|
54 |
* @return 商品总价 |
|
55 |
*/ |
|
56 |
public static Integer calculator(Integer price, Integer count, Integer percent) { |
|
57 |
price = price * count; |
|
58 |
if (percent == null) { |
|
59 |
return price; |
|
60 |
} |
|
61 |
return MoneyUtils.calculateRatePriceFloor(price, (double) (percent / 100)); |
|
62 |
} |
|
63 |
|
|
64 |
/** |
|
65 |
* 计算百分比金额 |
|
66 |
* |
|
67 |
* @param price 金额 |
|
68 |
* @param rate 百分比,例如说 56.77% 则传入 56.77 |
|
69 |
* @param scale 保留小数位数 |
|
70 |
* @param roundingMode 舍入模式 |
|
71 |
*/ |
|
72 |
public static BigDecimal calculateRatePrice(Number price, Number rate, int scale, RoundingMode roundingMode) { |
|
73 |
return NumberUtil.toBigDecimal(price).multiply(NumberUtil.toBigDecimal(rate)) // 乘以 |
|
74 |
.divide(BigDecimal.valueOf(100), scale, roundingMode); // 除以 100 |
|
75 |
} |
|
76 |
|
|
77 |
/** |
|
78 |
* 分转元 |
|
79 |
* |
|
80 |
* @param fen 分 |
|
81 |
* @return 元 |
|
82 |
*/ |
|
83 |
public static BigDecimal fenToYuan(int fen) { |
|
84 |
return new Money(0, fen).getAmount(); |
|
85 |
} |
|
86 |
|
|
87 |
/** |
|
88 |
* 分转元(字符串) |
|
89 |
* |
|
90 |
* 例如说 fen 为 1 时,则结果为 0.01 |
|
91 |
* |
|
92 |
* @param fen 分 |
|
93 |
* @return 元 |
|
94 |
*/ |
|
95 |
public static String fenToYuanStr(int fen) { |
|
96 |
return new Money(0, fen).toString(); |
|
97 |
} |
|
98 |
|
|
99 |
/** |
|
100 |
* 金额相乘,默认进行四舍五入 |
|
101 |
* |
|
102 |
* 位数:{@link #PRICE_SCALE} |
|
103 |
* |
|
104 |
* @param price 金额 |
|
105 |
* @param count 数量 |
|
106 |
* @return 金额相乘结果 |
|
107 |
*/ |
|
108 |
public static BigDecimal priceMultiply(BigDecimal price, BigDecimal count) { |
|
109 |
if (price == null || count == null) { |
|
110 |
return null; |
|
111 |
} |
|
112 |
return price.multiply(count).setScale(PRICE_SCALE, RoundingMode.HALF_UP); |
|
113 |
} |
|
114 |
|
|
115 |
/** |
|
116 |
* 金额相乘(百分比),默认进行四舍五入 |
|
117 |
* |
|
118 |
* 位数:{@link #PRICE_SCALE} |
|
119 |
* |
|
120 |
* @param price 金额 |
|
121 |
* @param percent 百分比 |
|
122 |
* @return 金额相乘结果 |
|
123 |
*/ |
|
124 |
public static BigDecimal priceMultiplyPercent(BigDecimal price, BigDecimal percent) { |
|
125 |
if (price == null || percent == null) { |
|
126 |
return null; |
|
127 |
} |
|
128 |
return price.multiply(percent).divide(PERCENT_100, PRICE_SCALE, RoundingMode.HALF_UP); |
|
129 |
} |
|
130 |
|
|
131 |
} |