题目:读入一个浮点数值,将其转换为中文金额的大写形式.如123.45,转化为壹佰贰拾叁元肆角伍分.编写程序,针对一下情况完善.
1.当金额为整数时,只表示整数部分,省略小数部分.并添加“整”字.如123,转化为壹佰贰拾叁元整.
2.当金额中含有连续的0时,只需输出一个零.如10005表示为壹万零伍元整我的程序如下:
public class MoneyB
{
public static void main(String[] args)

double k=10030501.98;
int n=0;int t=0;
double m;
for(int zero=100000000;zero>1;zero/=10)
{ //if((k<10)&&(zero>1))zero=1;
m=(k/zero);
int c=(int)(m);
if(((c==0)&&(n==0))||((c==0)&&(t==1)))continue;//防止开始输出0和连续输出0
else {k-=c*zero;n=1;}


switch(c)
{
case 1:   System.out.print("壹");break;
case 2:   System.out.print("贰");break;
case 3:   System.out.print("叁");break;
case 4:   System.out.print("肆");break;
case 5:   System.out.print("伍");break;
case 6:   System.out.print("陆");break;
case 7:   System.out.print("柒");break;
case 8:   System.out.print("捌");break;
case 9:   System.out.print("玖");break;
case 0:   System.out.print("零");break;


  if(c==0){t=1;continue;}//防止输出连续0
  else t=0;
  
switch(zero)
{
case 100000000:   System.out.print("亿");break;
case 10000000:   System.out.print("仟萬");break;
case 1000000:   System.out.print("佰萬");break;
case 100000:   System.out.print("十萬");break;
case 10000:   System.out.print("萬");break;
case 1000:   System.out.print("仟");break;
case 100:   System.out.print("佰");break;
case 10:   System.out.print("拾");break;
case 1:   System.out.print("圆");break;

}

 if((m*zero/c)%zero==0){System.out.print("整");break;}
 else if(zero==1)
{
                 k*=100;
         int p=0;
         for(int i=10;i>0;i/=10)
 {       
         p=(int)(k/i);
         if(p<1)continue;
                      switch(p)
{
case 1:   System.out.print("壹");break;
case 2:   System.out.print("贰");break;
case 3:   System.out.print("叁");break;
case 4:   System.out.print("肆");break;
case 5:   System.out.print("伍");break;
case 6:   System.out.print("陆");break;
case 7:   System.out.print("柒");break;
case 8:   System.out.print("捌");break;
case 9:   System.out.print("玖");break;
case 0:   System.out.print("零");break;

                      switch(i)
{
  case 10:  System.out.print("角"); break;         
case 1:   System.out.print("分"); break;          
       
}
              k%=10;
   }  
   }
  
}
}
}
当k=1234567.98时.输出壹佰萬贰十萬叁萬肆仟伍佰陆拾
当k=10030500壹仟萬零叁萬零伍佰整
当k=10030501壹仟萬零叁萬零伍佰零
大家帮忙看下问题在哪里.或者有更简单的方法也行.先谢谢了.

解决方案 »

  1.   

    看你的结果就是没有执行数字的个位数或者以后的部分,错误应该在你的循环到个位数时条件不满足或者执行个位数的上一步时进行了break代码很长,建议多写注释
      

  2.   

    看你的结果就是没有执行数字的个位数或者以后的部分,错误应该在你的循环到个位数时条件不满足或者执行个位数的上一步时进行了break代码很长,建议多写注释
      

  3.   

    代码改成如下:package other;
    public class MoneyB 

    public static void main(String[] args) 

    double k=10030501.98; 
    int n=0;int t=0; 
    double m; 
    for(int zero=100000000;zero>1;zero/=10) 
    { //if((k <10)&&(zero>1))zero=1; 
    m=(k/zero); 
    int c=(int)(m); 
    if(((c==0)&&(n==0))||((c==0)&&(t==1)))continue;//防止开始输出0和连续输出0 
    else {k-=c*zero;n=1;} 
    switch(c) 

    case 1:  System.out.print("壹");break; 
    case 2:  System.out.print("贰");break; 
    case 3:  System.out.print("叁");break; 
    case 4:  System.out.print("肆");break; 
    case 5:  System.out.print("伍");break; 
    case 6:  System.out.print("陆");break; 
    case 7:  System.out.print("柒");break; 
    case 8:  System.out.print("捌");break; 
    case 9:  System.out.print("玖");break; 
    case 0:  System.out.print("零");break; 
    }   if(c==0){t=1;continue;}//防止输出连续0 
      else t=0; 
      
    switch(zero) 

    case 100000000:  System.out.print("亿");break; 
    case 10000000:  System.out.print("仟");break; 
    case 1000000:  System.out.print("佰");break; 
    case 100000:  System.out.print("十");break; 
    case 10000:  System.out.print("萬");break; 
    case 1000:  System.out.print("仟");break; 
    case 100:  System.out.print("佰");break; 
    case 10:  System.out.print("拾");break; 
    case 1:  System.out.print("圆");break; } if((m*zero/c)%zero==0){System.out.print("整");break;} 
    else if(zero==1) 

                    k*=100; 
            int p=0; 
            for(int i=10;i>0;i/=10) 
    {      
          p=(int)(k/i); 
            if(p <1)continue; 
                          switch(p) 

    case 1:  System.out.print("壹");break; 
    case 2:  System.out.print("贰");break; 
    case 3:  System.out.print("叁");break; 
    case 4:  System.out.print("肆");break; 
    case 5:  System.out.print("伍");break; 
    case 6:  System.out.print("陆");break; 
    case 7:  System.out.print("柒");break; 
    case 8:  System.out.print("捌");break; 
    case 9:  System.out.print("玖");break; 
    case 0:  System.out.print("零");break; 

                          switch(i) 

      case 10:  System.out.print("角"); break;        
    case 1:  System.out.print("分"); break;          
          

                  k%=10; 
      }  
      } 
      



    当k=1234567.98时.输出壹佰贰十叁萬肆仟伍佰陆拾 
    当k=10030500壹仟零叁萬零伍佰整 
    当k=10030501壹仟零叁萬零伍佰零 没有多出来的萬了!
      

  4.   

    根据楼主的例子改程序太难了,我又从重做了一个程序,基本实现了亿元级货币的小写转大写,并且附注说明;
    /*
     * 货币金额数字的小写转大写
     */
    package other;import java.math.BigDecimal;
    import java.text.DecimalFormat;public class MoneyB {
    double dk=0;
    public void number(int c){
    switch(c) 

    case 1:  System.out.print("壹");break; 
    case 2:  System.out.print("贰");break; 
    case 3:  System.out.print("叁");break; 
    case 4:  System.out.print("肆");break; 
    case 5:  System.out.print("伍");break; 
    case 6:  System.out.print("陆");break; 
    case 7:  System.out.print("柒");break; 
    case 8:  System.out.print("捌");break; 
    case 9:  System.out.print("玖");break; 
    case 0:  System.out.print("零");break; 

    }
    public void unit(int l){
    switch(l-1) 
    {
    case 6:  System.out.print("佰");break; 
    case 5:  System.out.print("十");break; 
    case 4:  System.out.print("萬");break; 
    case 3:  System.out.print("仟");break; 
    case 2:  System.out.print("佰");break; 
    case 1:  System.out.print("拾");break; 
    case 0:  System.out.print("圆");break; 

    }
    public void unitBig(int l){
    switch(l-1) 
    {
    case 1:  System.out.print("亿");break; 
    case 0:  System.out.print("仟");break;

    }
    public void unitdec(int d){
    switch(d) 

    case 10:  System.out.print("角"); break;        
    case 1:  System.out.print("分"); break; 

    }
    public void toHigh(String sk,int l){
    for(int i=0;i<l;i++){
    String  sc=sk.substring(i,i+1);                //依次取出每位的数字
    String sc2=sk.substring(i+1,i+2);              //依次取出每位数字的后一位
    int sci=Integer.parseInt(sc);                  //强制转换为int类型
    if(!sc.equals("0")){                           //取出的数字不为零的情况下小转大
    number(sci);                               //数字小转大
    unit(l-i);                                 //数字大写单位
    }
    if(l-i==5&&sc.equals("0")){                    //单位为萬的处理
    //unit(l-i);
    System.out.print("萬");
    }
    if(l<5&&dk>=10000000){
    System.out.print("萬");                    //单位为萬的处理
    }
    if((l==i+1)&&sc.equals("0")){                 //单位为圆的处理
    System.out.print("圆"); 
    }
    if(sc.equals("0")&&(!sc2.equals("0")&&!sc2.equals("."))){          //碰到数字为零的情况
    System.out.print("零");//zero=1;
    }
    }
    }

    public void big(){
    double k = 100110011;                             //k为需转换的小写数字
    dk=k;
    /*
     * 转换千万以上的数字为大写;
     */
    int kk=(int)(k/10000000); //取出千万元的数字
            if(k>=10000000){
                        
    String skBig=String.valueOf(kk);              //转为字符串的型式,
    int lBig=skBig.length();                      //得到数字的位数(如,长度为1是千万单位级的,长度为2是亿单位级的
    for(int i=0;i<lBig;i++){
    String  scBig=skBig.substring(i,i+1);     //逐个取出每位的数字,从最大的数字开如(最在只能为亿单位)
    String sc2Big="0";
    try {
    sc2Big = skBig.substring(i+1,i+2);    //取出下一位的数字(千万单位),
    } catch (Exception e) {
    }
    int sciBig=Integer.parseInt(scBig);       //取出的是字符串的型式,需转换int类型
    if(!scBig.equals("0")){                   //如果数字不为零,则转换大写
    number(sciBig);                       //数字转大写
    unitBig(lBig-i);                      //单位转大写
    }

    //如果该数字为零,但下一个数字不是零,则输出"零",主要是避免多个零重复
    if(scBig.equals("0")&&(!sc2Big.equals("0")&&!sc2Big.equals("."))){
    System.out.print("零");
    }
    }
    k=k-kk*10000000;                             //将提取千万以下的数字
    }    
            int ikk=(int)kk/10;                               //取亿元数字
            int sikk=kk-ikk*10; 
            /*
             * 如果金额有佰万以下元单位,则转换千万以下的数字为大写;
             */
            if(k!=0&&k>=1){                                      //此时的k已经去掉了亿和千万级的单位 
             String sk=String.valueOf(k);                     //转字符串型式
             System.out.println("*"+sk+"*");
         int l=sk.indexOf(".");                           //l为数字的位数
         if(l<7&&dk>=10000000){
         System.out.print("零");                      //佰万元单位为零的处理
         }
         toHigh(sk,l);                                  //调用转换方法
            }
            /*
             * 如果金额没有佰万以下元单位,
             */
            else{
             if(kk>10){                                 //如果有亿元单位数字
             if(sikk==0){                           //如果有亿元单位数字而没有仟万元单位数字,则去掉"萬"字
             System.out.print("圆");
             }else{
             System.out.print("萬");
             }            
                }
            }  

    /*
     * 小数位的处理
     */
    DecimalFormat df = new DecimalFormat("#.00");    //四舍五入 ,只精确到分
    int kkk=(int)k;                                  //去整数部分         
    if(kkk==k){                                      //如果金额为整数,则显示为整(即没有角和分);
    System.out.print("整");
    }else{                                           //如果不为整数就转换角、分为大写;,
    double dec= (k-kkk)*100;                     //去掉整数部分,再乖以100,使分和角成为整数,方便转换;
    String decStr=df.format((k-kkk)*100);        //将结果四舍五入,精确到分
    String scdeciSt=decStr.substring(0,1);       //取得角的数字
    String sc2deciSt="0";
    try {
    sc2deciSt = decStr.substring(1,2);       //取得分的数字
    } catch (Exception e) {
    }
    int scideciSt=Integer.parseInt(scdeciSt);    //取得的数字是字符型式,强制转换为int类型

    if(!sc2deciSt.equals(".")){                  //如果角不为零(即sc2deciSt一下个字符不是有".")则转换角为大写
    number(scideciSt);
    unitdec(10);
    if(!sc2deciSt.equals("0")){             //如果分不为零,则转换分为大写
    int sc2ideciSt=Integer.parseInt(sc2deciSt);
    number(sc2ideciSt);                 //此时sc2ideciSt为分的单位
    unitdec(1);
    }
    }else{                                      //如果角为零,先输出“零”,再转换分为大写
    number(0);
    number(scideciSt);                      //此时scideciSt为分的单位
    unitdec(1);
    }
    }
    }
    public static void main(String[] args) {
    MoneyB mo=new MoneyB();
    mo.big();
    }
    }
      

  5.   

    115行System.out.println("*"+sk+"*");忘了删除了,
    这个程序花了我两天时间,程序还在测试当中,还想改进一下
      

  6.   

    我没做这个,但是有个思路:
    1、定义一个数组 unit{"元","拾","佰","仟","万","拾","佰","仟","亿","拾","佰","仟"}
    2、将数字变成字符串,然后再反转。
    3、取unit数组的 前 (字符串长度位),让数字在后单位在前,组成字符串,然后反转。(如:壹佰零拾壹万叁千零佰零拾零元)
    4、处理字符串中零的问题。5、对小数的处理。
      

  7.   

    昨天的程序有问题,又重新修改了一下,测试了好多遍,还没发现问题,希望大家测试一下,发现问题顶一下!/*
     * 货币金额数字的小写转大写
     */
    package other;import java.text.DecimalFormat;
    import java.util.Scanner;public class MoneyB {
    double dk=0;//原始K的值
    int ss=0;//屏蔽千万和百万两个零同时出现的变量
    public void number(int c){
    switch(c) 

    case 1:  System.out.print("壹");break; 
    case 2:  System.out.print("贰");break; 
    case 3:  System.out.print("叁");break; 
    case 4:  System.out.print("肆");break; 
    case 5:  System.out.print("伍");break; 
    case 6:  System.out.print("陆");break; 
    case 7:  System.out.print("柒");break; 
    case 8:  System.out.print("捌");break; 
    case 9:  System.out.print("玖");break; 
    case 0:  System.out.print("零");break; 

    }
    public void unit(int l){
    switch(l-1) 
    {
    case 6:  System.out.print("佰");break; 
    case 5:  System.out.print("十");break; 
    case 4:  System.out.print("萬");break; 
    case 3:  System.out.print("仟");break; 
    case 2:  System.out.print("佰");break; 
    case 1:  System.out.print("拾");break; 
    case 0:  System.out.print("圆");break; 

    }
    public void unitBig(int l){
    switch(l-1) 
    {
    case 1:  System.out.print("亿");break; 
    case 0:  System.out.print("仟");break;

    }
    public void unitdec(int d){
    switch(d) 

    case 10:  System.out.print("角"); break;        
    case 1:  System.out.print("分"); break; 

    }
    public void toHigh(String sk,int l){
    for(int i=0;i<l;i++){
    String  sc=sk.substring(i,i+1);                //依次取出每位的数字
    String sc2=sk.substring(i+1,i+2);              //依次取出每位数字的后一位
    int sci=Integer.parseInt(sc);                  //强制转换为int类型
    if(l<7&&dk>=10000000&&i==0&&ss==0){
         System.out.print("零");                      //佰万元单位为零的处理
         }
    if(!sc.equals("0")){                           //取出的数字不为零的情况下小转大
    number(sci);                               //数字小转大
    unit(l-i);                                 //数字大写单位
    }
    if(l-i==5&&sc.equals("0")){                    //单位为萬的处理
    System.out.print("萬");
    }

    if((l==i+1)&&sc.equals("0")){                 //十位数为0,个位数不为0,加圆零
    if(dk==(int)dk)System.out.print("圆");   //如果没有小数位加圆
    else {                                    //如果有小数位
    if(((int)(dk*10))%10!=0)              
    System.out.print("圆零");          //如果小数位有角位加圆
    else
    System.out.print("圆");        //如果小数位没有角位加圆 零
    }
    }
    if((l==i)&&sc.equals("0")){                 //个位数不为0,加圆
    System.out.print("圆");
    }
    if(sc.equals("0")&&(!sc2.equals("0")&&!sc2.equals("."))){          //碰到数字为零的情况
    System.out.print("零");
    }
    }
    }

    public void big(){
    // double k = 110001010.01;                             //k为需转换的小写数字
    // double k = 100000000;
    // double k = 100001010; 

    double k=0;

    dk=k;                                            //保存k的原始值
    /*
     * 转换千万以上的数字为大写;
     */
    int kk=(int)(k/10000000);                        //取出千万元的数字
    int kky=(int)(k/100000000);
    int kky1=kky;                                    //取出亿元的数字
    kky*=100000000;
            if(k>=10000000){
                        
    String skBig=String.valueOf(kk);              //转为字符串的型式,
    int lBig=skBig.length();                      //得到数字的位数(如,长度为1是千万单位级的,长度为2是亿单位级的
    for(int i=0;i<lBig;i++){
    String  scBig=skBig.substring(i,i+1);     //逐个取出每位的数字,从最大的数字开如(最在只能为亿单位)
    String sc2Big="0";
    try {
    sc2Big = skBig.substring(i+1,i+2);    //取出下一位的数字(千万单位),
    } catch (Exception e) {
    }
    int sciBig=Integer.parseInt(scBig);       //取出的是字符串的型式,需转换int类型
    if(!scBig.equals("0")){                   //如果数字不为零,则转换大写
    number(sciBig);                       //数字转大写
    unitBig(lBig-i);                      //单位转大写
    }

    //如果该数字为零,但下一个数字不是零,则输出"零",主要是避免多个零重复
    if(scBig.equals("0")&&(!sc2Big.equals("0")&&!sc2Big.equals("."))){
    System.out.print("零");
    }
    }
    k=k-kk*10000000;                             //将提取千万以下的数字
    }    
            int ikk=(int)kk/10;                               //取亿元数字
            int sikk=kk-ikk*10; 
           
            /*
             * 如果金额有佰万以下元单位,则转换佰万以下的数字为大写;
             */
          
            if(k!=0&&k>=1){                                   //此时的k已经去掉了亿和千万级的单位 
             String sk=String.valueOf(k);                     //转字符串型式
         int l=sk.indexOf(".");                           //l为数字的位数
         if(kk>=10&&kk%10==0){
         System.out.print("零");                   //如果亿位数不为0,而千万位数为0
         ss=1;
         }
         if(l<=4&&kk%10!=0)
         System.out.print("萬");                         //如果仟万位不为0,万到百万位为0,则加万
        
         toHigh(sk,l);                                  //调用转换方法
            }
            /*
             * 如果金额没有佰万以下元单位,
             */
            else{
             if(kk>=10){                                 //如果亿位数字不为0
             if(sikk==0){                           //如果亿位数字不为0而仟万位数字为0,则去掉"萬"字
             if(dk==(int)dk)
             System.out.print("圆");       //如果没有小数位
             else 
                 System.out.print("圆零");     //有小数位
             }else{ //亿位数为不为0,仟万位也不为0
             if(dk==(int)dk)
             System.out.print("萬圆");
             else 
             System.out.print("萬圆零");
             }            
                }else{
                 if(kk<10&&dk==(int)dk){               //如果亿位为0,而且没有小数位的情况  
                 if(dk==0)
                 System.out.print("零");       //如果转换的货币金额为0,则显零
                 else
                 System.out.print("萬圆");     //否则加 萬圆
                 }else if(kk%10!=0){                   //亿位数为0,千万数不为0
                 System.out.print("萬圆零");
                 }
                }
            }  

    /*
     * 小数位的处理
     */
    DecimalFormat df = new DecimalFormat("#.00");    //四舍五入 ,只精确到分
    int kkk=(int)k;                                  //去整数部分         
    if(kkk==k){                                      //如果金额为整数,则显示为整(即没有角和分);
    if(dk!=0)System.out.print("整");             //如果金额为0,则不显;
    }else{                                           //如果不为整数就转换角、分为大写;,
    double dec= (k-kkk)*100;                     //去掉整数部分,再乖以100,使分和角成为整数,方便转换;
    String decStr=df.format((k-kkk)*100);        //将结果四舍五入,精确到分
    String scdeciSt=decStr.substring(0,1);       //取得角的数字
    String sc2deciSt="0";
    try {
    sc2deciSt = decStr.substring(1,2);       //取得分的数字
    } catch (Exception e) {
    }
    int scideciSt=Integer.parseInt(scdeciSt);    //取得的数字是字符型式,强制转换为int类型

    if(!sc2deciSt.equals(".")){                  //如果角不为零(即sc2deciSt一下个字符不是有".")则转换角为大写
    number(scideciSt); 
    unitdec(10);
    if(!sc2deciSt.equals("0")){             //如果分不为零,则转换分为大写
    int sc2ideciSt=Integer.parseInt(sc2deciSt);
    number(sc2ideciSt);                 //此时sc2ideciSt为分的单位
    unitdec(1);
    }
    }else{                                      //如果角为零,先输出“零”,再转换分为大写
    if(dk>=1)number(0);                     //如果小于壹元不加零 
    number(scideciSt);                      //此时scideciSt为分的单位
    unitdec(1);
    }
    }
    }
    public static void main(String[] args) {
    MoneyB mo=new MoneyB();
    mo.big();
    }
    }
      

  8.   

    我这里想到一个思路:
    先将float转换为String类型的
    然后用正则表达式来处理!
    今天没时间,空了写一个贴出来!