/*
测试过没什么大问题,就是初学java,判断的部分写的比较复杂,不知道有没有更简单的办法呢?
如有问题还请大家帮忙指正,谢谢啦~
*/
import java.util.Scanner;
public class NumToStr {
// 定义两个字符数组
private String[] hanArr={"零","壹","贰","叁","肆","伍","陆","柒","捌","玖"};
private String[] unitArr = {"","拾","百","仟"};
//定义拆分方法divide,把浮点数分解成整数部分和小数部分字符串
private String[] divide(double num){
long zheng = (long)num;
long xiao = Math.round((num-zheng)*100);
System.out.println("整数部分是:"+zheng);
System.out.println("小数部分是:"+xiao);
return new String[]{zheng+"",xiao+""};
}
//定义四位整数部分数字符串转汉字的toHanStr方法
private String toHanStr(String numStr){
String result="";
int numlen = numStr.length();
for(int i = 0 ;i < numlen ;i++){
int num = numStr.charAt(i)-48;
// num不等于0,很简单。
if(num!=0){
result += hanArr[num]+unitArr[numlen-1-i];
}else{
// num等于0的情况比较复杂。
if(i==numlen-1){
// 等于0且在最后一个,完全忽略
continue;
}else{
//等于0但不在最后一个,再看前一个是否为0
if(i>0 && numStr.charAt(i-1)-48 ==0){
//如果前一个为0,则完全忽略。
continue;
}else{
//如果前一个不为0,则再判断后面的是否为0,如果全为0,则不读0;如果不全为0,则读一个零
boolean allzero = true;
for(int a = i;a<numlen;a++){
if(numStr.charAt(a)-48 !=0){
allzero = false;
}
}
if(allzero == false){
result += hanArr[num];
}
}
}
}
}
return result;
}
// 定义小数部分数字字符串转汉字的toXiao方法。
private String toXiao(String xiao){
String result = "";
int x = Integer.parseInt(xiao);
if (x!=0){
// int numlen = numStr.length();
// for(int i = 0 ;i < numlen ;i++){
// int num = numStr.charAt(i)-48;
// result += hanArr[num];
// }
if(x>9){
int xiao1 = xiao.charAt(0)-48;
int xiao2 = xiao.charAt(1)-48;
if (xiao1 != 0 && xiao2!=0){
result =result + "点"+hanArr[xiao1]+hanArr[xiao2]+"元";
}else if(xiao2 ==0){
result =result + "点"+hanArr[xiao1]+"元";
}
}else{
result =result + "点零"+hanArr[x]+"元";
}
}else{
result += "元整";}
return result;
}
// 主方法
public static void main(String[] args){
System.out.println("请输入四位数字(只保留小数点后两位):");
Scanner sc = new Scanner(System.in);
double amount = sc.nextDouble();
NumToStr nr = new NumToStr(); // 要调用方法,需要先创建对象。
String[] div = nr.divide(amount);
String result = nr.toHanStr(div[0])+nr.toXiao(div[1]);
System.out.println(result);
sc.close();
}
}