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

pull/476/head
RuoYi 2023-11-10 16:29:24 +08:00
parent d7f58f4128
commit 7d91e58594
1 changed files with 54 additions and 48 deletions

View File

@ -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>
* Stringtruefalseyesokno1,0 <br> * Stringtruefalseyesokno1,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 EnumClass * @param clazz EnumClass
* @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 EnumClass * @param clazz EnumClass
* @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>
* 1ByteByteBuffer 2Arrays.toString * 1ByteByteBuffer 2Arrays.toString
* *
* @param obj * @param obj
* @return * @return
*/ */
@ -762,7 +763,7 @@ public class Convert
/** /**
* <br> * <br>
* 1ByteByteBuffer 2Arrays.toString * 1ByteByteBuffer 2Arrays.toString
* *
* @param obj * @param obj
* @param charsetName * @param charsetName
* @return * @return
@ -775,7 +776,7 @@ public class Convert
/** /**
* <br> * <br>
* 1ByteByteBuffer 2Arrays.toString * 1ByteByteBuffer 2Arrays.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)
{ {