From 7f13b38a7fc3227dc188369b983acc00ccac5092 Mon Sep 17 00:00:00 2001 From: zhangrenhua Date: Fri, 1 Jul 2022 14:53:47 +0800 Subject: [PATCH] =?UTF-8?q?=E4=B8=AD=E6=96=87=E5=A4=A7=E5=86=99=E6=95=B0?= =?UTF-8?q?=E5=AD=97=E9=87=91=E9=A2=9D=E8=BD=AC=E6=8D=A2=E4=B8=BA=E6=95=B0?= =?UTF-8?q?=E5=AD=97=EF=BC=8C=E8=BF=94=E5=9B=9E=E7=BB=93=E6=9E=9C=E4=BB=A5?= =?UTF-8?q?=E5=85=83=E4=B8=BA=E5=8D=95=E4=BD=8D=E7=9A=84BigDecimal?= =?UTF-8?q?=E7=B1=BB=E5=9E=8B=E6=95=B0=E5=AD=97=20=E8=A7=A3=E5=86=B3?= =?UTF-8?q?=E9=97=AE=E9=A2=98=20https://gitee.com/dromara/hutool/issues/I5?= =?UTF-8?q?EYB3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/cn/hutool/core/convert/Convert.java | 85 +++++++++++++++++++ .../cn/hutool/core/convert/ConvertTest.java | 34 ++++++++ 2 files changed, 119 insertions(+) diff --git a/hutool-core/src/main/java/cn/hutool/core/convert/Convert.java b/hutool-core/src/main/java/cn/hutool/core/convert/Convert.java index a7ca4babb..869104f97 100755 --- a/hutool-core/src/main/java/cn/hutool/core/convert/Convert.java +++ b/hutool-core/src/main/java/cn/hutool/core/convert/Convert.java @@ -1024,6 +1024,91 @@ public class Convert { return NumberChineseFormatter.format(n.doubleValue(), true, true); } + /** + * 中文大写数字金额转换为数字,返回结果以元为单位的BigDecimal类型数字 + * + * 如: + * “陆万柒仟伍佰伍拾陆元叁角贰分”返回“67556.32” + * “叁角贰分”返回“0.32” + * + * @param chineseMoneyAmount 中文大写数字金额 + * @return 返回结果以元为单位的BigDecimal类型数字 + */ + public static BigDecimal chineseMoneyAmount2Number(String chineseMoneyAmount){ + if(StrUtil.isBlank(chineseMoneyAmount)){ + return null; + } + + int yi = chineseMoneyAmount.indexOf("元"); + if(yi == -1){ + yi = chineseMoneyAmount.indexOf("圆"); + } + int ji = chineseMoneyAmount.indexOf("角"); + int fi = chineseMoneyAmount.indexOf("分"); + + /* + * 先找到单位为元的数字 + */ + String yStr = null; + if(yi > 0) { + yStr = chineseMoneyAmount.substring(0, yi); + } + + /* + * 再找到单位为角的数字 + */ + String jStr = null; + if(ji > 0){ + if(yi >= 0){ + //前面有元,角肯定要在元后面 + if(ji > yi){ + jStr = chineseMoneyAmount.substring(yi+1, ji); + } + }else{ + //没有元,只有角 + jStr = chineseMoneyAmount.substring(0, ji); + } + } + + /* + * 再找到单位为分的数字 + */ + String fStr = null; + if(fi > 0){ + if(ji >= 0){ + //有角,分肯定在角后面 + if(fi > ji){ + fStr = chineseMoneyAmount.substring(ji+1, fi); + } + }else if(yi > 0){ + //没有角,有元,那就坐元后面找 + if(fi > yi){ + fStr = chineseMoneyAmount.substring(yi+1, fi); + } + }else { + //没有元、角,只有分 + fStr = chineseMoneyAmount.substring(0, fi); + } + } + + //元、角、分 + int y = 0, j = 0, f = 0; + if(StrUtil.isNotBlank(yStr)) { + y = NumberChineseFormatter.chineseToNumber(yStr); + } + if(StrUtil.isNotBlank(jStr)){ + j = NumberChineseFormatter.chineseToNumber(jStr); + } + if(StrUtil.isNotBlank(fStr)){ + f = NumberChineseFormatter.chineseToNumber(fStr); + } + + BigDecimal amount = new BigDecimal(y); + amount = amount.add(BigDecimal.valueOf(j).divide(BigDecimal.TEN)); + amount = amount.add(BigDecimal.valueOf(f).divide(BigDecimal.valueOf(100))); + return amount; + } + // -------------------------------------------------------------------------- 数字转换 /** * int转byte diff --git a/hutool-core/src/test/java/cn/hutool/core/convert/ConvertTest.java b/hutool-core/src/test/java/cn/hutool/core/convert/ConvertTest.java index 047540888..ce245edb7 100755 --- a/hutool-core/src/test/java/cn/hutool/core/convert/ConvertTest.java +++ b/hutool-core/src/test/java/cn/hutool/core/convert/ConvertTest.java @@ -5,8 +5,10 @@ import cn.hutool.core.date.DateException; import cn.hutool.core.date.DateUtil; import cn.hutool.core.lang.TypeReference; import cn.hutool.core.map.MapUtil; +import cn.hutool.core.math.Money; import cn.hutool.core.util.ByteUtil; import cn.hutool.core.util.HexUtil; +import cn.hutool.core.util.StrUtil; import lombok.AllArgsConstructor; import lombok.Data; import lombok.Getter; @@ -404,4 +406,36 @@ public class ConvertTest { final String s = Convert.toDBC(null); Assert.assertNull(s); } + + @Test + public void testChineseMoneyAmount2Number(){ + String[] strs = new String[]{ + "陆万柒仟伍佰伍拾陆圆", + "陆万柒仟伍佰伍拾陆元", + "叁角", + "贰分", + "陆万柒仟伍佰伍拾陆元叁角", + "陆万柒仟伍佰伍拾陆元贰分", + "叁角贰分", + "陆万柒仟伍佰伍拾陆元叁角贰分", + }; + + for(String s: strs) { + System.out.println("s="+s+", n="+Convert.chineseMoneyAmount2Number(s)); + } + + /* + * s=陆万柒仟伍佰伍拾陆圆, n=67556 + * s=陆万柒仟伍佰伍拾陆元, n=67556 + * s=叁角, n=0.3 + * s=贰分, n=0.02 + * s=陆万柒仟伍佰伍拾陆元叁角, n=67556.3 + * s=陆万柒仟伍佰伍拾陆元贰分, n=67556.02 + * s=叁角贰分, n=0.32 + * s=陆万柒仟伍佰伍拾陆元叁角贰分, n=67556.32 + */ + } + + + }