一個將浮點數轉換成人民幣讀法字串處理(xxxx.xx格式)
阿新 • • 發佈:2018-11-13
主要是加深對陣列的理解在,這個程式原來是《瘋狂java講義》低第103頁上的一個例子,但是例子並不完整,對0的處理和對末位包括小數點後面處理不完整,因此這裡進行了完善。考慮到人民幣通俗叫法,浮點數格式為(XXXX.XX),轉換為字串格式為(x千x百x十x元x角x分),當然還要考慮末位開始位和零的處理。
程式如下:
public class Num2Rmb { private String[] hanArr={"零","壹","貳","叄","肆","伍","陸","柒","捌","玖"}; private String[] unitArr={"分","角","元","十","百","千"}; /** * 把一個浮點數分解成整數部分和小數部分字串 * @param num 需要被分界飛浮點數 * @return 分解出來的整數部分和小數部分,第一部分是整數部分,第二部分是小數部分 */ private String[] divide(double num){ long zheng=(long)num; //通過強制轉型得到整數部分 long xiao=Math.round((num-zheng)*100); //浮點數減去整數部分得到小數部分,小數部分乘以100後得到2位小數值 return new String[]{""+zheng,String.valueOf(xiao)}; //整數轉換為字串(2種方法) } /** * 把一個四位的數字字串變成漢字字串 * @param numStr 需要被轉換的四位數字字串 * @return 四位字串被轉換為漢字字串 */ private String toHanStr(String[] numStr){ String result=""; int numLen0=numStr[0].length(); int numLen1=numStr[1].length(); for(int i=0;i<numLen0;i++){ int num=numStr[0].charAt(i)-48; //將char變成對應的int數字 if(num!=0){ //非零情況 result+=hanArr[num]+unitArr[1+numLen0-i]; } else if(i!=numLen0-1&&i!=0&&num==0){ //中間位數是零 result+=hanArr[num]; } else if(i==numLen0-1&&num==0) { //個位是零 result+=unitArr[1+numLen0-i]; } else if(i==0&&num==0) { //最高位是零 result+=""; } } for(int j=0;j<numLen1;j++) { //小數點後位的處理,角和分 int num=numStr[1].charAt(j)-48; if(num!=0){ result+=hanArr[num]+unitArr[1-j]; } if(num==0) { result+=""; } } return result; } public static void main(String[] arg){ Num2Rmb nr=new Num2Rmb(); String[] test=nr.divide(323.23); //String[] test2= {"0325","25"}; System.out.println(nr.toHanStr(test)); } }
今天下午看了一下,感覺上面程式還有些問題,比如在3003這種資料,中間位數有兩個0的時候結果不對,改進如下
public class Num2Rmb { private String[] hanArr={"零","壹","貳","叄","肆","伍","陸","柒","捌","玖"}; private String[] unitArr={"分","角","元","十","百","千"}; /** * 把一個浮點數分解成整數部分和小數部分字串 * @param num 需要被分界飛浮點數 * @return 分解出來的整數部分和小數部分,第一部分是整數部分,第二部分是小數部分 */ private String[] divide(double num){ long zheng=(long)num; //通過強制轉型得到整數部分 long xiao=Math.round((num-zheng)*100); //浮點數減去整數部分得到小數部分,小數部分乘以100後得到2位小數值 return new String[]{""+zheng,String.valueOf(xiao)}; //整數轉換為字串(2種方法) } /** * 把一個四位的數字字串變成漢字字串 * @param numStr 需要被轉換的四位數字字串 * @return 四位字串被轉換為漢字字串 */ private String toHanStr(String[] numStr){ String result=""; int numLen0=numStr[0].length(); int numLen1=numStr[1].length(); int[] num0=new int[numLen0]; int[] num1=new int[numLen1]; //賦值 for(int i=0;i<numLen0;i++) { num0[i]=numStr[0].charAt(i)-48; } for(int j=0;j<numLen1;j++) { num1[j]=numStr[1].charAt(j)-48; } for(int i=0;i<numLen0;i++){ if(num0[i]!=0){ //非零情況 result+=hanArr[num0[i]]+unitArr[1+numLen0-i]; } else if(i==0&&num0[i]==0) { //最高位是零 result+=""; } //中間位是零 else if(i!=numLen0-1&&i!=0&&num0[i]==0&&num0[i+1]!=0){ //中間位數是隻有一個零 result+=hanArr[num0[i]]; } else if(i!=numLen0-1&&i!=0&&num0[i]==0&&num0[i+1]==0){ //中間位數是隻有一個零 result+=""; } else if(i==numLen0-1&&num0[i]==0) { //個位是零 result+=unitArr[1+numLen0-i]; } } for(int j=0;j<numLen1;j++) { if(num1[j]!=0){ result+=hanArr[num1[j]]+unitArr[1-j]; } if(num1[j]==0) { result+=""; } } return result; } public static void main(String[] arg){ Num2Rmb nr=new Num2Rmb(); String[] test=nr.divide(3003.10); //String[] test2= {"3005","25"}; System.out.println(nr.toHanStr(test)); } }
改進中將判斷是否連續出現了0