我也写了一个,也不满意,总有不对的地方

解决方案 »

  1.   

    自己曾经编的一个,思路混乱,献丑了~~不过自以为考虑还算全面~
    // MyApp.java
    //by__www.haisens.org f/*本程序的思想是:  转化 输入 string 为double ,
      分别取出整数 位放入数组 (inte[13]) ,小数位放入数组(floa[4])
      整数部分根据 (位数/4) 的结果 判断加后缀 (mid[])万亿兆,
          和判断 加(end[]) 十百千
      考虑例外比较多,各个if else 判断出写出了针对于哪些特殊情况的处理
    */
    import javax.swing.*;
    import java.awt.*;
    import java.awt.event.*;class NUMFException extends Exception{}public class MyApp  extends JApplet
    {
      protected JTextField  in =new JTextField(25),
                          out =new JTextField(25);
      private JButton btn = new JButton("Num_To_RMB");
      private JFrame dlg =new JFrame();          //for JOptionPane/* 捕捉不能识别 的  这样的错误输入     例子:  123d*/
      public static void testNUMF(String str) throws NUMFException{
          if (str.charAt(str.length()-1)=='d'||str.charAt(str.length()-1)=='f'||
              str.charAt(str.length()-1)=='D'||str.charAt(str.length()-1)=='F')
           throw new NUMFException();
        }
    /*捕捉按钮action  */
      class Bl implements ActionListener
      {
        public void actionPerformed(ActionEvent e) throws NumberFormatException
        {
           try {
              String instr =in.getText();
              testNUMF(instr);
              StringBuffer outstr=new StringBuffer();
              outstr= Trans(instr,outstr);
              out.setText(outstr.toString());
              }  catch (NUMFException e1) {    // 例子:1233d   121.232f
                   JOptionPane.showMessageDialog(dlg, "末尾不能有字母","错误提示",JOptionPane.WARNING_MESSAGE);
                   in.setText("");
              }  catch (NumberFormatException e2) {   // 例子:aaaaa
                   JOptionPane.showMessageDialog(dlg, "输入数字格式错误","错误提示",JOptionPane.WARNING_MESSAGE);
                   in.setText("");
              }  catch (ArrayIndexOutOfBoundsException e3){   // 例子:1e13
                   JOptionPane.showMessageDialog(dlg, "数字超出范围","错误提示",JOptionPane.ERROR_MESSAGE);
                   in.setText("");
              }
      }
     }/***定义转换方法 Trans()***/
      public static StringBuffer Trans(String in ,StringBuffer out)
       {
           String chn[]={"零","壹","贰","叁","肆","伍","陆","柒","捌","玖"};
           String end[]={"","拾","佰","仟",};
           String mid[]={"","万","亿","兆",};       double ind =Double.parseDouble(in);
           long ind_left =(long)ind;
           long[] inte= new long[13]; //存放整数位
           int[] floa=new int[4];     //存放小数位/*将整数部分放入inte[]*/
         for(int i=12;i>=0;i--)
           {
             inte[i]=(long)(ind_left/(long)(Math.pow(10,i)));
             ind_left%=(long)(Math.pow(10,i));
           }/*象小数部分放入floa[]*/
         int index=in.indexOf('.');
         if(index!=-1)
         {
           String str=in.substring(index+1);
           for (int i=0;i<str.length();i++)
            {
              floa[i]=Integer.parseInt(str.substring(i,i+1));
            }
         }/**如果整数位不是0,处理整数位      例子:111.1234**/
      if ((int)ind!=0)
       {
        int i=12;
        while(inte[i]==0)  //查找首位
          {i--;}/*输出到  out */
        for(int j=i/4;j>=0;j--)
         {
           if (j==3)      //如果 数字13位,单独处理       1兆
              {out.append(chn[(int)(inte[12])]).append(mid[3]);
               j--;}
           for(int k=3;k>=0;k--)
            {
              int num=4*j+k;
              if (inte[num]!=0)  //再不是0的位上一次添加 十百千
               {
                 out.append(chn[(int)(inte[num])]).append(end[k]);
               }
              else
               {
                  if(k==0||k==0&&k==1||k==0&&k==1&&k==2||k==0&&k==1&&k==2&&k==3)  {}  //如果是 万亿位 的最后几位全是0 则也不输出
                  else
                    {
                       if (inte[num-1]==0){}     //根据后面以为是不是0判断加不加0  例子: 1003
                         else
                           out.append(chn[0]) ;
                    }
               }
            }
            if(!(inte[j*4+0]==0&&inte[j*4+1]==0&&inte[j*4+2]==0&&inte[j*4+3]==0)) //如果有一段全是0 则也不输出位    例子:1000 0000 0003 不会出现 一千亿  万  零三
          out.append(mid[j]);
         }     if (out.charAt(0)=='零')     //因为最后一位没有下一位,所以是0则删去
            {out.deleteCharAt(0);}   //例子  30
        }
    /**如果整数位是0,处理整数位 ,直接加0     例子:0.1234**/
        else
         {out.append('零');}/*处理小数部分*/
      /*如果存在小数位*/
       if (index!=-1)
       {
         out.append('点');//处理小数位
          for(int m=0;m<=3;m++)
           {
            out.append(chn[floa[m]]);
           }
         int zero=out.length()-1;
         while (out.charAt(zero)=='零')    //最后几位如果是0,则删除
            {out.deleteCharAt(zero);zero--;}
       }   return out;
    }
      public void init()
      {
        btn.addActionListener(new Bl());
        Container cp =getContentPane();
        cp.setLayout(new FlowLayout());
        out.setEditable(false);
        cp.add(in);
        cp.add(out);
        cp.add(btn);  }  public static void main(String[] args)
      {
       JFrame frame= new  JFrame("数字转化中文");
       MyApp my =new MyApp();
       frame.getContentPane().add(my);
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);   frame.setSize(300,200);
       my.init();
       frame.show();
      }
    }