输入一个整数部分不超过12位的小数,变成人民币读法
2016-10-20 14:04
316 查看
package test; import java.util.*; public class num2rmb { private String[] hanArr= {"零" , "壹" , "贰" , "叁" , "肆" , "伍" , "陆" , "柒" , "捌" , "玖"}; private String[] unitArr = {"十", "百", "千"}; private String[] divide(double num) { //将一个浮点数强制类型转换为long,即得到它的整数部分。 long zheng = (long)num; //浮点数减去整数部分,得到小数部分,小数部分乘以100后再取整得到2位小数。 //Math类的round方法,返回与参数最接近(经四舍五入后)的整数。 long xiao = Math.round((num - zheng) * 100); //下面用了2种方法把整数转换为字符串。 //return一个匿名数组。 //String类的valueOf(int i)方法,返回整数参数的字符串表达式。 return new String[]{zheng + "",String.valueOf(xiao)}; } private String toHanStr(String numStr) { int strLen = numStr.length(); int yu = strLen % 4; //partNum表示该数字字符串可划分成的节数(每4位为一节)。 //如余数等于0,则将strLen/4赋值给partNum;否则将strLen/4 + 1赋值给partNum。 int partNum = yu == 0 ? strLen/4 : strLen/4 + 1; //firstPartLen表示第一节的长度 int firstPartLen = strLen - (partNum - 1)*4; //因为后面节的长度是总节数减-1,而后面肯定是满4个的 String resultFirst = ""; String resultSecond = ""; String resultThird = ""; for (int i = 0 ; i < partNum ; i ++ ) { if (i == 0) { String firstPart = numStr.substring(0, firstPartLen); for(int j=0;j<firstPartLen;j++) { int num=firstPart.charAt(j)-48; if(j!=firstPartLen-1&&num!=0) { resultFirst += hanArr[num] + unitArr[firstPartLen - 2 - j]; } else if (j==firstPartLen-1&&num!=0) { resultFirst += hanArr[num]; } else if(num==0) { if(((j-1)>=0)&&firstPart.charAt(j-1)-48==0) continue; if(((j-1)>=0)&&firstPart.charAt(j-1)-48!=0&&((j+1)<=firstPartLen-1)&&firstPart.charAt(j+1)-48!=0) resultFirst += hanArr[num]; } } } else if(i==1) { String secondPart = numStr.substring(firstPartLen, (firstPartLen + 4)); int secPartLen = 4; for(int j=0;j<secPartLen;j++) { int num=secondPart.charAt(j)-48; if (Integer.parseInt(secondPart) == 0 && partNum == 3) { resultSecond = hanArr[0]; break; } else if(j!=secPartLen-1&&num!=0) { resultSecond += hanArr[num] + unitArr[secPartLen - 2 - j]; } else if (j==secPartLen-1&&num!=0) { resultSecond += hanArr[num]; } else if(num==0) { if(((j-1)>=0)&&secondPart.charAt(j-1)-48==0) continue; if(((j-1)>=0)&&secondPart.charAt(j-1)-48!=0&&((j+1)<=secPartLen-1)&&secondPart.charAt(j+1)-48!=0) resultSecond += hanArr[num]; } } } else if(i==2) { String thirdPart = numStr.substring((firstPartLen + 4), strLen); int thirdPartLen = 4; for(int j=0;j<thirdPartLen;j++) { int num=thirdPart.charAt(j)-48; if(j!=thirdPartLen-1&&num!=0) { resultThird += hanArr[num] + unitArr[thirdPartLen - 2 - j]; } else if (j==thirdPartLen-1&&num!=0) { resultThird += hanArr[num]; } else if(num==0) { if(((j-1)>=0)&&thirdPart.charAt(j-1)-48==0) continue; if(((j-1)>=0)&&thirdPart.charAt(j-1)-48!=0&&((j+1)<=thirdPartLen-1)&&thirdPart.charAt(j+1)-48!=0) resultThird += hanArr[num]; } } } } String result = ""; if (partNum == 1) { //如果数字仅为0 if (resultFirst == "") { result = hanArr[0] + "元"; } else { result = resultFirst + "元"; } } else if (partNum == 2) { //如果第二节全为0 if (Integer.parseInt(numStr.substring(firstPartLen, (firstPartLen + 4))) == 0) { result = resultFirst + "万"; } else { result = resultFirst + "万" + " " + resultSecond+ "元"; } } else if (partNum == 3) { if (Integer.parseInt(numStr.substring(firstPartLen, (firstPartLen + 4))) == 0 && Integer.parseInt(numStr.substring((firstPartLen + 4), strLen)) == 0) { result = resultFirst + "亿"; } else if(Integer.parseInt(numStr.substring(firstPartLen, (firstPartLen + 4))) == 0) { result = resultFirst + "亿" + " " + resultSecond + " " + resultThird+ "元"; } else if(Integer.parseInt(numStr.substring((firstPartLen + 4), strLen)) == 0) { result = resultFirst + "亿" + " " + resultSecond + "万" + " " + "元"; } else { result = resultFirst + "亿" + " " + resultSecond + "万" + " " + resultThird+ "元"; } } return result; } private String toXiaoStr(String numStr) { String result = ""; int num1 = numStr.charAt(0) - 48; result += hanArr[num1] + "角"; int num2 = numStr.charAt(1) - 48; result += hanArr[num2] + "分"; return result; } public static void main(String[] args) { //等号左边的Num2Rmb是nr的变量类型,右边的Num2Rmb是构造器名 num2rmb nr = new num2rmb(); Scanner scan = new Scanner(System.in); System.out.println("请输入一个整数部分最多为12位的小数"); double sc=scan.nextDouble(); while(String.valueOf(Math.floor(sc)).length()>12) { System.out.print("输入错误,请重新输入:"); sc=scan.nextDouble(); } String[] all=nr.divide(sc); String zhengpart=all[0]; String xiaopart=all[1]; //测试把一个12位以内的数字字符串变成汉字字符串 System.out.println(nr.toHanStr(zhengpart)+" "+nr.toXiaoStr(xiaopart)); } }
相关文章推荐
- 输入一个不超过12位的整数,转化为人民币的读法
- 输入一个浮点数,并输出该数的整数部分和小数部分
- Python3基础 str str()将整数,小数转换成字符串。 输入一个小数,显示整数部分与小数部分
- 将浮点数转换成人民币读法字符串(整数部分在12位以内)
- 从键盘输入一个实型数据,求出它的整数部分和小数部分。
- JAVA 输入一个浮点,分别输出整数部分和小数部分
- 输入一个float,分别输出它的整数部分和小数部分
- 接受用户输入的一个浮点数,把它的整数部分和小数部分分别输出
- JAVA 输入一个浮点,分别输出整数部分和小数部分
- 输入一个小数(整数部分3位、小数部分5位),把该小数分别按照以下格式输出
- 37 java java将一个浮点型数据的整数部分和小数部分分别输出
- 算法习题54:输入一个整数数组,调整数组中数字的顺序,使得所有奇数位于数组的前半部分
- 整数数组的定义,然后输入一个整数X,假定X不在这个数组,返回小于X位置的最大数目i而超过X位置的最小数目j
- 输入包括两行,第一行是一个正整数N(N<=1000000),表示理工大共N个美女。第二行有N个正整数分别表示N位美女的身高,每个正整数的值不会超过10^9。 (输入数据之间会用空格隔开)
- 【数据结构】输入一个整数数组,调整数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分。
- 输入一个整数数组,调整数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分
- 【c语言】从键盘输入一个小于1000的正数,输出它的平方根(若平方根不是整数,则输出它的整数部分)
- JAVA中如何判断一个输入是数字(小数和整数)还是字符串?
- 编写程序,分离出一个实数的整数部分与小数部分,要求用函数完成
- 整数输入有理循环小数 1/7 = 0.142857142... 是个无限循环小数。 任何有理数都可以表示为无限循环小数的形式。 本题目要求即是:给出一个数字的循环小数表示法。