This commit is contained in:
Looly 2021-11-03 00:29:54 +08:00
parent 8614aecced
commit 7e62bf4626
2 changed files with 83 additions and 26 deletions

View File

@ -1,5 +1,6 @@
package cn.hutool.core.convert;
import cn.hutool.core.lang.Assert;
import cn.hutool.core.util.ArrayUtil;
import cn.hutool.core.util.StrUtil;
@ -59,45 +60,67 @@ public class NumberChineseFormatter {
* @return 中文
*/
public static String format(double amount, boolean isUseTraditional, boolean isMoneyMode) {
if (amount > 99_9999_9999_9999.99 || amount < -99999999999999.99) {
throw new IllegalArgumentException("Number support only: (-99999999999999.99 99999999999999.99)");
if(0 == amount){
return "";
}
Assert.checkBetween(amount, -99_9999_9999_9999.99, 99_9999_9999_9999.99,
"Number support only: (-99999999999999.99 99999999999999.99)");
final StringBuilder chineseStr = new StringBuilder();
// 负数
boolean negative = false;
if (amount < 0) {
negative = true;
chineseStr.append("");
amount = -amount;
}
// 分和角
long temp = Math.round(amount * 100);
long yuan = Math.round(amount * 100);
final int fen = (int) (yuan % 10);
yuan = yuan / 10;
final int jiao = (int) (yuan % 10);
yuan = yuan / 10;
final int numFen = (int) (temp % 10);
temp = temp / 10;
final int numJiao = (int) (temp % 10);
temp = temp / 10;
//
if(false == isMoneyMode || 0 != yuan){
// 金额模式下无需零元
chineseStr.append(longToChinese(yuan, isUseTraditional));
if(isMoneyMode){
chineseStr.append("");
}
}
final StringBuilder chineseStr = new StringBuilder(longToChinese(temp, isUseTraditional));
//负数
if (negative) { // 整数部分不为 0
chineseStr.insert(0, "");
if(0 == jiao && 0 == fen){
//无小数部分的金额结尾
if(isMoneyMode){
chineseStr.append("");
}
return chineseStr.toString();
}
// 小数部分
if (numFen != 0 || numJiao != 0) {
if (numFen == 0) {
chineseStr.append(isMoneyMode ? "" : "").append(numberToChinese(numJiao, isUseTraditional)).append(isMoneyMode ? "" : "");
} else { // 数不为 0
if (numJiao == 0) {
chineseStr.append(isMoneyMode ? "元零" : "点零").append(numberToChinese(numFen, isUseTraditional)).append(isMoneyMode ? "" : "");
} else {
chineseStr.append(isMoneyMode ? "" : "").append(numberToChinese(numJiao, isUseTraditional)).append(isMoneyMode ? "" : "").append(numberToChinese(numFen, isUseTraditional)).append(isMoneyMode ? "" : "");
}
if(false == isMoneyMode){
chineseStr.append("");
}
//
if(0 == yuan && 0 == jiao){
// 元和角都为0时只有非金额模式下补
if(false == isMoneyMode){
chineseStr.append("");
}
}else{
chineseStr.append(numberToChinese(jiao, isUseTraditional));
if(isMoneyMode && 0 != jiao){
chineseStr.append("");
}
}
//
if(0 != fen){
chineseStr.append(numberToChinese(fen, isUseTraditional));
if(isMoneyMode){
chineseStr.append("");
}
} else if (isMoneyMode) {
//无小数部分的金额结尾
chineseStr.append("元整");
}
return chineseStr.toString();

View File

@ -278,4 +278,38 @@ public class NumberChineseFormatterTest {
// 非法字符
NumberChineseFormatter.chineseToNumber("一百你三");
}
@Test
public void singleMoneyTest(){
String format = NumberChineseFormatter.format(0.01, false, true);
Assert.assertEquals("一分", format);
format = NumberChineseFormatter.format(0.10, false, true);
Assert.assertEquals("一角", format);
format = NumberChineseFormatter.format(0.12, false, true);
Assert.assertEquals("一角二分", format);
format = NumberChineseFormatter.format(1.00, false, true);
Assert.assertEquals("一元整", format);
format = NumberChineseFormatter.format(1.10, false, true);
Assert.assertEquals("一元一角", format);
format = NumberChineseFormatter.format(1.02, false, true);
Assert.assertEquals("一元零二分", format);
}
@Test
public void singleNumberTest(){
String format = NumberChineseFormatter.format(0.01, false, false);
Assert.assertEquals("零点零一", format);
format = NumberChineseFormatter.format(0.10, false, false);
Assert.assertEquals("零点一", format);
format = NumberChineseFormatter.format(0.12, false, false);
Assert.assertEquals("零点一二", format);
format = NumberChineseFormatter.format(1.00, false, false);
Assert.assertEquals("", format);
format = NumberChineseFormatter.format(1.10, false, false);
Assert.assertEquals("一点一", format);
format = NumberChineseFormatter.format(1.02, false, false);
Assert.assertEquals("一点零二", format);
}
}