用java编写一个程序,将浮点数转换成人民币读法字符串,例如将1006.333转换成壹仟零陆元叁角叁分
(详细注释,学习中,有错误可以指出。)
//编写一个程序,将浮点数转换成人民币读法字符串,例如将1006.333转换成壹仟零陆元叁角叁分。
public class demotwo {
//首先,设置三个字符型数组,由于只用于该方法中,所以定义时采用私有
private String[] hanArr = {"零","壹","贰","叁","肆","伍","陆","柒","捌","玖"};
private String[] unitArr ={"仟", "", "拾", "佰"};
private String[] tag = {"元","万","亿"};
//通用数组设置完成,现在进行转换方法的编写
public String toHanStr(double num){
//设置一个最后输出的字符型变量,result,最后返回这个值
String result = ""; //会返回一个String类型的值,被result接收。
//第一步,将设置的数字的整数部分与小数部分分开。
long zheng = (long) num;
long xiao = (long)((num-zheng)*100);
//第二步,把整数值转换成字符串赋给zhengStr,再把len设置成字符串的长度,用来控制遍历
String zhengStr = String.valueOf(zheng);
int len = zhengStr.length();
int tempLen = 0;
//第三步,控制整数部分转换输出
//首先,用for循环控制对整数部分的遍历
for (int i = 0; i <len ; i++) {
//然后将该位置的字符型数字转换成int型数字,由于字符型数字与int型数字之间相差48,所以设置temp来存放整型数字
int temp = zhengStr.charAt(i) - 48;
//然后确定该数字在哪一个段,并且存放在int型变量part中,段包括元段,万段,亿段
int part = (len - i - 1) / 4;
//然后确定该数字在该段的哪一个位置,并且存放在int型变量location中,位置包括,仟、佰,拾,“ ”
int location = (len - i - 1) % 4;
//需要该判断数字是在个位上还是其他位上,由此确定后面需不需要加单位,因为只有十位百位千位上要加仟佰拾。
//也就是判断表示位置的location是否等于0
//首先处理不是最后一位的情况
if(location!=0){
//判断完位置之后,还需要判断该位置上是否为0,由于不在最后一位上,所以如果该位置是0的话,要加上“零”
//不等于零的情况
if(temp!=0){
result += hanArr[temp] + unitArr[(len - i) % 4]; //用result存放数字加单位, 例如 壹+仟 壹仟
continue; //跳出
}
//等于0的情况
else{
tempLen = result.length();
//等于0的情况,要是处于哪一个位置的0,现在已经排除了是最后一位的情况
//假设设置的数字只有四位,也就是“x”仟“x”佰“x”拾“x”
//如果第一位为0的话,那就需要直接跳过仟,而第二与第三位位是0的话,那就需要加个零,去掉后面的单位
if(3 == location) { //当前字符为该段第一个
result += "零"; continue;
} else {
tempLen = result.length();
//然后判断该位置前一个位置是否为零,如果前一个位置也是零的话,那么这里就不需要加零了。例如1001,中间读出来只有一个零
if(result.charAt(tempLen - 1) == '零') {
continue;
}
//如果前一个位置的字符不是零,那就得加上零了
else {
result += "零"; continue;
}
}
}
}
//然后处理是最后一位的情况,是最后一位的话则要判断要加上什么单位,元万亿
else {
//temp就是需要判断的Int型数字,虽然确认了是最后一位,但还是需要判断这个数是否为0
// 如果是0的话就直接加单位
//如果不是0的话,就直接把之前设置的两个数组连接在一起,即hanArr和tag,数值和单位,即伍元,伍万,伍亿
if(temp != 0) {
result += hanArr[temp] + tag[part]; continue;
}
else
{
//当temp为零的时候,还要判断前一位是否为零,例如1100与1110,读法为壹仟一百元,和壹仟壹佰壹拾元
tempLen = result.length();
if(result.charAt(tempLen - 1) != '零') {
//当前一位不等于零时,直接用这个数字加上单位即可,例如壹拾()元,中间括号就是因为这个数为零,所以直接加上元的单位,然后跳出循环了
result += tag[part]; continue;
}
else {
//判断完最后一位不为零之后,则要判断前面的三位是否都为零,这样的情况只需要直接跳过就好了
//例如1、0000、0000
//由于遍历的顺序,这里我们先以万位为例,如果前面三位都是零,那么自然就是以壹亿零和壹万零结尾
//只要判断charAt(1)是否为亿或者万就好了,如果是亿或者万直接跳出
//这里会产生一个遗留问题,也就是像1、0000、0000这种的到最后都还是 壹亿零注意是壹亿零,并没有加上单位,所以零依旧是最后一位数
//多出了一个零,这个遗留问题会在小数的转换中解决
if(result.charAt(tempLen - 2) == '亿' || result.charAt(tempLen - 2) == '万') {
continue;
}
/*如果前一位为零的话,那么则需要判断了,由于前一位是十位,十万位,如果是零的话,那么前面就肯定已经判断过了
如果十万位,十位是零的话
之前就会判断百万位和百位上是否为零,如果这里也是零,那么十万位和十位上就不会进行判断
返回的result依旧只有一个零,这里我以1000、0000为例,因为这里判断的是最后一位,也就是万位上的数字
会判断十万位上是不是零,而十万位上不是零的话,就会进行上面的循环,这里的else已经确定十万位上是零了
按设置的方法倒推,由于十万位上是零,程序自然会判断百万位上是否为零(倒推)
现在我们正推来看,首先是 i=0时 result=壹仟 (千万位)
i=1时,result=壹仟零 (百万位)由于前一位不是零,所以直接加上了一个零
i=2时,result=壹仟零 (十万位)由于前一位是零,所以这里不加任何东西,直接跳出循环
好了,现在就到了我们判断的最后一位了,也就是万位
由于前面已经判断过了前一位为零,所以无论如何,result所储存的字符串中最后一个字符一定为零
所以这个时候就需要把那个零删掉然后加上单位了
例如 壹仟零——壹仟(零)万
*/
else {
result = result.substring(0, tempLen - 1) + tag[part]; continue;
/*
substring(beginIndex ,endIndex )
beginIndex - 开始处的索引(包括)。
endIndex - 结束处的索引(不包括)。
例如前面是陆佰零,由于最后一位也是零,且需要取单位万,不可能念成陆佰零万,所以这个时候需要去掉字符串中的零
于是使用这个方法,直接忽略了该字符串的最后一个字符,也就是零,直接加上标签单位。
*/
}
}
}
}
}
//处理完整数的转换,现在我们来进行小数的转换
//由于小数单位比较少,所以我们并不需要单独设置一个字符型数组
//这里我们先将小数中的角和分所代表的的数字单独提取出来
int jiao = (int)(xiao / 10);
int fen = (int)(xiao % 10);
//然后判断角和分中是否为零的情况
//而小数中,如果为零的话,那就直接跳过就好了,例如1.01读作壹元壹分,1.10读作壹元壹角
if(jiao != 0) {
result += hanArr[jiao] + "角";
}
if(fen != 0) {
result += hanArr[fen] + "分";
}
//处理完小数之后开始处理遗留问题
tempLen = result.length();
//如果最后一位零,也就是壹仟万零,壹亿零这种情况,直接删掉最后一个零
//然后按顺序进行下面的if语句
//例如壹亿零变成壹亿,然后再由下面的循环变成壹亿元整
if(result.charAt(tempLen - 1) == '零') {
result = result.substring(0, tempLen - 1);
}
tempLen = result.length();
//如果最后一位为元,也就是壹仟零壹元这种情况,再加上一个整
if(result.charAt(tempLen - 1) == '元') {
result += "整";
}
//如果最后一位为万/亿,也就是壹仟万,壹仟亿这种情况,再加上一个元整
if(result.charAt(tempLen - 1) == '万' || result.charAt(tempLen - 1) == '亿') {
result += "元整";
}
//最后输出!!!
return result;
}
public static void main(String[] args) {
demoone ntr = new demoone(); //实例化对象,前面是定义一个对象,后面是为这个对象分配内存空间,初始化对象
System.out.println(ntr.toHanStr(600100.11));
}
}