阿拉伯数字转换成中文对发票票面金额转换的扩展

This commit is contained in:
MCP 2022-03-10 15:45:43 +08:00
parent b8bfce490b
commit 206de3bad0

View File

@ -40,7 +40,6 @@ public class NumberChineseFormatter {
new ChineseUnit('亿', 1_0000_0000, true), new ChineseUnit('亿', 1_0000_0000, true),
}; };
/** /**
* 阿拉伯数字转换成中文,小数点后四舍五入保留两位. 使用于整数小数的转换. * 阿拉伯数字转换成中文,小数点后四舍五入保留两位. 使用于整数小数的转换.
* *
@ -53,15 +52,25 @@ public class NumberChineseFormatter {
} }
/** /**
* 阿拉伯数字转换成中文,小数点后四舍五入保留两位. 使用于整数小数的转换. * 阿拉伯数字转换成中文.
*
* <p>主要是对发票票面金额转换的扩展
* <p>-12.32
* <p>发票票面转换为(负数)壹拾贰圆叁角贰分
* <p>而非负壹拾贰元叁角贰分
* <p>共两点不同1(负数) 而非 2 而非
* 2022/3/9
* *
* @param amount 数字 * @param amount 数字
* @param isUseTraditional 是否使用繁体 * @param isUseTraditional 是否使用繁体
* @param isMoneyMode 是否为金额模式 * @param isMoneyMode 是否金额模式
* @return 中文 * @param negativeName 负号转换名称 (负数)
* @param unitName 单位名称
* @return java.lang.String
* @author machuanpeng
*/ */
public static String format(double amount, boolean isUseTraditional, boolean isMoneyMode) { public static String format(double amount, boolean isUseTraditional, boolean isMoneyMode, String negativeName, String unitName) {
if(0 == amount){ if (0 == amount) {
return ""; return "";
} }
Assert.checkBetween(amount, -99_9999_9999_9999.99, 99_9999_9999_9999.99, Assert.checkBetween(amount, -99_9999_9999_9999.99, 99_9999_9999_9999.99,
@ -71,7 +80,7 @@ public class NumberChineseFormatter {
// 负数 // 负数
if (amount < 0) { if (amount < 0) {
chineseStr.append(""); chineseStr.append(StrUtil.isNullOrUndefined(negativeName) ? "" : negativeName);
amount = -amount; amount = -amount;
} }
@ -82,44 +91,44 @@ public class NumberChineseFormatter {
yuan = yuan / 10; yuan = yuan / 10;
// //
if(false == isMoneyMode || 0 != yuan){ if (false == isMoneyMode || 0 != yuan) {
// 金额模式下无需零元 // 金额模式下无需零元
chineseStr.append(longToChinese(yuan, isUseTraditional)); chineseStr.append(longToChinese(yuan, isUseTraditional));
if(isMoneyMode){ if (isMoneyMode) {
chineseStr.append(""); chineseStr.append(StrUtil.isNullOrUndefined(unitName) ? "" : unitName);
} }
} }
if(0 == jiao && 0 == fen){ if (0 == jiao && 0 == fen) {
//无小数部分的金额结尾 //无小数部分的金额结尾
if(isMoneyMode){ if (isMoneyMode) {
chineseStr.append(""); chineseStr.append("");
} }
return chineseStr.toString(); return chineseStr.toString();
} }
// 小数部分 // 小数部分
if(false == isMoneyMode){ if (false == isMoneyMode) {
chineseStr.append(""); chineseStr.append("");
} }
// //
if(0 == yuan && 0 == jiao){ if (0 == yuan && 0 == jiao) {
// 元和角都为0时只有非金额模式下补 // 元和角都为0时只有非金额模式下补
if(false == isMoneyMode){ if (false == isMoneyMode) {
chineseStr.append(""); chineseStr.append("");
} }
}else{ } else {
chineseStr.append(numberToChinese(jiao, isUseTraditional)); chineseStr.append(numberToChinese(jiao, isUseTraditional));
if(isMoneyMode && 0 != jiao){ if (isMoneyMode && 0 != jiao) {
chineseStr.append(""); chineseStr.append("");
} }
} }
// //
if(0 != fen){ if (0 != fen) {
chineseStr.append(numberToChinese(fen, isUseTraditional)); chineseStr.append(numberToChinese(fen, isUseTraditional));
if(isMoneyMode){ if (isMoneyMode) {
chineseStr.append(""); chineseStr.append("");
} }
} }
@ -127,16 +136,28 @@ public class NumberChineseFormatter {
return chineseStr.toString(); return chineseStr.toString();
} }
/**
* 阿拉伯数字转换成中文,小数点后四舍五入保留两位. 使用于整数小数的转换.
*
* @param amount 数字
* @param isUseTraditional 是否使用繁体
* @param isMoneyMode 是否为金额模式
* @return 中文
*/
public static String format(double amount, boolean isUseTraditional, boolean isMoneyMode) {
return format(amount, isUseTraditional, isMoneyMode, "", "");
}
/** /**
* 阿拉伯数字支持正负整数转换成中文 * 阿拉伯数字支持正负整数转换成中文
* *
* @param amount 数字 * @param amount 数字
* @param isUseTraditional 是否使用繁体 * @param isUseTraditional 是否使用繁体
* @return 中文 * @return 中文
* @since 5.7.17 * @since 5.7.17
*/ */
public static String format(long amount, boolean isUseTraditional){ public static String format(long amount, boolean isUseTraditional) {
if(0 == amount){ if (0 == amount) {
return ""; return "";
} }
Assert.checkBetween(amount, -99_9999_9999_9999.99, 99_9999_9999_9999.99, Assert.checkBetween(amount, -99_9999_9999_9999.99, 99_9999_9999_9999.99,
@ -179,16 +200,16 @@ public class NumberChineseFormatter {
* 格式化-999~999之间的数字<br> * 格式化-999~999之间的数字<br>
* 这个方法显示10~19以下的数字时使用"十一"而非"一十一" * 这个方法显示10~19以下的数字时使用"十一"而非"一十一"
* *
* @param amount 数字 * @param amount 数字
* @param isUseTraditional 是否使用繁体 * @param isUseTraditional 是否使用繁体
* @return 中文 * @return 中文
* @since 5.7.17 * @since 5.7.17
*/ */
public static String formatThousand(int amount, boolean isUseTraditional){ public static String formatThousand(int amount, boolean isUseTraditional) {
Assert.checkBetween(amount, -999, 999, "Number support only: (-999 ~ 999)"); Assert.checkBetween(amount, -999, 999, "Number support only: (-999 ~ 999)");
final String chinese = thousandToChinese(amount, isUseTraditional); final String chinese = thousandToChinese(amount, isUseTraditional);
if(amount < 20 && amount >= 10){ if (amount < 20 && amount >= 10) {
// "十一"而非"一十一" // "十一"而非"一十一"
return chinese.substring(1); return chinese.substring(1);
} }
@ -218,7 +239,7 @@ public class NumberChineseFormatter {
* @return 中文 * @return 中文
*/ */
private static String longToChinese(long amount, boolean isUseTraditional) { private static String longToChinese(long amount, boolean isUseTraditional) {
if(0 == amount){ if (0 == amount) {
return ""; return "";
} }
@ -235,11 +256,11 @@ public class NumberChineseFormatter {
// //
partValue = parts[0]; partValue = parts[0];
if(partValue > 0){ if (partValue > 0) {
partChinese = thousandToChinese(partValue, isUseTraditional); partChinese = thousandToChinese(partValue, isUseTraditional);
chineseStr.insert(0, partChinese); chineseStr.insert(0, partChinese);
if(partValue < 1000){ if (partValue < 1000) {
// 和万位之间空0则补零如一万零三百 // 和万位之间空0则补零如一万零三百
addPreZero(chineseStr); addPreZero(chineseStr);
} }
@ -247,26 +268,26 @@ public class NumberChineseFormatter {
// //
partValue = parts[1]; partValue = parts[1];
if(partValue > 0){ if (partValue > 0) {
if((partValue % 10 == 0 && parts[0] > 0)){ if ((partValue % 10 == 0 && parts[0] > 0)) {
// 如果""的个位是0则补零如十万零八千 // 如果""的个位是0则补零如十万零八千
addPreZero(chineseStr); addPreZero(chineseStr);
} }
partChinese = thousandToChinese(partValue, isUseTraditional); partChinese = thousandToChinese(partValue, isUseTraditional);
chineseStr.insert(0, partChinese + ""); chineseStr.insert(0, partChinese + "");
if(partValue < 1000){ if (partValue < 1000) {
// 和亿位之间空0则补零如一亿零三百万 // 和亿位之间空0则补零如一亿零三百万
addPreZero(chineseStr); addPreZero(chineseStr);
} }
} else{ } else {
addPreZero(chineseStr); addPreZero(chineseStr);
} }
// 亿 // 亿
partValue = parts[2]; partValue = parts[2];
if(partValue > 0){ if (partValue > 0) {
if((partValue % 10 == 0 && parts[1] > 0)){ if ((partValue % 10 == 0 && parts[1] > 0)) {
// 如果""的个位是0则补零如十万零八千 // 如果""的个位是0则补零如十万零八千
addPreZero(chineseStr); addPreZero(chineseStr);
} }
@ -274,25 +295,25 @@ public class NumberChineseFormatter {
partChinese = thousandToChinese(partValue, isUseTraditional); partChinese = thousandToChinese(partValue, isUseTraditional);
chineseStr.insert(0, partChinese + "亿"); chineseStr.insert(0, partChinese + "亿");
if(partValue < 1000){ if (partValue < 1000) {
// 和万亿位之间空0则补零如一万亿零三百亿 // 和万亿位之间空0则补零如一万亿零三百亿
addPreZero(chineseStr); addPreZero(chineseStr);
} }
} else{ } else {
addPreZero(chineseStr); addPreZero(chineseStr);
} }
// 万亿 // 万亿
partValue = parts[3]; partValue = parts[3];
if(partValue > 0){ if (partValue > 0) {
if(parts[2] == 0){ if (parts[2] == 0) {
chineseStr.insert(0, "亿"); chineseStr.insert(0, "亿");
} }
partChinese = thousandToChinese(partValue, isUseTraditional); partChinese = thousandToChinese(partValue, isUseTraditional);
chineseStr.insert(0, partChinese + ""); chineseStr.insert(0, partChinese + "");
} }
if(StrUtil.isNotEmpty(chineseStr) && '零' == chineseStr.charAt(0)){ if (StrUtil.isNotEmpty(chineseStr) && '零' == chineseStr.charAt(0)) {
return chineseStr.substring(1); return chineseStr.substring(1);
} }
@ -386,7 +407,7 @@ public class NumberChineseFormatter {
} else { } else {
// 非节单位和单位前的单数字组合为值 // 非节单位和单位前的单数字组合为值
int unitNumber = number; int unitNumber = number;
if(0 == number && 0 == i){ if (0 == number && 0 == i) {
// issue#1726对于单位开头的数组默认赋予1 // issue#1726对于单位开头的数组默认赋予1
// 十二 -> 一十二 // 十二 -> 一十二
// 百二 -> 一百二 // 百二 -> 一百二
@ -502,12 +523,12 @@ public class NumberChineseFormatter {
} }
} }
private static void addPreZero(StringBuilder chineseStr){ private static void addPreZero(StringBuilder chineseStr) {
if(StrUtil.isEmpty(chineseStr)){ if (StrUtil.isEmpty(chineseStr)) {
return; return;
} }
final char c = chineseStr.charAt(0); final char c = chineseStr.charAt(0);
if('零' != c){ if ('零' != c) {
chineseStr.insert(0, '零'); chineseStr.insert(0, '零');
} }
} }