今天老師即興佈置了一個作業,將阿拉伯數字金額轉化爲中文大寫金額表示,假設數字上限爲小於10億,可以支持2位小數,如:
- 100000001——壹億零壹元整
- 100100011——壹億零壹拾萬零壹拾壹元整
- 201000211——貳億零壹佰萬零貳佰壹拾壹元整
- 2422000.21——貳佰肆拾貳萬貳千元貳角壹分
拿到題目,想到先拿兩個數組來存放數字和單位,把阿拉伯數字都轉換爲大寫數字和單位組合的形式,如:
- 112000012——壹億壹仟貳佰零拾零萬零仟零佰壹拾貳元整
然後將轉換後的字符串進行加工,將"零[拾佰仟]"等變成"零",考慮"零萬"變成"零"還是"萬",這一步是比較麻煩的,要考慮比較多的情況,如:
- 112000012——壹億壹仟貳佰零零萬零零壹拾貳元整
然後將相鄰的"零"去重,如:
- 112000012——壹億壹仟貳佰萬零壹拾貳元整
以下爲具體代碼,可能還有一些情況沒有考慮到,暫時記錄如下。
package com.zzutest;
import java.text.DecimalFormat;
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Transfer2 {
public static void main(String[] args) {
Scanner scan= new Scanner(System.in);
while(true) {
System.out.println("請輸入您想要轉化的數字:");
String number=scan.next();
if(number.equals("0")) {
break;
};
//System.out.println(cov(convert(number)));
System.out.println("轉換結果爲:"+convert(number));
}
}
private static final char[] data = new char[]{'零', '壹', '貳', '叄', '肆', '伍', '陸', '柒', '捌', '玖'};
private static final char[] units = new char[]{'分', '角', '元', '拾', '佰', '仟', '萬', '拾', '佰', '仟', '億'};
private static String removeCharAt(String str, int i) {
return str.substring(0, i)+str.substring(i+1);
}
// //將相鄰的‘零’去重
// private static String changeZero(String str) {
// str.replace('零', ' ');
// String no = str.replaceAll("\\s{1,}", " ");
// no.replace(' ', '零');
// System.out.println(no);
// return no;
// }
/**
* 小數類型
* @param str
* @return
*/
private static String cov(String str,String trans) {
StringBuffer sb = new StringBuffer(trans);
if(Double.parseDouble(str)>100000000) {
String wan=str.substring(1, 5);
//System.out.println("$$$$$$$$$$$$$$wande is "+wan);
int wanValue = Integer.parseInt(wan);
if(wanValue>0) {
trans = sb.toString()
.replaceAll("零拾", "零")
.replaceAll("零佰", "零")
.replaceAll("零仟", "零")
.replaceAll("零萬", "萬")
.replaceAll("零元", "元")
.replaceAll("零角", "零")
.replaceAll("零分", "")
.replaceAll("零零", "零")
.replaceAll("零零", "零")
.replaceAll("零零", "零")
.replaceAll("零零", "零")
.replaceAll("零零", "零")
.replaceAll("零零", "零")
.replaceAll("零萬", "萬");
}else if(wanValue==0){
trans = sb.toString()
.replaceAll("零拾", "零")
.replaceAll("零佰", "零")
.replaceAll("零仟", "零")
.replaceAll("零萬", "零")
.replaceAll("零元", "元")
.replaceAll("零角", "零")
.replaceAll("零分", "")
.replaceAll("零零", "零")
.replaceAll("零零", "零")
.replaceAll("零零", "零")
.replaceAll("零零", "零")
.replaceAll("零零", "零")
.replaceAll("零零", "零");
}
}else if(Double.parseDouble(str)>10000 && Double.parseDouble(str)<100000000) {
trans = sb.toString()
.replaceAll("零拾", "零")
.replaceAll("零佰", "零")
.replaceAll("零仟", "零")
.replaceAll("零萬", "萬")
.replaceAll("零元", "元")
.replaceAll("零角", "零")
.replaceAll("零分", "")
.replaceAll("零零", "零")
.replaceAll("零零", "零")
.replaceAll("零零", "零")
.replaceAll("零零", "零")
.replaceAll("零零", "零")
.replaceAll("零零", "零");
}else if(Double.parseDouble(str)<10000 && Double.parseDouble(str)>0) {
trans = sb.toString()
.replaceAll("零拾", "零")
.replaceAll("零佰", "零")
.replaceAll("零仟", "零")
.replaceAll("零元", "元")
.replaceAll("零角", "零")
.replaceAll("零分", "")
.replaceAll("零零", "零")
.replaceAll("零零", "零")
.replaceAll("零零", "零")
.replaceAll("零零", "零")
.replaceAll("零零", "零")
.replaceAll("零零", "零");
}
return new StringBuffer(trans).toString();
}
/**
* 整數類型
* @param str
* @return
*/
private static String covZ(String str,String trans) {
StringBuffer sb = new StringBuffer(trans);
if(Double.parseDouble(str)>100000000) {
String wan=str.substring(1, 5);
System.out.println("$$$$$$$$$$$$$$wande is "+wan);
int wanValue = Integer.parseInt(wan);
if(wanValue>0) {
trans = sb.toString()
.replaceAll("零拾", "零")
.replaceAll("零佰", "零")
.replaceAll("零仟", "零")
.replaceAll("零萬", "萬")
.replaceAll("零元", "元")
.replaceAll("元", "元整")
.replaceAll("零零", "零")
.replaceAll("零零", "零")
.replaceAll("零零", "零")
.replaceAll("零零", "零")
.replaceAll("零零", "零")
.replaceAll("零零", "零")
.replaceAll("零萬", "萬");
}else if(wanValue==0){
trans = sb.toString()
.replace("零拾", "零")
.replace("零佰", "零")
.replace("零仟", "零")
.replace("零萬", "零")
.replace("零元", "元")
.replace("元", "元整")
.replaceAll("零零", "零")
.replaceAll("零零", "零")
.replaceAll("零零", "零")
.replaceAll("零零", "零")
.replaceAll("零零", "零")
.replaceAll("零零", "零");
//System.out.println("_________爆炸了");
}
}else if(Double.parseDouble(str)>10000 && Double.parseDouble(str)<100000000) {
trans = sb.toString()
.replaceAll("零拾", "零")
.replaceAll("零佰", "零")
.replaceAll("零仟", "零")
.replaceAll("零萬", "萬")
.replaceAll("零元", "元")
.replaceAll("元", "元整")
.replaceAll("零零", "零")
.replaceAll("零零", "零")
.replaceAll("零零", "零")
.replaceAll("零零", "零")
.replaceAll("零零", "零")
.replaceAll("零零", "零");
}else if(Double.parseDouble(str)<10000 && Double.parseDouble(str)>0) {
trans = sb.toString()
.replaceAll("零拾", "零")
.replaceAll("零佰", "零")
.replaceAll("零仟", "零")
.replaceAll("零元", "元")
.replaceAll("元", "元整")
.replaceAll("零零", "零")
.replaceAll("零零", "零")
.replaceAll("零零", "零")
.replaceAll("零零", "零")
.replaceAll("零零", "零")
.replaceAll("零零", "零");
}
//StringBuffer sb = new StringBuffer(str);
//System.out.println("1"+sb.reverse().toString());
//str = sb.reverse().toString().replaceAll("零[拾佰仟]", "零").replaceAll("零+萬", "萬").replaceAll("零+元", "元").replaceAll("零+", "零");
// System.out.println("2"+str);
return new StringBuffer(trans).toString();
}
/**
* 現將各個後面統統加上單位
* @param money
* @return
*/
public static String convert(String money) {
//判斷輸入是否包含小數點
//包含小數點
if(money.contains(".")) {
//將字符串轉爲double類型
double moneyT=Double.parseDouble(money);
DecimalFormat df = new DecimalFormat(".00");
// System.out.println("##############"+df.format(moneyT));
//得到標準的小數字符串,即小數點後兩位數
String moneyC=df.format(moneyT);
//小數點的位置
int location = moneyC.indexOf(".");
//System.out.println("the location is "+location);
//除去小數點後
//System.out.println("the location which has been conved is "+removeCharAt(moneyC,location));
//使用double類型來標識該數字
double finalNum=Double.parseDouble(removeCharAt(moneyC,location));
//聲明定義StringBuffer來存轉換後的字符串
StringBuffer sbf = new StringBuffer();
int unit = 0;
//逐位進行大寫化,最低位開始依次向上,得到的字符串是倒序的
while (finalNum > 1) {
//單位
sbf.insert(0, units[unit++]);
double number = finalNum % 10;
sbf.insert(0, data[(int)number]);
finalNum /= 10;
//System.out.println("**********"+finalNum);
}
//System.out.println("加上單位以後未經轉換的格式爲: "+sbf.toString());
String judged = cov(money,sbf.toString());
//System.out.println("經過格式判斷的數字爲: " + judged);
return judged;
}
//不包含小數點的輸入
else {
int moneyT=Integer.parseInt(money);
//System.out.println("---------------->int類型:"+moneyT);
StringBuffer sbf = new StringBuffer();
int unit = 2;
while (moneyT != 0) {
sbf.insert(0, units[unit++]);
int number = moneyT % 10;
sbf.insert(0, data[number]);
moneyT /= 10;
}
//System.out.println("加上單位以後未經轉換的格式爲: "+sbf.toString());
String judged = covZ(money,sbf.toString());
//System.out.println("經過格式判斷的數字爲: " + judged);
return judged;
}
}
}
,