java写了一个金额转大写程序,最大值到千亿,保留2位小数
经初步测试结果正确,不过写法好像比较笨,请各位大侠指教
功能满足:
1. 金额为整数时,只表示整数部分,后面加“整”
2. 连续的“0”,只写一个“零”
3. 整数后尾数0省略,如100表示成“壹佰元整”
import java.text.DecimalFormat; import java.util.HashMap; import java.util.Scanner; /* * 1. 金额为整数时,只表示整数部分,后面加“整” 2. 连续的“0”,只写一个“零” 3. 整数后尾数0省略,如100表示成“壹佰元整” 4. 四舍五入到分 5. 最大范围到千亿(12位) */ public class MoneyToUppercase { static HashMap<Integer, String> hm = new HashMap<Integer, String>(); static String toUpper(String num){ hm.put(0, "零"); hm.put(1, "壹"); hm.put(2, "贰"); hm.put(3, "叁"); hm.put(4, "肆"); hm.put(5, "伍"); hm.put(6, "陆"); hm.put(7, "柒"); hm.put(8, "捌"); hm.put(9, "玖"); hm.put(10, "拾"); hm.put(100, "佰"); hm.put(1000, "仟"); hm.put(10000, "万"); String snum = num; String intpart =null; String decpart = null; String dec0 = null; String dec1 = null; String hasdec = null; String[] sa = new String[2]; sa = snum.split("\\."); intpart = sa[0]; decpart = sa[1]; String[] sint = intpart.split(""); //整数部分 switch(sint.length){ case 2: snum = hm.get(Integer.parseInt(sint[1])); break; case 3: snum = hm.get(Integer.parseInt(sint[1])) + hm.get(10) + hm.get(Integer.parseInt(sint[2])); break; case 4: snum = hm.get(Integer.parseInt(sint[1])) + hm.get(100) + hm.get(Integer.parseInt(sint[2])) + hm.get(10) + hm.get(Integer.parseInt(sint[3]));break; case 5: snum = hm.get(Integer.parseInt(sint[1])) + hm.get(1000) + hm.get(Integer.parseInt(sint[2])) + hm.get(100) + hm.get(Integer.parseInt(sint[3])) + hm.get(10) + hm.get(Integer.parseInt(sint[4]));break; case 6: snum = hm.get(Integer.parseInt(sint[1])) + hm.get(10000) + hm.get(Integer.parseInt(sint[2])) + hm.get(1000) + hm.get(Integer.parseInt(sint[3])) + hm.get(100) + hm.get(Integer.parseInt(sint[4])) + hm.get(10) + hm.get(Integer.parseInt(sint[5]));break; case 7: snum = hm.get(Integer.parseInt(sint[1])) + hm.get(10) +hm.get(Integer.parseInt(sint[2])) + hm.get(10000) + hm.get(Integer.parseInt(sint[3])) + hm.get(1000) + hm.get(Integer.parseInt(sint[4])) + hm.get(100) + hm.get(Integer.parseInt(sint[5])) + hm.get(10) + hm.get(Integer.parseInt(sint[6]));break; case 8: snum = hm.get(Integer.parseInt(sint[1])) + hm.get(100) +hm.get(Integer.parseInt(sint[2])) + hm.get(10) +hm.get(Integer.parseInt(sint[3])) + hm.get(10000) + hm.get(Integer.parseInt(sint[4])) + hm.get(1000) + hm.get(Integer.parseInt(sint[5])) + hm.get(100) + hm.get(Integer.parseInt(sint[6])) + hm.get(10) + hm.get(Integer.parseInt(sint[7]));break; case 9: snum = hm.get(Integer.parseInt(sint[1])) + hm.get(1000) +hm.get(Integer.parseInt(sint[2])) + hm.get(100) +hm.get(Integer.parseInt(sint[3])) + hm.get(10) +hm.get(Integer.parseInt(sint[4])) + hm.get(10000) + hm.get(Integer.parseInt(sint[5])) + hm.get(1000) + hm.get(Integer.parseInt(sint[6])) + hm.get(100) + hm.get(Integer.parseInt(sint[7])) + hm.get(10) + hm.get(Integer.parseInt(sint[8]));break; case 10: snum = hm.get(Integer.parseInt(sint[1])) + "亿" + hm.get(Integer.parseInt(sint[2])) + hm.get(1000) +hm.get(Integer.parseInt(sint[3])) + hm.get(100) +hm.get(Integer.parseInt(sint[4])) + hm.get(10) +hm.get(Integer.parseInt(sint[5])) + hm.get(10000) + hm.get(Integer.parseInt(sint[6])) + hm.get(1000) + hm.get(Integer.parseInt(sint[7])) + hm.get(100) + hm.get(Integer.parseInt(sint[8])) + hm.get(10) + hm.get(Integer.parseInt(sint[9]));break; case 11: snum = hm.get(Integer.parseInt(sint[1])) + hm.get(10) + hm.get(Integer.parseInt(sint[2])) + "亿" + hm.get(Integer.parseInt(sint[3])) + hm.get(1000) +hm.get(Integer.parseInt(sint[4])) + hm.get(100) +hm.get(Integer.parseInt(sint[5])) + hm.get(10) +hm.get(Integer.parseInt(sint[6])) + hm.get(10000) + hm.get(Integer.parseInt(sint[7])) + hm.get(1000) + hm.get(Integer.parseInt(sint[8])) + hm.get(100) + hm.get(Integer.parseInt(sint[9])) + hm.get(10) + hm.get(Integer.parseInt(sint[10]));break; case 12: snum = hm.get(Integer.parseInt(sint[1])) + hm.get(100) + hm.get(Integer.parseInt(sint[2])) + hm.get(10) + hm.get(Integer.parseInt(sint[3])) + "亿" + hm.get(Integer.parseInt(sint[4])) + hm.get(1000) +hm.get(Integer.parseInt(sint[5])) + hm.get(100) +hm.get(Integer.parseInt(sint[6])) + hm.get(10) +hm.get(Integer.parseInt(sint[7])) + hm.get(10000) + hm.get(Integer.parseInt(sint[8])) + hm.get(1000) + hm.get(Integer.parseInt(sint[9])) + hm.get(100) + hm.get(Integer.parseInt(sint[10])) + hm.get(10) + hm.get(Integer.parseInt(sint[11]));break; case 13: snum = hm.get(Integer.parseInt(sint[1])) + hm.get(1000) + hm.get(Integer.parseInt(sint[2])) + hm.get(100) + hm.get(Integer.parseInt(sint[3])) + hm.get(10) + hm.get(Integer.parseInt(sint[4])) + "亿" + hm.get(Integer.parseInt(sint[5])) + hm.get(1000) +hm.get(Integer.parseInt(sint[6])) + hm.get(100) +hm.get(Integer.parseInt(sint[7])) + hm.get(10) +hm.get(Integer.parseInt(sint[8])) + hm.get(10000) + hm.get(Integer.parseInt(sint[9])) + hm.get(1000) + hm.get(Integer.parseInt(sint[10])) + hm.get(100) + hm.get(Integer.parseInt(sint[11])) + hm.get(10) + hm.get(Integer.parseInt(sint[12]));break; } snum += "元"; snum = snum.replaceAll("零仟", ""); snum = snum.replaceAll("零佰", "零"); snum = snum.replaceAll("零拾", ""); snum = snum.replaceAll("零零亿", "亿"); snum = snum.replaceAll("零亿", "亿"); snum = snum.replaceAll("零零万", "万"); snum = snum.replaceAll("零万", "万"); snum = snum.replaceAll("亿万", "亿"); snum = snum.replaceAll("零零元", "元"); snum = snum.replaceAll("零元", "元"); if(snum.startsWith("元")) snum="零" + snum; // System.out.println(snum); String[] sdec = decpart.split(""); //小数部分 if(sdec[1].equals("0")&&sdec[2].equals("0")) { hasdec = "整"; snum += hasdec; } else{ if(sdec[1].equals("0")) dec0 = "零"; else dec0 = hm.get(Integer.parseInt(sdec[1])) + "角"; if(sdec[2].equals("0")) dec1 = ""; else dec1 = hm.get(Integer.parseInt(sdec[2])) + "分"; snum += dec0+dec1; } return snum; } /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub System.out.println("Input a number less than 1000000000000:"); double num = new Scanner(System.in).nextDouble(); if(num>=1e12){ System.out.println("Out of range!"); }else if(num<0) System.out.println("Nagative number"); else{ String snum = new DecimalFormat("0.00").format(num);//四舍五入保留两位小数 System.out.println(snum); String result = MoneyToUppercase.toUpper(snum); System.out.println(result); } } }