貨幣小寫轉大寫金額
阿新 • • 發佈:2022-11-30
public class NumToRMB{
public static void main(String[] args){
System.out.println(changeToBig(Double.parseDouble(args[0])));
}
public static String changeToBig(double value){
char[] hunit={'拾','佰','仟'}; //段內位置表示
char[] vunit={'萬','億'}; //段名錶示
char[] digit={'零','壹','貳','叄','肆','伍','陸','柒','捌','玖'}; //數字表示
long midVal = (long)(value*100); //轉化成整形
String valStr=String.valueOf(midVal); //轉化成字串
String head=valStr.substring(0,valStr.length()-2); //取整數部分
String rail=valStr.substring(valStr.length()-2); //取小數部分
String prefix=""; //整數部分轉化的結果
String suffix=""; //小數部分轉化的結果
//處理小數點後面的數
if(rail.equals("00")){ //如果小數部分為0
suffix="整";
} else{
suffix=digit[rail.charAt(0)-'0']+"角"+digit[rail.charAt(1)-'0']+"分"; //否則把角分轉化出來
}
//處理小數點前面的數
char[] chDig=head.toCharArray(); //把整數部分轉化成字元陣列
boolean preZero=false; //標誌當前位的上一位是否為有效0位(如萬位的0對千位無效)
byte zeroSerNum = 0; //連續出現0的次數
for(int i=0;i<chDig.length;i++){ //迴圈處理每個數字
int idx=(chDig.length-i-1)%4; //取段內位置
int vidx=(chDig.length-i-1)/4; //取段位置
if(chDig[i]=='0'){ //如果當前字元是0
preZero=true;
zeroSerNum++; //連續0次數遞增
if(idx==0 && vidx >0 &&zeroSerNum < 4){
prefix += vunit[vidx-1];
preZero=false; //不管上一位是否為0,置為無效0位
}
}else{
zeroSerNum = 0; //連續0次數清零
if(preZero){ //上一位為有效0位
prefix+=digit[0]; //只有在這地方用到'零'
preZero=false;
}
prefix+=digit[chDig[i]-'0']; //轉化該數字表示
if(idx > 0) prefix += hunit[idx-1];
if(idx==0 && vidx>0){
prefix+=vunit[vidx-1]; //段結束位置應該加上段名如萬,億
}
}
}
if(prefix.length() > 0) prefix += '圓'; //如果整數部分存在,則有圓的字樣
return prefix+suffix; //返回正確表示
}
}