Java浮點數轉人民幣讀法
Java浮點數轉人民幣讀法
- 把【整數部分】的數字,由個位開始,4個數字分為一組,最高位沒有數字就補0,並記錄總共的數組個數,總共有3組,也就3*4的二維數組;
- 對於每個數組統一處理,當讀取到0時,檢查它的上一位是否為0,如果上一位是0,則不做處理,如果上一位不是0或者上一位不存在,均記下“零”;
- 讀取每個數字,轉換為對應的大寫漢字,並加上權重“仟、佰、拾”,根據讀取的是第幾個數組,後面添加相應的“億”、“萬”、“元”;
- 最後將最開頭的“零去掉”,將“億”、“萬”、“元”字前面的“零”去掉;
- 把【小數部分】做一維數組處理,僅保留兩位小數,對應“角”和“分”,數字0不處理;
- 測試數字『120, 3005, 7600.89』,讀作:壹佰貳拾億三仟零伍萬柒仟陸佰元捌角玖分。
package theTest;
public class NumToRmb {
private String[] hanArr={"零","壹","貳","三","肆","伍","陸","柒","捌","玖"};
private String[] unitArr={"仟","佰","拾"};
/**
* 把一個浮點數分解成整數部分和小數部分字串
* @param num 需要被分解的浮點數
* @return 分解出來的整數部分和小數部分,第1個數組元素是整數部分,第2個數組元素是小數部分。
*/
private String[] divide(double num){
//將一個浮點數強制轉換為long型,即得到它的整數部分
long zheng=(long)num;
//浮點數減去整數部分,得到小數部分,小數部分乘以100取整得到兩位小數
long xiao=Math.round((num-zheng)*100);
//這裡使用兩種方法將整數轉換為字串
return new String[]{String.valueOf(zheng),xiao+""};
}
/**
* 將整數分成4個數字為一組的字串處理,轉化成大寫數字再將它們串連起來,得到最終的人民幣讀法
* @param num 需要被轉化為大寫數位浮點數
* @return 返回整個數位人民幣讀法
*/
private String conHanStr(double num){
//儲存整數結果、小數結果
String resZheng="";
String resXiao="";
//儲存最終結果
String result="";
//分別儲存整數部分和小數部分字串
String zhengStr=divide(num)[0];
String xiaoStr=divide(num)[1];
/*小數部分的處理*/
if(xiaoStr.length()==1){
xiaoStr="0"+xiaoStr;
}
resXiao=xiao2Han(xiaoStr);
/*整數部分的處理*/
//記錄字串個數,是第幾個數組
int countArr=0;
String tempStr="";
//記錄位元
int countNum=0;
for(int i=zhengStr.length()-1;i>=0;i--){
countNum++;
tempStr=zhengStr.charAt(i)+tempStr;
if(i-1<0){
//i已經是最後一個數字,不夠的位,補0
while(tempStr.length()<4){
tempStr="0"+tempStr;
}
countArr++;
resZheng=zheng2Han(countArr,tempStr)+" "+resZheng;
}else{
if(countNum==4){
countArr++;
resZheng=zheng2Han(countArr,tempStr)+" "+resZheng;
countNum=0;
tempStr="";
}
}
}
//去掉開頭的零
if(resZheng.charAt(0)=='零'){
resZheng=resZheng.substring(1,resZheng.length());
}
/*整數和小數的串連*/
//表示整數部分為0
if(resZheng.charAt(0)=='元'){
resZheng="零"+resZheng;
}
result=resZheng+resXiao;
return result;
}
/**
* 每個4位的整數組轉化為大寫的數字
* @param count 記錄是第幾個數組(1-3)
* @param str 需要被轉換的數組
* @return 返回該數組人民幣讀法
*/
private String zheng2Han(int count,String str){
String result="";
for(int j=0;j<4;j++){
int tempNum=str.charAt(j)-48;
if(tempNum!=0){
if(j!=3){
result+=hanArr[tempNum]+unitArr[j];
}else{
result+=hanArr[tempNum];
}
}else{
if((j-1<0)||(str.charAt(j-1)-48!=0)){
result+=hanArr[tempNum];
}
}
}
//去掉末尾的零
if(result.charAt(result.length()-1)=='零'){
result=result.substring(0, result.length()-1);
}
//去零之後添加“億、萬、元、角、分”。
switch(count){
case 1:
result+="元";
break;
case 2:
result+="萬";
break;
case 3:
result+="億";
break;
default:
System.out.println("僅支援不大於9999,9999,9999.99的數字!");
return "";
}
return result;
}
/**
* 小數轉化為大寫的數字
* @param str 需要被轉換的數組
* @return 返回該小數人民幣讀法
*/
private String xiao2Han(String str){
String result="";
if(!str.equals("00")){
for(int i=0;i<2;i++){
int tempNum=str.charAt(i)-48;
if((tempNum!=0)&&(i==0)){
result+=hanArr[tempNum]+"角";
}
if((tempNum!=0)&&(i==1)){
result+=hanArr[tempNum]+"分";
}
}
}
return result;
}
/**
* 主函數
* @param args
*/
public static void main(String[] args) {
NumToRmb nr=new NumToRmb();
System.out.println(nr.conHanStr((double)12030060078.95));
}
}
本文永久更新連結地址:https://www.bkjia.com/Linux/2018-03/151275.htm