mirror of
https://gitee.com/chinabugotech/hutool.git
synced 2025-05-09 23:51:34 +08:00
fix
This commit is contained in:
parent
8614aecced
commit
7e62bf4626
@ -1,5 +1,6 @@
|
|||||||
package cn.hutool.core.convert;
|
package cn.hutool.core.convert;
|
||||||
|
|
||||||
|
import cn.hutool.core.lang.Assert;
|
||||||
import cn.hutool.core.util.ArrayUtil;
|
import cn.hutool.core.util.ArrayUtil;
|
||||||
import cn.hutool.core.util.StrUtil;
|
import cn.hutool.core.util.StrUtil;
|
||||||
|
|
||||||
@ -59,45 +60,67 @@ public class NumberChineseFormatter {
|
|||||||
* @return 中文
|
* @return 中文
|
||||||
*/
|
*/
|
||||||
public static String format(double amount, boolean isUseTraditional, boolean isMoneyMode) {
|
public static String format(double amount, boolean isUseTraditional, boolean isMoneyMode) {
|
||||||
if (amount > 99_9999_9999_9999.99 || amount < -99999999999999.99) {
|
if(0 == amount){
|
||||||
throw new IllegalArgumentException("Number support only: (-99999999999999.99 ~ 99999999999999.99)!");
|
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) {
|
if (amount < 0) {
|
||||||
negative = true;
|
chineseStr.append("负");
|
||||||
amount = -amount;
|
amount = -amount;
|
||||||
}
|
}
|
||||||
|
|
||||||
// 分和角
|
long yuan = Math.round(amount * 100);
|
||||||
long temp = 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;
|
if(false == isMoneyMode || 0 != yuan){
|
||||||
final int numJiao = (int) (temp % 10);
|
// 金额模式下,无需“零元”
|
||||||
temp = temp / 10;
|
chineseStr.append(longToChinese(yuan, isUseTraditional));
|
||||||
|
if(isMoneyMode){
|
||||||
|
chineseStr.append("元");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
final StringBuilder chineseStr = new StringBuilder(longToChinese(temp, isUseTraditional));
|
if(0 == jiao && 0 == fen){
|
||||||
//负数
|
//无小数部分的金额结尾
|
||||||
if (negative) { // 整数部分不为 0
|
if(isMoneyMode){
|
||||||
chineseStr.insert(0, "负");
|
chineseStr.append("整");
|
||||||
|
}
|
||||||
|
return chineseStr.toString();
|
||||||
}
|
}
|
||||||
|
|
||||||
// 小数部分
|
// 小数部分
|
||||||
if (numFen != 0 || numJiao != 0) {
|
if(false == isMoneyMode){
|
||||||
if (numFen == 0) {
|
chineseStr.append("点");
|
||||||
chineseStr.append(isMoneyMode ? "元" : "点").append(numberToChinese(numJiao, isUseTraditional)).append(isMoneyMode ? "角" : "");
|
}
|
||||||
} else { // “分”数不为 0
|
|
||||||
if (numJiao == 0) {
|
// 角
|
||||||
chineseStr.append(isMoneyMode ? "元零" : "点零").append(numberToChinese(numFen, isUseTraditional)).append(isMoneyMode ? "分" : "");
|
if(0 == yuan && 0 == jiao){
|
||||||
} else {
|
// 元和角都为0时,只有非金额模式下补“零”
|
||||||
chineseStr.append(isMoneyMode ? "元" : "点").append(numberToChinese(numJiao, isUseTraditional)).append(isMoneyMode ? "角" : "").append(numberToChinese(numFen, isUseTraditional)).append(isMoneyMode ? "分" : "");
|
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();
|
return chineseStr.toString();
|
||||||
|
@ -278,4 +278,38 @@ public class NumberChineseFormatterTest {
|
|||||||
// 非法字符
|
// 非法字符
|
||||||
NumberChineseFormatter.chineseToNumber("一百你三");
|
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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user