Browse Source

优化数字金额大写转换精度丢失问题

RuoYi 2 years ago
parent
commit
7d91e58594
1 changed files with 54 additions and 48 deletions
  1. 54 48
      ruoyi-common/src/main/java/com/ruoyi/common/core/text/Convert.java

+ 54 - 48
ruoyi-common/src/main/java/com/ruoyi/common/core/text/Convert.java

@@ -2,6 +2,7 @@ package com.ruoyi.common.core.text;
 
 
 import java.math.BigDecimal;
 import java.math.BigDecimal;
 import java.math.BigInteger;
 import java.math.BigInteger;
+import java.math.RoundingMode;
 import java.nio.ByteBuffer;
 import java.nio.ByteBuffer;
 import java.nio.charset.Charset;
 import java.nio.charset.Charset;
 import java.text.NumberFormat;
 import java.text.NumberFormat;
@@ -11,7 +12,7 @@ import org.apache.commons.lang3.ArrayUtils;
 
 
 /**
 /**
  * 类型转换器
  * 类型转换器
- * 
+ *
  * @author ruoyi
  * @author ruoyi
  */
  */
 public class Convert
 public class Convert
@@ -20,7 +21,7 @@ public class Convert
      * 转换为字符串<br>
      * 转换为字符串<br>
      * 如果给定的值为null,或者转换失败,返回默认值<br>
      * 如果给定的值为null,或者转换失败,返回默认值<br>
      * 转换失败不会报错
      * 转换失败不会报错
-     * 
+     *
      * @param value 被转换的值
      * @param value 被转换的值
      * @param defaultValue 转换错误时的默认值
      * @param defaultValue 转换错误时的默认值
      * @return 结果
      * @return 结果
@@ -42,7 +43,7 @@ public class Convert
      * 转换为字符串<br>
      * 转换为字符串<br>
      * 如果给定的值为<code>null</code>,或者转换失败,返回默认值<code>null</code><br>
      * 如果给定的值为<code>null</code>,或者转换失败,返回默认值<code>null</code><br>
      * 转换失败不会报错
      * 转换失败不会报错
-     * 
+     *
      * @param value 被转换的值
      * @param value 被转换的值
      * @return 结果
      * @return 结果
      */
      */
@@ -55,7 +56,7 @@ public class Convert
      * 转换为字符<br>
      * 转换为字符<br>
      * 如果给定的值为null,或者转换失败,返回默认值<br>
      * 如果给定的值为null,或者转换失败,返回默认值<br>
      * 转换失败不会报错
      * 转换失败不会报错
-     * 
+     *
      * @param value 被转换的值
      * @param value 被转换的值
      * @param defaultValue 转换错误时的默认值
      * @param defaultValue 转换错误时的默认值
      * @return 结果
      * @return 结果
@@ -79,7 +80,7 @@ public class Convert
      * 转换为字符<br>
      * 转换为字符<br>
      * 如果给定的值为<code>null</code>,或者转换失败,返回默认值<code>null</code><br>
      * 如果给定的值为<code>null</code>,或者转换失败,返回默认值<code>null</code><br>
      * 转换失败不会报错
      * 转换失败不会报错
-     * 
+     *
      * @param value 被转换的值
      * @param value 被转换的值
      * @return 结果
      * @return 结果
      */
      */
@@ -92,7 +93,7 @@ public class Convert
      * 转换为byte<br>
      * 转换为byte<br>
      * 如果给定的值为<code>null</code>,或者转换失败,返回默认值<br>
      * 如果给定的值为<code>null</code>,或者转换失败,返回默认值<br>
      * 转换失败不会报错
      * 转换失败不会报错
-     * 
+     *
      * @param value 被转换的值
      * @param value 被转换的值
      * @param defaultValue 转换错误时的默认值
      * @param defaultValue 转换错误时的默认值
      * @return 结果
      * @return 结果
@@ -130,7 +131,7 @@ public class Convert
      * 转换为byte<br>
      * 转换为byte<br>
      * 如果给定的值为<code>null</code>,或者转换失败,返回默认值<code>null</code><br>
      * 如果给定的值为<code>null</code>,或者转换失败,返回默认值<code>null</code><br>
      * 转换失败不会报错
      * 转换失败不会报错
-     * 
+     *
      * @param value 被转换的值
      * @param value 被转换的值
      * @return 结果
      * @return 结果
      */
      */
@@ -143,7 +144,7 @@ public class Convert
      * 转换为Short<br>
      * 转换为Short<br>
      * 如果给定的值为<code>null</code>,或者转换失败,返回默认值<br>
      * 如果给定的值为<code>null</code>,或者转换失败,返回默认值<br>
      * 转换失败不会报错
      * 转换失败不会报错
-     * 
+     *
      * @param value 被转换的值
      * @param value 被转换的值
      * @param defaultValue 转换错误时的默认值
      * @param defaultValue 转换错误时的默认值
      * @return 结果
      * @return 结果
@@ -181,7 +182,7 @@ public class Convert
      * 转换为Short<br>
      * 转换为Short<br>
      * 如果给定的值为<code>null</code>,或者转换失败,返回默认值<code>null</code><br>
      * 如果给定的值为<code>null</code>,或者转换失败,返回默认值<code>null</code><br>
      * 转换失败不会报错
      * 转换失败不会报错
-     * 
+     *
      * @param value 被转换的值
      * @param value 被转换的值
      * @return 结果
      * @return 结果
      */
      */
@@ -194,7 +195,7 @@ public class Convert
      * 转换为Number<br>
      * 转换为Number<br>
      * 如果给定的值为空,或者转换失败,返回默认值<br>
      * 如果给定的值为空,或者转换失败,返回默认值<br>
      * 转换失败不会报错
      * 转换失败不会报错
-     * 
+     *
      * @param value 被转换的值
      * @param value 被转换的值
      * @param defaultValue 转换错误时的默认值
      * @param defaultValue 转换错误时的默认值
      * @return 结果
      * @return 结果
@@ -228,7 +229,7 @@ public class Convert
      * 转换为Number<br>
      * 转换为Number<br>
      * 如果给定的值为空,或者转换失败,返回默认值<code>null</code><br>
      * 如果给定的值为空,或者转换失败,返回默认值<code>null</code><br>
      * 转换失败不会报错
      * 转换失败不会报错
-     * 
+     *
      * @param value 被转换的值
      * @param value 被转换的值
      * @return 结果
      * @return 结果
      */
      */
@@ -241,7 +242,7 @@ public class Convert
      * 转换为int<br>
      * 转换为int<br>
      * 如果给定的值为空,或者转换失败,返回默认值<br>
      * 如果给定的值为空,或者转换失败,返回默认值<br>
      * 转换失败不会报错
      * 转换失败不会报错
-     * 
+     *
      * @param value 被转换的值
      * @param value 被转换的值
      * @param defaultValue 转换错误时的默认值
      * @param defaultValue 转换错误时的默认值
      * @return 结果
      * @return 结果
@@ -279,7 +280,7 @@ public class Convert
      * 转换为int<br>
      * 转换为int<br>
      * 如果给定的值为<code>null</code>,或者转换失败,返回默认值<code>null</code><br>
      * 如果给定的值为<code>null</code>,或者转换失败,返回默认值<code>null</code><br>
      * 转换失败不会报错
      * 转换失败不会报错
-     * 
+     *
      * @param value 被转换的值
      * @param value 被转换的值
      * @return 结果
      * @return 结果
      */
      */
@@ -290,7 +291,7 @@ public class Convert
 
 
     /**
     /**
      * 转换为Integer数组<br>
      * 转换为Integer数组<br>
-     * 
+     *
      * @param str 被转换的值
      * @param str 被转换的值
      * @return 结果
      * @return 结果
      */
      */
@@ -301,7 +302,7 @@ public class Convert
 
 
     /**
     /**
      * 转换为Long数组<br>
      * 转换为Long数组<br>
-     * 
+     *
      * @param str 被转换的值
      * @param str 被转换的值
      * @return 结果
      * @return 结果
      */
      */
@@ -312,7 +313,7 @@ public class Convert
 
 
     /**
     /**
      * 转换为Integer数组<br>
      * 转换为Integer数组<br>
-     * 
+     *
      * @param split 分隔符
      * @param split 分隔符
      * @param split 被转换的值
      * @param split 被转换的值
      * @return 结果
      * @return 结果
@@ -335,7 +336,7 @@ public class Convert
 
 
     /**
     /**
      * 转换为Long数组<br>
      * 转换为Long数组<br>
-     * 
+     *
      * @param split 分隔符
      * @param split 分隔符
      * @param str 被转换的值
      * @param str 被转换的值
      * @return 结果
      * @return 结果
@@ -358,7 +359,7 @@ public class Convert
 
 
     /**
     /**
      * 转换为String数组<br>
      * 转换为String数组<br>
-     * 
+     *
      * @param str 被转换的值
      * @param str 被转换的值
      * @return 结果
      * @return 结果
      */
      */
@@ -369,7 +370,7 @@ public class Convert
 
 
     /**
     /**
      * 转换为String数组<br>
      * 转换为String数组<br>
-     * 
+     *
      * @param split 分隔符
      * @param split 分隔符
      * @param split 被转换的值
      * @param split 被转换的值
      * @return 结果
      * @return 结果
@@ -383,7 +384,7 @@ public class Convert
      * 转换为long<br>
      * 转换为long<br>
      * 如果给定的值为空,或者转换失败,返回默认值<br>
      * 如果给定的值为空,或者转换失败,返回默认值<br>
      * 转换失败不会报错
      * 转换失败不会报错
-     * 
+     *
      * @param value 被转换的值
      * @param value 被转换的值
      * @param defaultValue 转换错误时的默认值
      * @param defaultValue 转换错误时的默认值
      * @return 结果
      * @return 结果
@@ -422,7 +423,7 @@ public class Convert
      * 转换为long<br>
      * 转换为long<br>
      * 如果给定的值为<code>null</code>,或者转换失败,返回默认值<code>null</code><br>
      * 如果给定的值为<code>null</code>,或者转换失败,返回默认值<code>null</code><br>
      * 转换失败不会报错
      * 转换失败不会报错
-     * 
+     *
      * @param value 被转换的值
      * @param value 被转换的值
      * @return 结果
      * @return 结果
      */
      */
@@ -435,7 +436,7 @@ public class Convert
      * 转换为double<br>
      * 转换为double<br>
      * 如果给定的值为空,或者转换失败,返回默认值<br>
      * 如果给定的值为空,或者转换失败,返回默认值<br>
      * 转换失败不会报错
      * 转换失败不会报错
-     * 
+     *
      * @param value 被转换的值
      * @param value 被转换的值
      * @param defaultValue 转换错误时的默认值
      * @param defaultValue 转换错误时的默认值
      * @return 结果
      * @return 结果
@@ -474,7 +475,7 @@ public class Convert
      * 转换为double<br>
      * 转换为double<br>
      * 如果给定的值为空,或者转换失败,返回默认值<code>null</code><br>
      * 如果给定的值为空,或者转换失败,返回默认值<code>null</code><br>
      * 转换失败不会报错
      * 转换失败不会报错
-     * 
+     *
      * @param value 被转换的值
      * @param value 被转换的值
      * @return 结果
      * @return 结果
      */
      */
@@ -487,7 +488,7 @@ public class Convert
      * 转换为Float<br>
      * 转换为Float<br>
      * 如果给定的值为空,或者转换失败,返回默认值<br>
      * 如果给定的值为空,或者转换失败,返回默认值<br>
      * 转换失败不会报错
      * 转换失败不会报错
-     * 
+     *
      * @param value 被转换的值
      * @param value 被转换的值
      * @param defaultValue 转换错误时的默认值
      * @param defaultValue 转换错误时的默认值
      * @return 结果
      * @return 结果
@@ -525,7 +526,7 @@ public class Convert
      * 转换为Float<br>
      * 转换为Float<br>
      * 如果给定的值为空,或者转换失败,返回默认值<code>null</code><br>
      * 如果给定的值为空,或者转换失败,返回默认值<code>null</code><br>
      * 转换失败不会报错
      * 转换失败不会报错
-     * 
+     *
      * @param value 被转换的值
      * @param value 被转换的值
      * @return 结果
      * @return 结果
      */
      */
@@ -538,7 +539,7 @@ public class Convert
      * 转换为boolean<br>
      * 转换为boolean<br>
      * String支持的值为:true、false、yes、ok、no,1,0 如果给定的值为空,或者转换失败,返回默认值<br>
      * String支持的值为:true、false、yes、ok、no,1,0 如果给定的值为空,或者转换失败,返回默认值<br>
      * 转换失败不会报错
      * 转换失败不会报错
-     * 
+     *
      * @param value 被转换的值
      * @param value 被转换的值
      * @param defaultValue 转换错误时的默认值
      * @param defaultValue 转换错误时的默认值
      * @return 结果
      * @return 结果
@@ -579,7 +580,7 @@ public class Convert
      * 转换为boolean<br>
      * 转换为boolean<br>
      * 如果给定的值为空,或者转换失败,返回默认值<code>null</code><br>
      * 如果给定的值为空,或者转换失败,返回默认值<code>null</code><br>
      * 转换失败不会报错
      * 转换失败不会报错
-     * 
+     *
      * @param value 被转换的值
      * @param value 被转换的值
      * @return 结果
      * @return 结果
      */
      */
@@ -591,7 +592,7 @@ public class Convert
     /**
     /**
      * 转换为Enum对象<br>
      * 转换为Enum对象<br>
      * 如果给定的值为空,或者转换失败,返回默认值<br>
      * 如果给定的值为空,或者转换失败,返回默认值<br>
-     * 
+     *
      * @param clazz Enum的Class
      * @param clazz Enum的Class
      * @param value 值
      * @param value 值
      * @param defaultValue 默认值
      * @param defaultValue 默认值
@@ -627,7 +628,7 @@ public class Convert
     /**
     /**
      * 转换为Enum对象<br>
      * 转换为Enum对象<br>
      * 如果给定的值为空,或者转换失败,返回默认值<code>null</code><br>
      * 如果给定的值为空,或者转换失败,返回默认值<code>null</code><br>
-     * 
+     *
      * @param clazz Enum的Class
      * @param clazz Enum的Class
      * @param value 值
      * @param value 值
      * @return Enum
      * @return Enum
@@ -641,7 +642,7 @@ public class Convert
      * 转换为BigInteger<br>
      * 转换为BigInteger<br>
      * 如果给定的值为空,或者转换失败,返回默认值<br>
      * 如果给定的值为空,或者转换失败,返回默认值<br>
      * 转换失败不会报错
      * 转换失败不会报错
-     * 
+     *
      * @param value 被转换的值
      * @param value 被转换的值
      * @param defaultValue 转换错误时的默认值
      * @param defaultValue 转换错误时的默认值
      * @return 结果
      * @return 结果
@@ -679,7 +680,7 @@ public class Convert
      * 转换为BigInteger<br>
      * 转换为BigInteger<br>
      * 如果给定的值为空,或者转换失败,返回默认值<code>null</code><br>
      * 如果给定的值为空,或者转换失败,返回默认值<code>null</code><br>
      * 转换失败不会报错
      * 转换失败不会报错
-     * 
+     *
      * @param value 被转换的值
      * @param value 被转换的值
      * @return 结果
      * @return 结果
      */
      */
@@ -692,7 +693,7 @@ public class Convert
      * 转换为BigDecimal<br>
      * 转换为BigDecimal<br>
      * 如果给定的值为空,或者转换失败,返回默认值<br>
      * 如果给定的值为空,或者转换失败,返回默认值<br>
      * 转换失败不会报错
      * 转换失败不会报错
-     * 
+     *
      * @param value 被转换的值
      * @param value 被转换的值
      * @param defaultValue 转换错误时的默认值
      * @param defaultValue 转换错误时的默认值
      * @return 结果
      * @return 结果
@@ -738,7 +739,7 @@ public class Convert
      * 转换为BigDecimal<br>
      * 转换为BigDecimal<br>
      * 如果给定的值为空,或者转换失败,返回默认值<br>
      * 如果给定的值为空,或者转换失败,返回默认值<br>
      * 转换失败不会报错
      * 转换失败不会报错
-     * 
+     *
      * @param value 被转换的值
      * @param value 被转换的值
      * @return 结果
      * @return 结果
      */
      */
@@ -750,7 +751,7 @@ public class Convert
     /**
     /**
      * 将对象转为字符串<br>
      * 将对象转为字符串<br>
      * 1、Byte数组和ByteBuffer会被转换为对应字符串的数组 2、对象数组会调用Arrays.toString方法
      * 1、Byte数组和ByteBuffer会被转换为对应字符串的数组 2、对象数组会调用Arrays.toString方法
-     * 
+     *
      * @param obj 对象
      * @param obj 对象
      * @return 字符串
      * @return 字符串
      */
      */
@@ -762,7 +763,7 @@ public class Convert
     /**
     /**
      * 将对象转为字符串<br>
      * 将对象转为字符串<br>
      * 1、Byte数组和ByteBuffer会被转换为对应字符串的数组 2、对象数组会调用Arrays.toString方法
      * 1、Byte数组和ByteBuffer会被转换为对应字符串的数组 2、对象数组会调用Arrays.toString方法
-     * 
+     *
      * @param obj 对象
      * @param obj 对象
      * @param charsetName 字符集
      * @param charsetName 字符集
      * @return 字符串
      * @return 字符串
@@ -775,7 +776,7 @@ public class Convert
     /**
     /**
      * 将对象转为字符串<br>
      * 将对象转为字符串<br>
      * 1、Byte数组和ByteBuffer会被转换为对应字符串的数组 2、对象数组会调用Arrays.toString方法
      * 1、Byte数组和ByteBuffer会被转换为对应字符串的数组 2、对象数组会调用Arrays.toString方法
-     * 
+     *
      * @param obj 对象
      * @param obj 对象
      * @param charset 字符集
      * @param charset 字符集
      * @return 字符串
      * @return 字符串
@@ -809,7 +810,7 @@ public class Convert
 
 
     /**
     /**
      * 将byte数组转为字符串
      * 将byte数组转为字符串
-     * 
+     *
      * @param bytes byte数组
      * @param bytes byte数组
      * @param charset 字符集
      * @param charset 字符集
      * @return 字符串
      * @return 字符串
@@ -821,7 +822,7 @@ public class Convert
 
 
     /**
     /**
      * 解码字节码
      * 解码字节码
-     * 
+     *
      * @param data 字符串
      * @param data 字符串
      * @param charset 字符集,如果此字段为空,则解码的结果取决于平台
      * @param charset 字符集,如果此字段为空,则解码的结果取决于平台
      * @return 解码后的字符串
      * @return 解码后的字符串
@@ -842,7 +843,7 @@ public class Convert
 
 
     /**
     /**
      * 将编码的byteBuffer数据转换为字符串
      * 将编码的byteBuffer数据转换为字符串
-     * 
+     *
      * @param data 数据
      * @param data 数据
      * @param charset 字符集,如果为空使用当前系统字符集
      * @param charset 字符集,如果为空使用当前系统字符集
      * @return 字符串
      * @return 字符串
@@ -859,7 +860,7 @@ public class Convert
 
 
     /**
     /**
      * 将编码的byteBuffer数据转换为字符串
      * 将编码的byteBuffer数据转换为字符串
-     * 
+     *
      * @param data 数据
      * @param data 数据
      * @param charset 字符集,如果为空使用当前系统字符集
      * @param charset 字符集,如果为空使用当前系统字符集
      * @return 字符串
      * @return 字符串
@@ -876,7 +877,7 @@ public class Convert
     // ----------------------------------------------------------------------- 全角半角转换
     // ----------------------------------------------------------------------- 全角半角转换
     /**
     /**
      * 半角转全角
      * 半角转全角
-     * 
+     *
      * @param input String.
      * @param input String.
      * @return 全角字符串.
      * @return 全角字符串.
      */
      */
@@ -887,14 +888,14 @@ public class Convert
 
 
     /**
     /**
      * 半角转全角
      * 半角转全角
-     * 
+     *
      * @param input String
      * @param input String
      * @param notConvertSet 不替换的字符集合
      * @param notConvertSet 不替换的字符集合
      * @return 全角字符串.
      * @return 全角字符串.
      */
      */
     public static String toSBC(String input, Set<Character> notConvertSet)
     public static String toSBC(String input, Set<Character> notConvertSet)
     {
     {
-        char c[] = input.toCharArray();
+        char[] c = input.toCharArray();
         for (int i = 0; i < c.length; i++)
         for (int i = 0; i < c.length; i++)
         {
         {
             if (null != notConvertSet && notConvertSet.contains(c[i]))
             if (null != notConvertSet && notConvertSet.contains(c[i]))
@@ -918,7 +919,7 @@ public class Convert
 
 
     /**
     /**
      * 全角转半角
      * 全角转半角
-     * 
+     *
      * @param input String.
      * @param input String.
      * @return 半角字符串
      * @return 半角字符串
      */
      */
@@ -929,14 +930,14 @@ public class Convert
 
 
     /**
     /**
      * 替换全角为半角
      * 替换全角为半角
-     * 
+     *
      * @param text 文本
      * @param text 文本
      * @param notConvertSet 不替换的字符集合
      * @param notConvertSet 不替换的字符集合
      * @return 替换后的字符
      * @return 替换后的字符
      */
      */
     public static String toDBC(String text, Set<Character> notConvertSet)
     public static String toDBC(String text, Set<Character> notConvertSet)
     {
     {
-        char c[] = text.toCharArray();
+        char[] c = text.toCharArray();
         for (int i = 0; i < c.length; i++)
         for (int i = 0; i < c.length; i++)
         {
         {
             if (null != notConvertSet && notConvertSet.contains(c[i]))
             if (null != notConvertSet && notConvertSet.contains(c[i]))
@@ -961,7 +962,7 @@ public class Convert
 
 
     /**
     /**
      * 数字金额大写转换 先写个完整的然后将如零拾替换成零
      * 数字金额大写转换 先写个完整的然后将如零拾替换成零
-     * 
+     *
      * @param n 数字
      * @param n 数字
      * @return 中文大写数字
      * @return 中文大写数字
      */
      */
@@ -977,7 +978,12 @@ public class Convert
         String s = "";
         String s = "";
         for (int i = 0; i < fraction.length; i++)
         for (int i = 0; i < fraction.length; i++)
         {
         {
-            s += (digit[(int) (Math.floor(n * 10 * Math.pow(10, i)) % 10)] + fraction[i]).replaceAll("(零.)+", "");
+            // 优化double计算精度丢失问题
+            BigDecimal nNum = new BigDecimal(n);
+            BigDecimal decimal = new BigDecimal(10);
+            BigDecimal scale = nNum.multiply(decimal).setScale(2, RoundingMode.HALF_EVEN);
+            double d = scale.doubleValue();
+            s += (digit[(int) (Math.floor(d * Math.pow(10, i)) % 10)] + fraction[i]).replaceAll("(零.)+", "");
         }
         }
         if (s.length() < 1)
         if (s.length() < 1)
         {
         {