JAVA數(shù)字轉(zhuǎn)中文大寫兩種實(shí)現(xiàn)代碼
一般在收據(jù)打印過程中,可能會要求展示中文大寫金額,以下提供兩種實(shí)現(xiàn)。
1正常代碼邏輯處理
優(yōu)點(diǎn):易理解,好維護(hù)
缺點(diǎn):代碼較長
package com.test;
import java.math.BigDecimal;
public class NumberToChinese {
private static final String[] NUMBERS = {"零", "壹", "貳", "叁", "肆", "伍", "陸", "柒", "捌", "玖"};
private static final String[] UNITS = {"", "拾", "佰", "仟"};
private static final String[] BIG_UNITS = {"", "萬", "億", "兆"};
public static String numberToChinese(double number) {
boolean isNegative = number < 0;
number = Math.abs(number);
BigDecimal bigDecimal = new BigDecimal(String.valueOf(number));
long integerPart = bigDecimal.longValue();
int decimalPart = (bigDecimal.subtract(new BigDecimal(integerPart)).multiply(new BigDecimal(100))).intValue();
if (integerPart == 0 && decimalPart == 0) {
return isNegative ? "負(fù)零元整" : "零元整";
}
StringBuilder result = new StringBuilder();
int unitIndex = 0;
boolean zeroFlag = false;
while (integerPart > 0) {
long group = integerPart % 10000;
if (group != 0) {
if (zeroFlag) {
result.insert(0, "零");
}
result.insert(0, BIG_UNITS[unitIndex]);
result.insert(0, groupToChinese(group));
zeroFlag = false;
} else {
zeroFlag = true;
}
integerPart /= 10000;
unitIndex++;
}
// 去除多余的零
while (result.length() > 0 && result.charAt(0) == '零') {
result.deleteCharAt(0);
}
// 如果小數(shù)部分為 0,直接添加“元整”
if (decimalPart == 0) {
// 避免出現(xiàn)“零元整”情況,這里判斷結(jié)果最后是否是大單位,如果是直接加“整”
if (result.length() > 0 && isBigUnit(result.charAt(result.length() - 1))) {
result.append("整");
} else if("零".equals(result.substring(result.length() - 1,result.length()))) {
result.replace(result.length() - 1,result.length(),"").append("元整");
}else{
result.append("元整");
}
} else {
result.append("元");
String decimalStr = decimalToChinese(decimalPart);
if (!decimalStr.isEmpty()) {
result.append(decimalStr);
}
}
if (isNegative) {
result.insert(0, "負(fù)");
}
return result.toString();
}
private static String groupToChinese(long group) {
StringBuilder groupResult = new StringBuilder();
boolean zeroFlag = false;
for (int i = 0; i < 4; i++) {
int digit = (int) (group / (long) Math.pow(10, 3 - i) % 10);
if (digit != 0) {
if (zeroFlag) {
groupResult.append("零");
}
groupResult.append(NUMBERS[digit]).append(UNITS[3 - i]);
zeroFlag = false;
} else {
zeroFlag = true;
}
}
String result = groupResult.toString();
if (result.endsWith("零")) {
result = result.substring(0, result.length() - 1);
}
return result;
}
private static String decimalToChinese(int decimalPart) {
StringBuilder decimalResult = new StringBuilder();
int jiao = decimalPart / 10;
int fen = decimalPart % 10;
if (jiao != 0) {
decimalResult.append(NUMBERS[jiao]).append("角");
} else if (fen != 0) {
decimalResult.append("零");
}
if (fen != 0) {
decimalResult.append(NUMBERS[fen]).append("分");
}
return decimalResult.toString();
}
private static boolean isBigUnit(char c) {
for (String unit : BIG_UNITS) {
if (unit.length() > 0 && unit.charAt(0) == c) {
return true;
}
}
return false;
}
public static void main(String[] args) {
double positiveInteger = 510000.00;
double positiveDecimal = 12345.67;
double negativeInteger = -500000.00;
double negativeDecimal = -12345.67;
double zeroNumber = 0;
double wan = 51111.00;
String positiveIntegerChinese = numberToChinese(positiveInteger);
String positiveDecimalChinese = numberToChinese(positiveDecimal);
String negativeIntegerChinese = numberToChinese(negativeInteger);
String negativeDecimalChinese = numberToChinese(negativeDecimal);
String zeroChinese = numberToChinese(zeroNumber);
String wanChinese = numberToChinese(wan);
System.out.println("正整數(shù)金額轉(zhuǎn)換結(jié)果: " + positiveIntegerChinese);
System.out.println("正小數(shù)金額轉(zhuǎn)換結(jié)果: " + positiveDecimalChinese);
System.out.println("負(fù)整數(shù)金額轉(zhuǎn)換結(jié)果: " + negativeIntegerChinese);
System.out.println("負(fù)小數(shù)金額轉(zhuǎn)換結(jié)果: " + negativeDecimalChinese);
System.out.println("零金額轉(zhuǎn)換結(jié)果: " + zeroChinese);
System.out.println("wan轉(zhuǎn)換結(jié)果: " + wanChinese);
}
}
代碼方法作用解釋:
常量定義:
NUMBERS:存儲中文數(shù)字大寫字符。UNITS:存儲整數(shù)部分每四位一組內(nèi)的單位(個、十、百、千)。BIG_UNITS:存儲整數(shù)部分每四位一組的大單位(萬、億、兆)。DECIMAL_UNIT:存儲小數(shù)部分的單位(角、分)。
numberToChinese 方法:
- 使用
BigDecimal處理輸入的數(shù)字,避免浮點(diǎn)數(shù)精度問題。 - 分離整數(shù)部分和小數(shù)部分。
- 處理整數(shù)部分,按每四位一組進(jìn)行轉(zhuǎn)換,并添加大單位。
- 處理小數(shù)部分,根據(jù)小數(shù)位的值添加對應(yīng)的中文大寫和單位。
- 使用
groupToChinese 方法:
- 將每四位一組的數(shù)字轉(zhuǎn)換為中文大寫。
- 處理連續(xù)零的情況,避免出現(xiàn)多余的零。
2使用正則
優(yōu)點(diǎn):代碼片段短
缺點(diǎn):使用了正則的貪婪符號,可能會造成代碼回溯情況,嚴(yán)重可造成阻斷風(fēng)險
public static String digitUppercase(double n){
String[] fraction = {"角", "分"};
String[] digit = { "零", "壹", "貳", "叁", "肆", "伍", "陸", "柒", "捌", "玖" };
String[][] unit = {
{"元", "萬", "億"},
{"", "拾", "佰", "仟"}};
String head = n < 0? "負(fù)": "";
n = Math.abs(n);
String s = "";
for (int i = 0; i < fraction.length; i++) {
BigDecimal bd = BigDecimal.valueOf(n);
bd = bd.setScale(2, bd.ROUND_HALF_EVEN);
BigDecimal rs = bd.multiply(BigDecimal.valueOf(10)).multiply(BigDecimal.valueOf(Math.pow(10, i))).divideAndRemainder(new BigDecimal(10))[1];
s+=(digit[(int)(Math.floor(rs.doubleValue()))]+ fraction[i]).replaceAll("(零.)+", "");
}
if(s.length()<1){
s = "整";
}
int integerPart = (int)Math.floor(n);
for (int i = 0; i < unit[0].length && integerPart > 0; i++) {
String p ="";
for (int j = 0; j < unit[1].length && n > 0; j++) {
p = digit[integerPart%10]+unit[1][j] + p;
integerPart = integerPart/10;
}
s = p.replaceAll("(零.)*零$", "").replaceAll("^$", "零") + unit[0][i] + s;
}
return head + s.replaceAll("(零.)*零元", "元").replaceFirst("(零.)+", "").replaceAll("(零.)+", "零").replaceAll("^整$", "零元整");
}總結(jié)
到此這篇關(guān)于JAVA數(shù)字轉(zhuǎn)中文大寫兩種實(shí)現(xiàn)代碼的文章就介紹到這了,更多相關(guān)JAVA數(shù)字轉(zhuǎn)中文大寫內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Spring中Bean有關(guān)NullPointerException異常的原因分析
在Spring中使用@Autowired注解注入的bean不能在靜態(tài)上下文中訪問,否則會導(dǎo)致NullPointerException,解決方法包括避免在靜態(tài)方法中使用注入的bean,或者使用Spring的ApplicationContext來獲取bean,但后者不推薦2024-12-12
Win10 Java jdk14.0.2安裝及環(huán)境變量配置詳細(xì)教程
這篇文章主要介紹了Win10 Java jdk14.0.2安裝及環(huán)境變量配置,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-08-08
Java 高并發(fā)七:并發(fā)設(shè)計模型詳解
本文主要介紹Java高并發(fā) 并發(fā)設(shè)計模型的知識,這里主要講解 1. 什么是設(shè)計模式 2. 單例模式 3. 不變模式 4. Future模式 5. 生產(chǎn)者消費(fèi)者,有需要的小伙伴可以參考下2016-09-09
關(guān)于SpringMVC對Restful風(fēng)格的支持詳解
Restful就是一個資源定位及資源操作的風(fēng)格,不是標(biāo)準(zhǔn)也不是協(xié)議,只是一種風(fēng)格,是對http協(xié)議的詮釋,下面這篇文章主要給大家介紹了關(guān)于SpringMVC對Restful風(fēng)格支持的相關(guān)資料,需要的朋友可以參考下2022-01-01
Spring?MVC和springboot靜態(tài)資源處理問題
這篇文章主要介紹了Spring?MVC和springboot靜態(tài)資源處理問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-08-08

