本文目錄一覽:
- 1、用java編譯金額的中文大寫轉換。
- 2、java如何將數字轉為中文大寫
- 3、JAVA 數字轉換為中文大寫的轉換
- 4、Java金額的中文大寫方式
- 5、JAVA練習題 金額的中文大寫
- 6、JAVA 編程 輸出金額的中文大寫形式
用java編譯金額的中文大寫轉換。
/**
* 金額小數轉換成中文大寫金額
* @author Neil Han
*
*/
public class ConvertMoneyToUppercase {
private static final String UNIT[] = { “萬”, “千”, “佰”, “拾”, “億”, “千”, “佰”,
“拾”, “萬”, “千”, “佰”, “拾”, “元”, “角”, “分” };
private static final String NUM[] = { “零”, “壹”, “貳”, “叄”, “肆”, “伍”, “陸”,
“柒”, “捌”, “玖” };
private static final double MAX_VALUE = 9999999999999.99D;
/**
* 將金額小數轉換成中文大寫金額
* @param money
* @return result
*/
public static String convertMoney(double money) {
if (money 0 || money MAX_VALUE)
return “參數非法!”;
long money1 = Math.round(money * 100); // 四捨五入到分
if (money1 == 0)
return “零元整”;
String strMoney = String.valueOf(money1);
int numIndex = 0; // numIndex用於選擇金額數值
int unitIndex = UNIT.length – strMoney.length(); // unitIndex用於選擇金額單位
boolean isZero = false; // 用於判斷當前為是否為零
String result = “”;
for (; numIndex strMoney.length(); numIndex++, unitIndex++) {
char num = strMoney.charAt(numIndex);
if (num == ‘0’) {
isZero = true;
if (UNIT[unitIndex] == “億” || UNIT[unitIndex] == “萬”
|| UNIT[unitIndex] == “元”) { // 如果當前位是億、萬、元,且數值為零
result = result + UNIT[unitIndex]; //補單位億、萬、元
isZero = false;
}
}else {
if (isZero) {
result = result + “零”;
isZero = false;
}
result = result + NUM[Integer.parseInt(String.valueOf(num))] + UNIT[unitIndex];
}
}
//不是角分結尾就加”整”字
if (!result.endsWith(“角”)!result.endsWith(“分”)) {
result = result + “整”;
}
//例如沒有這行代碼,數值”400000001101.2″,輸出就是”肆千億萬壹千壹佰零壹元貳角”
result = result.replaceAll(“億萬”, “億”);
return result;
}
public static void main(String[] args) {
double value = Double.parseDouble(“40330701101.2”);
System.out.println(“您輸入的金額(小寫)為:” + value);
System.out.println(“您輸入的金額(大寫)為:” + convertMoney(value));
}
}
java如何將數字轉為中文大寫
import org.apache.commons.lang3.StringUtils;
/**
* @Title: ConvertUpMoney
* @Description: 將數字金額轉換為大寫中文金額
* @date: 2019年6月18日 下午10:52:27
*/
public class ConvertUpMoney {
// 大寫數字
private static final String[] NUMBERS = {“零”,”壹”,”貳”,”叄”,”肆”,”伍”,”陸”,”柒”,”捌”,”玖”};
// 整數部分的單位
private static final String[] IUNIT = {“元”,”拾”,”佰”,”仟”,”萬”,”拾”,”佰”,”仟”,”億”,”拾”,”佰”,”仟”,”萬”,”拾”,”佰”,”仟”};
// 小數部分的單位
private static final String[] DUNIT = {“角”,”分”,”厘”};
/**
* 轉換為大寫的中文金額
* @param str 字元串類型的 金額數字
* @return
*/
public static String toChinese(String str) {
// 判斷輸入的金額字元串是否符合要求
if (StringUtils.isBlank(str) || !str.matches(“(-)?[\\d]*(.)?[\\d]*”)) {
return “抱歉,請輸入數字!”;
}
if(“0”.equals(str) || “0.00”.equals(str) || “0.0”.equals(str)) {
return “零元”;
}
// 判斷金額數字中是否存在負號”-“
boolean flag = false;
if(str.startsWith(“-“)){
// 標誌位,標誌此金額數字為負數
flag = true;
str = str.replaceAll(“-“, “”);
}
// 去掉金額數字中的逗號”,”
str = str.replaceAll(“,”, “”);
String integerStr;//整數部分數字
String decimalStr;//小數部分數字
// 初始化:分離整數部分和小數部分
if(str.indexOf(“.”)0) {
integerStr = str.substring(0,str.indexOf(“.”));
decimalStr = str.substring(str.indexOf(“.”) + 1);
}else if(str.indexOf(“.”)==0) {
integerStr = “”;
decimalStr = str.substring(1);
}else {
integerStr = str;
decimalStr = “”;
}
// beyond超出計算能力,直接返回
if(integerStr.length()IUNIT.length) {
return “超出計算能力!”;
}
// 整數部分數字
int[] integers = toIntArray(integerStr);
// 判斷整數部分是否存在輸入012的情況
if (integers.length1 integers[0] == 0) {
return “抱歉,輸入數字不符合要求!”;
}
// 設置萬單位
boolean isWan = isWan5(integerStr);
// 小數部分數字
int[] decimals = toIntArray(decimalStr);
// 返回最終的大寫金額
String result = getChineseInteger(integers, isWan) + getChineseDecimal(decimals);
if(flag){
// 如果是負數,加上”負”
return “負” + result;
}else{
return result;
}
}
/**
* 將字元串轉為int數組
* @param number 數字
* @return
*/
private static int[] toIntArray(String number) {
int[] array = new int[number.length()];
for(int i = 0;inumber.length();i++) {
array[i] = Integer.parseInt(number.substring(i,i+1));
}
return array;
}
/**
* 將整數部分轉為大寫的金額
* @param integers 整數部分數字
* @param isWan 整數部分是否已經是達到【萬】
* @return
*/
public static String getChineseInteger(int[] integers,boolean isWan) {
StringBuffer chineseInteger = new StringBuffer(“”);
int length = integers.length;
if (length == 1 integers[0] == 0) {
return “”;
}
for(int i=0; ilength; i++) {
String key = “”;
if(integers[i] == 0) {
if((length – i) == 13)//萬(億)
key = IUNIT[4];
else if((length – i) == 9) {//億
key = IUNIT[8];
}else if((length – i) == 5 isWan) {//萬
key = IUNIT[4];
}else if((length – i) == 1) {//元
key = IUNIT[0];
}
if((length – i)1 integers[i+1]!=0) {
key += NUMBERS[0];
}
}
chineseInteger.append(integers[i]==0?key:(NUMBERS[integers[i]]+IUNIT[length – i -1]));
}
return chineseInteger.toString();
}
/**
* 將小數部分轉為大寫的金額
* @param decimals 小數部分的數字
* @return
*/
private static String getChineseDecimal(int[] decimals) {
StringBuffer chineseDecimal = new StringBuffer(“”);
for(int i = 0;idecimals.length;i++) {
if(i == 3) {
break;
}
chineseDecimal.append(decimals[i]==0?””:(NUMBERS[decimals[i]]+DUNIT[i]));
}
return chineseDecimal.toString();
}
/**
* 判斷當前整數部分是否已經是達到【萬】
* @param integerStr 整數部分數字
* @return
*/
private static boolean isWan5(String integerStr) {
int length = integerStr.length();
if(length 4) {
String subInteger = “”;
if(length 8) {
subInteger = integerStr.substring(length- 8,length -4);
}else {
subInteger = integerStr.substring(0,length – 4);
}
return Integer.parseInt(subInteger) 0;
}else {
return false;
}
}
// Test
public static void main(String[] args) {
String number = “12.56”;
System.out.println(number+”: “+ConvertUpMoney.toChinese(number));
number = “1234567890563886.123”;
System.out.println(number+”: “+ConvertUpMoney.toChinese(number));
number = “1600”;
System.out.println(number+”: “+ConvertUpMoney.toChinese(number));
number = “156,0”;
System.out.println(number+”: “+ConvertUpMoney.toChinese(number));
number = “-156,0”;
System.out.println(number+”: “+ConvertUpMoney.toChinese(number));
number = “0.12”;
System.out.println(number+”: “+ConvertUpMoney.toChinese(number));
number = “0.0”;
System.out.println(number+”: “+ConvertUpMoney.toChinese(number));
number = “01.12”;
System.out.println(number+”: “+ConvertUpMoney.toChinese(number));
number = “0125”;
System.out.println(number+”: “+ConvertUpMoney.toChinese(number));
number = “-0125”;
System.out.println(number+”: “+ConvertUpMoney.toChinese(number));
number = “sdw5655”;
System.out.println(number+”: “+ConvertUpMoney.toChinese(number));
System.out.println(null+”: “+ConvertUpMoney.toChinese(null));
}
}
JAVA 數字轉換為中文大寫的轉換
package com.heyang;
/**
* 將10億以內的阿拉伯數字轉成漢字大寫形式
* @author xizhenyin
*
*/
public class CnUpperCaser {
// 整數部分
private String integerPart;
// 小數部分
private String floatPart;
// 將數字轉化為漢字的數組,因為各個實例都要使用所以設為靜態
private static final char[] cnNumbers={‘零’,’壹’,’貳’,’叄’,’肆’,’伍’,’陸’,’柒’,’捌’,’玖’};
// 供分級轉化的數組,因為各個實例都要使用所以設為靜態
private static final char[] series={‘元’,’拾’,’百’,’仟’,’萬’,’拾’,’百’,’仟’,’億’};
/**
* 構造函數,通過它將阿拉伯數字形式的字元串傳入
* @param original
*/
public CnUpperCaser(String original){
// 成員變數初始化
integerPart=””;
floatPart=””;
if(original.contains(“.”)){
// 如果包含小數點
int dotIndex=original.indexOf(“.”);
integerPart=original.substring(0,dotIndex);
floatPart=original.substring(dotIndex+1);
}
else{
// 不包含小數點
integerPart=original;
}
}
/**
* 取得大寫形式的字元串
* @return
*/
public String getCnString(){
// 因為是累加所以用StringBuffer
StringBuffer sb=new StringBuffer();
// 整數部分處理
for(int i=0;iintegerPart.length();i++){
int number=getNumber(integerPart.charAt(i));
sb.append(cnNumbers[number]);
sb.append(series[integerPart.length()-1-i]);
}
// 小數部分處理
if(floatPart.length()0){
sb.append(“點”);
for(int i=0;ifloatPart.length();i++){
int number=getNumber(floatPart.charAt(i));
sb.append(cnNumbers[number]);
}
}
// 返回拼接好的字元串
return sb.toString();
}
/**
* 將字元形式的數字轉化為整形數字
* 因為所有實例都要用到所以用靜態修飾
* @param c
* @return
*/
private static int getNumber(char c){
String str=String.valueOf(c);
return Integer.parseInt(str);
}
/**
* @param args
*/
public static void main(String[] args) {
System.out.println(new CnUpperCaser(“123456789.12345”).getCnString());
System.out.println(new CnUpperCaser(“123456789”).getCnString());
System.out.println(new CnUpperCaser(“.123456789”).getCnString());
System.out.println(new CnUpperCaser(“0.1234”).getCnString());
System.out.println(new CnUpperCaser(“1”).getCnString());
System.out.println(new CnUpperCaser(“12”).getCnString());
System.out.println(new CnUpperCaser(“123”).getCnString());
System.out.println(new CnUpperCaser(“1234”).getCnString());
System.out.println(new CnUpperCaser(“12345”).getCnString());
System.out.println(new CnUpperCaser(“123456”).getCnString());
System.out.println(new CnUpperCaser(“1234567”).getCnString());
System.out.println(new CnUpperCaser(“12345678”).getCnString());
System.out.println(new CnUpperCaser(“123456789”).getCnString());
}
}
Java金額的中文大寫方式
/**
* 金額小數轉換成中文大寫金額
* @author Neil Han
*
*/
public class ConvertMoneyToUppercase {
private static final String UNIT[] = { “萬”, “千”, “佰”, “拾”, “億”, “千”, “佰”,
“拾”, “萬”, “千”, “佰”, “拾”, “元”, “角”, “分” };
private static final String NUM[] = { “零”, “壹”, “貳”, “叄”, “肆”, “伍”, “陸”,
“柒”, “捌”, “玖” };
private static final double MAX_VALUE = 9999999999999.99D;
/**
* 將金額小數轉換成中文大寫金額
* @param money
* @return result
*/
public static String convertMoney(double money) {
if (money 0 || money MAX_VALUE)
return “參數非法!”;
long money1 = Math.round(money * 100); // 四捨五入到分
if (money1 == 0)
return “零元整”;
String strMoney = String.valueOf(money1);
int numIndex = 0; // numIndex用於選擇金額數值
int unitIndex = UNIT.length – strMoney.length(); // unitIndex用於選擇金額單位
boolean isZero = false; // 用於判斷當前為是否為零
String result = “”;
for (; numIndex strMoney.length(); numIndex++, unitIndex++) {
char num = strMoney.charAt(numIndex);
if (num == ‘0’) {
isZero = true;
if (UNIT[unitIndex] == “億” || UNIT[unitIndex] == “萬”
|| UNIT[unitIndex] == “元”) { // 如果當前位是億、萬、元,且數值為零
result = result + UNIT[unitIndex]; //補單位億、萬、元
isZero = false;
}
}else {
if (isZero) {
result = result + “零”;
isZero = false;
}
result = result + NUM[Integer.parseInt(String.valueOf(num))] + UNIT[unitIndex];
}
}
//不是角分結尾就加”整”字
if (!result.endsWith(“角”)!result.endsWith(“分”)) {
result = result + “整”;
}
//例如沒有這行代碼,數值”400000001101.2″,輸出就是”肆千億萬壹千壹佰零壹元貳角”
result = result.replaceAll(“億萬”, “億”);
return result;
}
public static void main(String[] args) {
double value = Double.parseDouble(“40330701101.2”);
System.out.println(“您輸入的金額(小寫)為:” + value);
System.out.println(“您輸入的金額(大寫)為:” + convertMoney(value));
}
}
JAVA練習題 金額的中文大寫
//我自己寫的
//把String 換成了StringBuilder 因為後者只要新建後,無論如何變化,都是同一個字元串,
//而String 是不可變的, 每改變一次,就要新建一個變數
//也可以用StringBuffer , 和StringBuilder用法一樣, 不過是線程安全的
public class SmallToBig {
/**
* @param args
* 把數字換成大寫的中文貨幣字元 123456789 換成
* 零,壹,貳,叄,肆,伍,陸,柒,捌,玖
* “元”,”十”,”佰”,”仟”,”萬”,”十”,”佰”,”仟”,”億”,”十”,”佰”,”仟”,” “,””,””,”” 太大的就沒寫了, 直接輸出大寫數字
*/
public static void main(String[] args) {
StringBuilder sb = new StringBuilder();
sb.append(“3789341.512”);
System.out.print( getFloatBigCn(sb));
}
public static StringBuilder getFloatBigCn(StringBuilder sb){
String [] big={“零”,”壹”,”貳”,”叄”,”肆”,”伍”,”陸”,”柒”,”捌”,”玖”};
String [] fUnit ={“角”,”分”,””,””,””};
StringBuilder floatStr=new StringBuilder();
if(sb.indexOf(“.”)-1){ //是否存在小數點
StringBuilder intPart = new StringBuilder(sb.substring(0, sb.indexOf(“.”)));//取得整數部分
StringBuilder flPart = new StringBuilder(sb.substring(sb.indexOf(“.”)+1, sb.length()));//取得小數部分
//整數部分處理
floatStr.append(getIntBigCn(intPart));//整數部分給整數方法處理
//小數點後處理
if(flPart.length()2)
flPart = flPart.delete(2, flPart.length()); //小數點後只取到分 ,注意,此部會把2位後的數值刪除掉
for (int i = 0; i = flPart.length()-1; i++) {
int t = Integer.parseInt(flPart.substring(i, i+1));
floatStr.append(big[t]+fUnit[i]); // 數值加單位
}
}else //如果沒有小數點, 直接給處理整數的方法處理
floatStr.append(getIntBigCn(sb));
return floatStr;
}
public static StringBuilder getIntBigCn(StringBuilder sb){
String[] big={“零”,”壹”,”貳”,”叄”,”肆”,”伍”,”陸”,”柒”,”捌”,”玖”};
String [] iUnit ={“元”,”十”,”佰”,”仟”,”萬”,”十”,”佰”,”仟”,”億”,
“十”,”佰”,”仟”,” “,””,””,””,””,””,””,””,””};//中國人太有錢。。。超出單位所能承受
StringBuilder intStr=new StringBuilder();
int cnt=0;//換單位
for(int i=sb.length();i0 ; i–){ //倒取的值
int m = Integer.parseInt(sb.substring(i-1,i));
intStr.insert(0,big[m]+iUnit[cnt]);//從前面插入
cnt++;
}
return intStr;
}
}
JAVA 編程 輸出金額的中文大寫形式
public class Text {
/**
* 測試程序的可行性
* @param args
*/
public static void main(String[] args) {
System.out.println(“——–將數字轉換成中文金額的大寫形式————\n”);
Trans2RMB t2r = new Trans2RMB();
String s = t2r.cleanZero(t2r.splitNum(t2r.roundString(t2r.getNum())));
// 如果轉換過後是一個空串,則不輸出屏幕
if(!””.equals(s)) {
System.out.println(“轉換成中文後為:” + s);;
}
System.out.println(“\n———————————————“);
}
/**
* 從命令行接收一個數,在其中調用 checkNum() 方法對其進行
* 驗證,並返回相應的值
* @return 如果輸入合法,返回輸入的這個數
*/
private String getNum() {
String s = null;
System.out.println(“請輸入一個數字(精確到小數點後兩位):”);
// 從命令行輸入這個浮點數
java.util.Scanner scanner = new java.util.Scanner(System.in);
s = scanner.next();
// 判斷用戶輸入是否合法
// 若合法,返回這個值;若非法返回 “0”
if(this.checkNum(s)) {
return s;
} else {
return “”;
}
}
/**
* 判斷用戶輸入的數據是否合法,用戶只能輸入大於零的數字,不能輸入其它字元
* @param s String
* @return 如果用戶輸入數據合法,返回 true,否則返回 false
*/
private boolean checkNum(String s) {
// 如果用戶輸入的數里有非數字字元,則視為非法數據,返回 false
try {
float f = Float.valueOf(s);
// 如果這個數小於零則視為非法數據,返回 false
if(f 0) {
System.out.println(“非法數據,請檢查!”);
return false;
}else {
return true;
}
} catch (NumberFormatException e) {
System.out.println(“非法數據,請檢查!”);
return false;
}
}
/**
* 把用戶輸入的數以小數點為界分割開來,並調用 numFormat() 方法
* 進行相應的中文金額大寫形式的轉換
* 註:傳入的這個數應該是經過 roundString() 方法進行了四捨五入操作的
* @param s String
* @return 轉換好的中文金額大寫形式的字元串
*/
private String splitNum(String s) {
// 如果傳入的是空串則繼續返回空串
if(“”.equals(s)) {
return “”;
}
// 以小數點為界分割這個字元串
int index = s.indexOf(“.”);
// 截取並轉換這個數的整數部分
String intOnly = s.substring(0, index);
String part1 = this.numFormat(1, intOnly);
// 截取並轉換這個數的小數部分
String smallOnly = s.substring(index + 1);
String part2 = this.numFormat(2, smallOnly);
// 把轉換好了的整數部分和小數部分重新拼湊一個新的字元串
String newS = part1 + part2;
return newS;
}
/**
* 對傳入的數進行四捨五入操作
* @param s String 從命令行輸入的那個數
* @return 四捨五入後的新值
*/
private String roundString(String s) {
// 如果傳入的是空串則繼續返回空串
if(“”.equals(s)) {
return “”;
}
// 將這個數轉換成 double 類型,並對其進行四捨五入操作
double d = Double.parseDouble(s);
// 此操作作用在小數點後兩位上
d = (d * 100 + 0.5) / 100;
// 將 d 進行格式化
s = new java.text.DecimalFormat(“##0.000”).format(d);
// 以小數點為界分割這個字元串
int index = s.indexOf(“.”);
// 這個數的整數部分
String intOnly = s.substring(0, index);
// 規定數值的最大長度只能到萬億單位,否則返回 “0”
if(intOnly.length()13) {
System.out.println(“輸入數據過大!(整數部分最多13位!)”);
return “”;
}
// 這個數的小數部分
String smallOnly = s.substring(index + 1);
// 如果小數部分大於兩位,只截取小數點後兩位
if(smallOnly.length()2) {
String roundSmall = smallOnly.substring(0, 2);
// 把整數部分和新截取的小數部分重新拼湊這個字元串
s = intOnly + “.” + roundSmall;
}
return s;
}
/**
* 把傳入的數轉換為中文金額大寫形式
* @param flag int 標誌位,1 表示轉換整數部分,0 表示轉換小數部分
* @param s String 要轉換的字元串
* @return 轉換好的帶單位的中文金額大寫形式
*/
private String numFormat(int flag, String s) {
int sLength = s.length();
// 貨幣大寫形式
String bigLetter args) {
System.out.println(“——–將數字轉換成中文金額的大寫形式————\n”);
Trans2RMB t2r = new Trans2RMB();
String s = t2r.cleanZero(t2r.splitNum(t2r.roundString(t2r.getNum())));
// 如果轉換過後是一個空串,則不輸出屏幕
if(!””.equals(s)) {
System.out.println(“轉換成中文後為:” + s);;
}
System.out.println(“\n———————————————“);
}
/**
* 從命令行接收一個數,在其中調用 checkNum() 方法對其進行
* 驗證,並返回相應的值
* @return 如果輸入合法,返回輸入的這個數
*/
private String getNum() {
String s = null;
System.out.println(“請輸入一個數字(精確到小數點後兩位):”);
// 從命令行輸入這個浮點數
java.util.Scanner scanner = new java.util.Scanner(System.in);
s = scanner.next();
// 判斷用戶輸入是否合法
// 若合法,返回這個值;若非法返回 “0”
if(this.checkNum(s)) {
return s;
} else {
return “”;
}
}
/**
* 判斷用戶輸入的數據是否合法,用戶只能輸入大於零的數字,不能輸入其它字元
* @param s String
* @return 如果用戶輸入數據合法,返回 true,否則返回 false
*/
private boolean checkNum(String s) {
// 如果用戶輸入的數里有非數字字元,則視為非法數據,返回 false
try {
float f = Float.valueOf(s);
// 如果這個數小於零則視為非法數據,返回 false
if(f 0) {
System.out.println(“非法數據,請檢查!”);
return false;
}else {
return true;
}
} catch (NumberFormatException e) {
System.out.println(“非法數據,請檢查!”);
return false;
}
}
/**
* 把用戶輸入的數以小數點為界分割開來,並調用 numFormat() 方法
* 進行相應的中文金額大寫形式的轉換
* 註:傳入的這個數應該是經過 roundString() 方法進行了四捨五入操作的
* @param s String
* @return 轉換好的中文金額大寫形式的字元串
*/
private String splitNum(String s) {
// 如果傳入的是空串則繼續返回空串
if(“”.equals(s)) {
return “”;
}
// 以小數點為界分割這個字元串
int index = s.indexOf(“.”);
// 截取並轉換這個數的整數部分
String intOnly = s.substring(0, index);
String part1 = this.numFormat(1, intOnly);
// 截取並轉換這個數的小數部分
String smallOnly = s.substring(index + 1);
String part2 = this.numFormat(2, smallOnly);
// 把轉換好了的整數部分和小數部分重新拼湊一個新的字元串
String newS = part1 + part2;
return newS;
}
/**
* 對傳入的數進行四捨五入操作
* @param s String 從命令行輸入的那個數
* @return 四捨五入後的新值
*/
private String roundString(String s) {
// 如果傳入的是空串則繼續返回空串
if(“”.equals(s)) {
return “”;
}
// 將這個數轉換成 double 類型,並對其進行四捨五入操作
double d = Double.parseDouble(s);
// 此操作作用在小數點後兩位上
d = (d * 100 + 0.5) / 100;
// 將 d 進行格式化
s = new java.text.DecimalFormat(“##0.000”).format(d);
// 以小數點為界分割這個字元串
int index = s.indexOf(“.”);
// 這個數的整數部分
String intOnly = s.substring(0, index);
// 規定數值的最大長度只能到萬億單位,否則返回 “0”
if(intOnly.length()13) {
System.out.println(“輸入數據過大!(整數部分最多13位!)”);
return “”;
}
// 這個數的小數部分
String smallOnly = s.substring(index + 1);
// 如果小數部分大於兩位,只截取小數點後兩位
if(smallOnly.length()2) {
String roundSmall = smallOnly.substring(0, 2);
// 把整數部分和新截取的小數部分重新拼湊這個字元串
s = intOnly + “.” + roundSmall;
}
return s;
}
/**
* 把傳入的數轉換為中文金額大寫形式
* @param flag int 標誌位,1 表示轉換整數部分,0 表示轉換小數部分
* @param s String 要轉換的字元串
* @return 轉換好的帶單位的中文金額大寫形式
*/
private String numFormat(int flag, String s) {
int sLength = s.length();
// 貨幣大寫形式
String bigLetter[] = {“零”, “壹”, “貳”, “叄”, “肆”, “伍”, “陸”, “柒”, “捌”, “玖”};
// 貨幣單位
String unit[] = {“元”, “拾”, “佰”, “仟”, “萬”,
// 拾萬位到仟萬位
“拾”, “佰”, “仟”,
// 億位到萬億位
“億”, “拾”, “佰”, “仟”, “萬”};
String small[] = {“分”, “角”};
// 用來存放轉換後的新字元串
String newS = “”;
// 逐位替換為中文大寫形式
for(int i = 0; i sLength; i ++) {
if(flag == 1) {
// 轉換整數部分為中文大寫形式(帶單位)
newS = newS + bigLetter[s.charAt(i) – 48] + unit[sLength – i – 1];
} else if(flag == 2) {
// 轉換小數部分(帶單位)
newS = newS + bigLetter[s.charAt(i) – 48] + small[sLength – i – 1];
}
}
return newS;
}
/**
* 把已經轉換好的中文金額大寫形式加以改進,清理這個字
* 符串裡面多餘的零,讓這個字元串變得更加可觀
* 註:傳入的這個數應該是經過 splitNum() 方法進行處理,這個字
* 符串應該已經是用中文金額大寫形式表示的
* @param s String 已經轉換好的字元串
* @return 改進後的字元串
*/
private String cleanZero(String s) {
// 如果傳入的是空串則繼續返回空串
if(“”.equals(s)) {
return “”;
}
// 如果用戶開始輸入了很多 0 去掉字元串前面多餘的『零『,使其看上去更符合習慣
while(s.charAt(0) == 『零『) {
// 將字元串中的 “零” 和它對應的單位去掉
s = s.substring(2);
// 如果用戶當初輸入的時候只輸入了 0,則只返回一個 “零”
if(s.length() == 0) {
return “零”;
}
}
// 字元串中存在多個『零『在一起的時候只讀出一個『零『,並省略多餘的單位
/* 由於本人對演算法的研究太菜了,只能用4個正則表達式去轉換了,各位大蝦別介意哈… */
String regex1[] = {“零仟”, “零佰”, “零拾”};
String regex2[] = {“零億”, “零萬”, “零元”};
String regex3[] = {“億”, “萬”, “元”};
String regex4[] = {“零角”, “零分”};
// 第一輪轉換把 “零仟”, 零佰”,”零拾”等字元串替換成一個”零”
for(int i = 0; i 3; i ++) {
s = s.replaceAll(regex1[i], “零”);
}
// 第二輪轉換考慮 “零億”,”零萬”,”零元”等情況
// “億”,”萬”,”元”這些單位有些情況是不能省的,需要保留下來
for(int i = 0; i 3; i ++) {
// 當第一輪轉換過後有可能有很多個零疊在一起
// 要把很多個重複的零變成一個零
s = s.replaceAll(“零零零”, “零”);
s = s.replaceAll(“零零”, “零”);
s = s.replaceAll(regex2[i], regex3[i]);
}
// 第三輪轉換把”零角”,”零分”字元串省略
for(int i = 0; i 2; i ++) {
s = s.replaceAll(regex4[i], “”);
}
// 當”萬”到”億”之間全部是”零”的時候,忽略”億萬”單位,只保留一個”億”
s = s.replaceAll(“億萬”, “億”);
return s;
}
}
原創文章,作者:CFKVN,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/325296.html