Skip to content

Commit 350361d

Browse files
committed
feat(1.0.0): 添加BigDecimalUtils
1 parent 248c266 commit 350361d

4 files changed

Lines changed: 236 additions & 3 deletions

File tree

Lines changed: 233 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,233 @@
1+
package cn.zhangqin56.common.utils;
2+
3+
import cn.hutool.core.collection.CollUtil;
4+
import lombok.experimental.UtilityClass;
5+
6+
import java.math.BigDecimal;
7+
import java.math.RoundingMode;
8+
import java.util.Arrays;
9+
import java.util.List;
10+
import java.util.Objects;
11+
import java.util.Optional;
12+
import java.util.function.Function;
13+
import java.util.function.Predicate;
14+
15+
/**
16+
* BigDecimal 工具类
17+
*
18+
* @author ZhangQin
19+
*/
20+
@UtilityClass
21+
public class BigDecimalUtils {
22+
23+
public final int DEFAULT_DIVIDE_SCALE = 5;
24+
public final int DEFAULT_MULTIPLY_SCALE = 2;
25+
26+
/**
27+
* 计算传入的BigDecimal数组中所有元素的总和。
28+
*
29+
* @param numbers BigDecimal数组,包含要相加的数字
30+
* @return 返回BigDecimal类型的结果,即所有数字的总和
31+
*/
32+
public BigDecimal sum(BigDecimal... numbers) {
33+
return sum(Arrays.asList(numbers));
34+
}
35+
36+
37+
/**
38+
* 计算BigDecimal类型列表中所有非空数字的总和。
39+
*
40+
* @param numbers 包含BigDecimal类型数字的列表
41+
* @return 所有非空数字的总和,以BigDecimal类型表示
42+
*/
43+
public BigDecimal sum(List<BigDecimal> numbers) {
44+
if (CollUtil.isEmpty(numbers)) {
45+
return BigDecimal.ZERO;
46+
}
47+
return numbers.stream()
48+
.filter(Objects::nonNull)
49+
.reduce(BigDecimal.ZERO, BigDecimal::add);
50+
}
51+
52+
53+
/**
54+
* 对list中对象的某个BigDecimal字段求和
55+
*/
56+
public <T> BigDecimal sum(List<T> objsContainsBigDecimal, Function<T, BigDecimal> ref) {
57+
return objsContainsBigDecimal.stream()
58+
.filter(Objects::nonNull)
59+
.map(ref)
60+
.filter(Objects::nonNull)
61+
.reduce(BigDecimal.ZERO, BigDecimal::add);
62+
}
63+
64+
/**
65+
* 对list中对象的某个BigDecimal字段求和
66+
*/
67+
public <T> BigDecimal sum(List<T> objsContainsBigDecimal, Predicate<T> filter, Function<T, BigDecimal> ref) {
68+
if (CollUtil.isEmpty(objsContainsBigDecimal)) {
69+
return BigDecimal.ZERO;
70+
}
71+
return objsContainsBigDecimal.stream()
72+
.filter(Objects::nonNull)
73+
.filter(filter)
74+
.map(ref)
75+
.filter(Objects::nonNull)
76+
.reduce(BigDecimal.ZERO, BigDecimal::add);
77+
}
78+
79+
/**
80+
* 大于
81+
*/
82+
public boolean gt(BigDecimal v1, BigDecimal v2) {
83+
return v1.compareTo(v2) > 0;
84+
}
85+
86+
/**
87+
* 大于0
88+
*/
89+
public boolean gt0(BigDecimal v) {
90+
return gt(v, BigDecimal.ZERO);
91+
}
92+
93+
/**
94+
* 大于等于
95+
*/
96+
public boolean ge(BigDecimal v1, BigDecimal v2) {
97+
return v1.compareTo(v2) >= 0;
98+
}
99+
100+
/**
101+
* 大于等于0
102+
*/
103+
public boolean ge0(BigDecimal v) {
104+
return ge(v, BigDecimal.ZERO);
105+
}
106+
107+
/**
108+
* 小于
109+
*/
110+
public boolean lt(BigDecimal v1, BigDecimal v2) {
111+
return v1.compareTo(v2) < 0;
112+
}
113+
114+
/**
115+
* 小于0
116+
*/
117+
public boolean lt0(BigDecimal v) {
118+
return lt(v, BigDecimal.ZERO);
119+
}
120+
121+
/**
122+
* 小于等于
123+
*/
124+
public boolean le(BigDecimal v1, BigDecimal v2) {
125+
return v1.compareTo(v2) <= 0;
126+
}
127+
128+
/**
129+
* 小于等于0
130+
*/
131+
public boolean le0(BigDecimal v) {
132+
return le(v, BigDecimal.ZERO);
133+
}
134+
135+
/**
136+
* 不等于
137+
*/
138+
public boolean ne(BigDecimal v1, BigDecimal v2) {
139+
return v1.compareTo(v2) != 0;
140+
}
141+
142+
/**
143+
* 不等于0
144+
*/
145+
public boolean ne0(BigDecimal v) {
146+
return ne(v, BigDecimal.ZERO);
147+
}
148+
149+
/**
150+
* 等于
151+
*/
152+
public boolean eq(BigDecimal v1, BigDecimal v2) {
153+
return v1.compareTo(v2) == 0;
154+
}
155+
156+
/**
157+
* 等于0
158+
*/
159+
public boolean eq0(BigDecimal v) {
160+
return eq(v, BigDecimal.ZERO);
161+
}
162+
163+
164+
/**
165+
* 封装BigDecimal对象
166+
*
167+
* @param value 要封装的BigDecimal对象
168+
* @return 如果value为null,则返回BigDecimal.ZERO;否则返回value
169+
*/
170+
public BigDecimal wrapBigDecimal(BigDecimal value) {
171+
return Optional.ofNullable(value).orElse(BigDecimal.ZERO);
172+
}
173+
174+
/**
175+
* 返回入参的负数值,负数仍是负数
176+
*/
177+
public BigDecimal negate(BigDecimal value) {
178+
return wrapBigDecimal(value).abs().negate();
179+
}
180+
181+
public BigDecimal cal(BigDecimal v1, BigDecimal v2, CalculateType type) {
182+
return switch (type) {
183+
case ADD -> wrapBigDecimal(v1).add(wrapBigDecimal(v2));
184+
case SUBTRACT -> wrapBigDecimal(v1).subtract(wrapBigDecimal(v2));
185+
case MULTIPLY, MULTIPLY_CEILING ->
186+
wrapBigDecimal(v1).multiply(wrapBigDecimal(v2)).setScale(DEFAULT_DIVIDE_SCALE, RoundingMode.CEILING);
187+
case MULTIPLY_UP ->
188+
wrapBigDecimal(v1).multiply(wrapBigDecimal(v2)).setScale(DEFAULT_MULTIPLY_SCALE, RoundingMode.UP);
189+
case MULTIPLY_DOWN ->
190+
wrapBigDecimal(v1).multiply(wrapBigDecimal(v2)).setScale(DEFAULT_MULTIPLY_SCALE, RoundingMode.DOWN);
191+
case MULTIPLY_FLOOR ->
192+
wrapBigDecimal(v1).multiply(wrapBigDecimal(v2)).setScale(DEFAULT_MULTIPLY_SCALE, RoundingMode.FLOOR);
193+
case MULTIPLY_HALF_UP ->
194+
wrapBigDecimal(v1).multiply(wrapBigDecimal(v2)).setScale(DEFAULT_MULTIPLY_SCALE, RoundingMode.HALF_UP);
195+
case MULTIPLY_HALF_DOWN ->
196+
wrapBigDecimal(v1).multiply(wrapBigDecimal(v2)).setScale(DEFAULT_MULTIPLY_SCALE, RoundingMode.HALF_DOWN);
197+
case MULTIPLY_HALF_EVEN ->
198+
wrapBigDecimal(v1).multiply(wrapBigDecimal(v2)).setScale(DEFAULT_MULTIPLY_SCALE, RoundingMode.HALF_EVEN);
199+
case MULTIPLY_UNNECESSARY ->
200+
wrapBigDecimal(v1).multiply(wrapBigDecimal(v2)).setScale(DEFAULT_MULTIPLY_SCALE, RoundingMode.UNNECESSARY);
201+
case DIVIDE_UP -> wrapBigDecimal(v1).divide(v2, DEFAULT_DIVIDE_SCALE, RoundingMode.UP);
202+
case DIVIDE_DOWN -> wrapBigDecimal(v1).divide(v2, DEFAULT_DIVIDE_SCALE, RoundingMode.DOWN);
203+
case DIVIDE_CEILING -> wrapBigDecimal(v1).divide(v2, DEFAULT_DIVIDE_SCALE, RoundingMode.CEILING);
204+
case DIVIDE_FLOOR -> wrapBigDecimal(v1).divide(v2, DEFAULT_DIVIDE_SCALE, RoundingMode.FLOOR);
205+
case DIVIDE_HALF_UP -> wrapBigDecimal(v1).divide(v2, DEFAULT_DIVIDE_SCALE, RoundingMode.HALF_UP);
206+
case DIVIDE_HALF_DOWN -> wrapBigDecimal(v1).divide(v2, DEFAULT_DIVIDE_SCALE, RoundingMode.HALF_DOWN);
207+
case DIVIDE_HALF_EVEN -> wrapBigDecimal(v1).divide(v2, DEFAULT_DIVIDE_SCALE, RoundingMode.HALF_EVEN);
208+
case DIVIDE_UNNECESSARY -> wrapBigDecimal(v1).divide(v2, DEFAULT_DIVIDE_SCALE, RoundingMode.UNNECESSARY);
209+
};
210+
}
211+
212+
public enum CalculateType {
213+
ADD,
214+
SUBTRACT,
215+
MULTIPLY,
216+
MULTIPLY_UP,
217+
MULTIPLY_DOWN,
218+
MULTIPLY_CEILING,
219+
MULTIPLY_FLOOR,
220+
MULTIPLY_HALF_UP,
221+
MULTIPLY_HALF_DOWN,
222+
MULTIPLY_HALF_EVEN,
223+
MULTIPLY_UNNECESSARY,
224+
DIVIDE_UP,
225+
DIVIDE_DOWN,
226+
DIVIDE_CEILING,
227+
DIVIDE_FLOOR,
228+
DIVIDE_HALF_UP,
229+
DIVIDE_HALF_DOWN,
230+
DIVIDE_HALF_EVEN,
231+
DIVIDE_UNNECESSARY,
232+
}
233+
}

src/main/java/cn/zhangqin56/common/CommonResult.java renamed to src/main/java/cn/zhangqin56/common/web/CommonResult.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package cn.zhangqin56.common;
1+
package cn.zhangqin56.common.web;
22

33
import lombok.AllArgsConstructor;
44
import lombok.Builder;

src/main/java/cn/zhangqin56/common/GlobalStatusCode.java renamed to src/main/java/cn/zhangqin56/common/web/GlobalStatusCode.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package cn.zhangqin56.common;
1+
package cn.zhangqin56.common.web;
22

33
public interface GlobalStatusCode {
44
StatusCode SUCCESS = new StatusCode(0, "成功");

src/main/java/cn/zhangqin56/common/StatusCode.java renamed to src/main/java/cn/zhangqin56/common/web/StatusCode.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package cn.zhangqin56.common;
1+
package cn.zhangqin56.common.web;
22

33

44
/**

0 commit comments

Comments
 (0)