package Chapter_04;
import java.util.Scanner;
public class Example_Num2Rmb {
private String[] hanArr={"零","壹","貳","叁","肆","伍","陸","柒","捌","玖"};
private String[] unitArrZheng={"仟","佰","拾"};
private String[] unitArrXiao={"角","分"};
private String[] BigUnitArr={"億 ","萬(wàn) ","元 "};
/**
* 將一個(gè)double類(lèi)型的數(shù)劃分為整數(shù)部分和小數(shù)部分
* @param num 初始double類(lèi)型數(shù)據(jù)
* @return 返回一個(gè)數(shù)組译隘,存放劃分出來(lái)的整數(shù)和小數(shù)
*/
public String[] divide(double num){
String[] number=new String[2];
long zheng=(long)num;
int xiao=(int)Math.round( (num-zheng)*100 );//round(double x):返回最接近的long型數(shù);
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?//round(float):返回最接近的int型數(shù)
number[0]=zheng+"";//存放整數(shù)部分
number[1]=xiao+"";//存放小數(shù)部分
if(number[1].length()==1){
number[1]="0"+number[1];
}
return number;
}
/**
* 對(duì)于整數(shù)部分的轉(zhuǎn)換
* @param zheng 整數(shù)部分字符串
* @return 返回對(duì)整數(shù)的中文讀法
*/
public String transZheng(String zheng){
int len=zheng.length();
int stage=len/4;
String aFour="";
String aTrans="";
if(len%4!=0){
stage++;//四位數(shù)一小節(jié)菲茬,stage為總節(jié)數(shù)
}
if(stage>3){
System.out.println("整數(shù)部分超出讀取范圍菊霜,自動(dòng)截取后12位淋硝!");
zheng=zheng.substring(len-12, len);
}
else if(len%4!=0){
zheng="0000".substring(0, 4-len%4 ) + zheng;//如果位數(shù)不是4的倍數(shù)举农,就在前面補(bǔ)零變成4的倍數(shù)
}
stage=zheng.length()/4;
//一節(jié)一節(jié)的轉(zhuǎn)換數(shù)據(jù)
for(int i=0;i
aFour=zheng.substring(i*4, i*4+4);//截取一個(gè)四位數(shù)
//轉(zhuǎn)換截取的四位數(shù)
for(int j=0;j<4;j++){
int num=aFour.charAt(j)-48;//將字符數(shù)字轉(zhuǎn)換成數(shù)字侦啸,如'4'-- 4
//對(duì)于非零數(shù)的處理
if(num!=0){
if(j==3){
aTrans+=hanArr[num];//如果非零數(shù)是最后一位就不加單位
}
else{
aTrans+=hanArr[num]+unitArrZheng[j];//如果非零數(shù)不是最后一位就要帶上單位讀出
}
}
//這里是重點(diǎn)C佛小M患铡鲁豪!
//對(duì)于零的處理,只有當(dāng)整個(gè)數(shù)中零的前面有非零數(shù)并且本小節(jié)內(nèi)零的后面也有非零數(shù)時(shí)才將它讀出來(lái),零都沒(méi)有單位(有些繞口律秃,還請(qǐng)細(xì)細(xì)體會(huì)~)
else if( !( zheng.substring(0, i*4+j).equals("000000000000".substring(0, i*4+j))
|| aFour.substring(j+1, 4).equals("0000".substring(j+1, 4)) ) ){
//對(duì)于連續(xù)多個(gè)零的處理爬橡,只需要讀出非零數(shù)前面的那個(gè)零即可
if(aFour.charAt(j+1)!='0'){
aTrans+=hanArr[num];
}
}
}
if(!aFour.equals("0000")){
aTrans+=BigUnitArr[3-stage+i];//如果這一小節(jié)不全為零就帶上一小節(jié)后的單位--億、萬(wàn)友绝、元
}
}
return aTrans;
}
/**
* 對(duì)于小數(shù)部分的轉(zhuǎn)換
* @param zheng 小數(shù)部分字符串
* @return 返回對(duì)小數(shù)的中文讀法
*/
public String transXiao(String xiao){
String aTrans="";
for(int i=0;i
int num=xiao.charAt(i)-48;
if(num!=0){
aTrans+=hanArr[num]+unitArrXiao[i];
}
}
return aTrans;
}
/**
* 將整數(shù)和小數(shù)的中文讀法合并堤尾,并且輸出最終的讀法
* @param num 初始數(shù)據(jù)
*/
public void trans(double num){
String aTrans="";
String[] divide=divide(num);
String aTransZheng=transZheng(divide[0]);
String aTransXiao=transXiao(divide[1]);
aTrans=aTransZheng+aTransXiao;
System.out.println("轉(zhuǎn)換的中文為:"+aTrans);
}
public static void main(String[] args){
Example_Num2Rmb nr=new Example_Num2Rmb();
Scanner input=new Scanner(System.in);
System.out.println("請(qǐng)輸入一個(gè)數(shù):");
double num=input.nextDouble();
nr.trans(num);
input.close();
}
} ?
測(cè)試: