/**
 * Created by IntelliJ IDEA.
 * User: 厉明祥
 * Date: 2006-7-6
 * Time: 15:04:23
 * To change this template use File | Settings | File Templates.
 */import java.io.*;public class Trans_2 {   //单位
 private String[] bUnit; // 基本单位 十、百、千 private String[] sUnit; // 高级单位 万、亿 private int[] sUnitNum; // 高级单位 万、亿 位数 private String[] NumberStr; // 数字-中文对照 private boolean zeroSign; // 连续零 标识 void init() {
  NumberStr = new String[10];
  NumberStr[0] = "零";
  NumberStr[1] = "壹";
  NumberStr[2] = "贰";
  NumberStr[3] = "叁";
  NumberStr[4] = "肆";
  NumberStr[5] = "伍";
  NumberStr[6] = "陆";
  NumberStr[7] = "柒";
  NumberStr[8] = "捌";
  NumberStr[9] = "玖";  bUnit = new String[4];
  bUnit[0] = "";
  bUnit[1] = "拾";
  bUnit[2] = "佰";
  bUnit[3] = "仟";  sUnit = new String[2];
  sUnit[0] = "万";
  sUnit[1] = "亿";  sUnitNum = new int[2];
  sUnitNum[0] = 4;
  sUnitNum[1] = 8;  zeroSign = true;
 }
      //转换
 String multi(String NumStr) {
  String xNumber = "";
  String xSUnit = "";
  String tempNumber = "";  init();  int i = 0; // 位数计数器
  while (NumStr.length() > 0) {   if (NumStr.length() > 4) {
    tempNumber = NumStr.substring(NumStr.length() - 4);
    NumStr = NumStr.substring(0, NumStr.length() - 4);
   } else {
    tempNumber = NumStr;
    NumStr = "";
   }   xSUnit = "";
   for (int j = sUnitNum.length - 1; j >= 0 && i > 0; j--) {
    int y = i % sUnitNum[j];
    if (y == 0) {
     xSUnit = sUnit[j];
     j = -1;
    }
   }   for (int j = tempNumber.length() - 1; j >= 0; j--) {
    int x = Integer.parseInt(tempNumber.substring(j, j + 1));
    int y = (tempNumber.length() - j - 1) % 4;
    if (x != 0) {
     xNumber = xSUnit + xNumber;
     xNumber = bUnit[y] + xNumber;
     xNumber = NumberStr[x] + xNumber;
     zeroSign = false;
    } else {
     if (!zeroSign) {
      xNumber = xSUnit + NumberStr[x] + xNumber;
     } else if (xSUnit.length() > 0) {
      xNumber = xSUnit + xNumber;
     }
     zeroSign = true;
    }
    xSUnit = "";
   }   i = i + 4;
  }
  return xNumber;
 }
   //主方法程序入口  ;
 public static void main(String[] args) {try
{
   System.out.println("请输入要转换的数字:");   BufferedReader br = new BufferedReader(new InputStreamReader(
     System.in));
 
   String s = br.readLine();   Trans_2  m =   new Trans_2();
   System.out.print(s + " = " + m.multi(s));  }
catch (IOException e)
  {
      e.printStackTrace();
  }
 }
}
要求:在以上程序基础上修改程序,可以输入不超过18位长度的数字,输出中文读法

解决方案 »

  1.   

    改这里:        sUnit = new String[5];
            sUnit[0] = "万";
            sUnit[1] = "亿";
            sUnit[2] = "万";
            sUnit[3] = "亿";
            sUnit[4] = "万";        sUnitNum = new int[5];
            sUnitNum[0] = 4;
            sUnitNum[1] = 8;
            sUnitNum[2] = 12;
            sUnitNum[3] = 16;
            sUnitNum[4] = 20;
      

  2.   

    to 楼主:bbwls() 是我的马甲 不要给分  要给就给我这个 呵呵
      

  3.   

    OnlyFor_love(『不给我分 就剪掉楼主小鸡几』):
    太不厚道了吧,怎么不说上面的ID都是你的马甲,嘿嘿~
      

  4.   

    你要考虑两个知识点
    1、如何判断输入的字符串是由数字组成?
    2、长度控制为指定的长度
    修改后的程序如下:
    import java.io.*;
    public class test {
           //单位
         private String[] bUnit; // 基本单位 十、百、千     private String[] sUnit; // 高级单位 万、亿     private int[] sUnitNum; // 高级单位 万、亿 位数     private String[] NumberStr; // 数字-中文对照     private boolean zeroSign; // 连续零 标识     void init() {
          NumberStr = new String[10];
          NumberStr[0] = "零";
          NumberStr[1] = "壹";
          NumberStr[2] = "贰";
          NumberStr[3] = "叁";
          NumberStr[4] = "肆";
          NumberStr[5] = "伍";
          NumberStr[6] = "陆";
          NumberStr[7] = "柒";
          NumberStr[8] = "捌";
          NumberStr[9] = "玖";      bUnit = new String[4];
          bUnit[0] = "";
          bUnit[1] = "拾";
          bUnit[2] = "佰";
          bUnit[3] = "仟";      sUnit = new String[2];
          sUnit[0] = "万";
          sUnit[1] = "亿";      sUnitNum = new int[2];
          sUnitNum[0] = 4;
          sUnitNum[1] = 8;      zeroSign = true;
         }
              //转换
         String multi(String NumStr) {
          String xNumber = "";
          String xSUnit = "";
          String tempNumber = "";      init();      int i = 0; // 位数计数器
          while (NumStr.length() > 0) {       if (NumStr.length() > 4) {
            tempNumber = NumStr.substring(NumStr.length() - 4);
            NumStr = NumStr.substring(0, NumStr.length() - 4);
           } else {
            tempNumber = NumStr;
            NumStr = "";
           }       xSUnit = "";
           for (int j = sUnitNum.length - 1; j >= 0 && i > 0; j--) {
            int y = i % sUnitNum[j];
            if (y == 0) {
             xSUnit = sUnit[j];
             j = -1;
            }
           }       for (int j = tempNumber.length() - 1; j >= 0; j--) {
            int x = Integer.parseInt(tempNumber.substring(j, j + 1));
            int y = (tempNumber.length() - j - 1) % 4;
            if (x != 0) {
             xNumber = xSUnit + xNumber;
             xNumber = bUnit[y] + xNumber;
             xNumber = NumberStr[x] + xNumber;
             zeroSign = false;
            } else {
             if (!zeroSign) {
              xNumber = xSUnit + NumberStr[x] + xNumber;
             } else if (xSUnit.length() > 0) {
              xNumber = xSUnit + xNumber;
             }
             zeroSign = true;
            }
            xSUnit = "";
           }       i = i + 4;
          }
          return xNumber;
         } public boolean isNumber(String str){
    for (int i = 0; i < str.length(); i++){
    //System.out.println(str.charAt(i));
    if (!Character.isDigit(str.charAt(i))){
    return false;
    } else 
    return true;
    }
    return true;
    } public String getString(){
    try{
    System.out.println("请输入要转换的数字并且长度不能超过16位:");
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    String s = br.readLine();
    return s;
    }catch (IOException e){
    return "";
    }
    }
           //主方法程序入口  ;
    public static void main(String[] args) {
    test m =   new test();
    while(true){
    String s = m.getString();
    if(m.isNumber(s) && (s.length() <= 16) && !s.equals("")){
    System.out.println(s + " = " + m.multi(s));
    } else{
    System.out.println("请输入合法的数字");
    }
    }
    }
     }
      

  5.   

    我晕 上面的那个bbwls() 确实是我的马甲啊 我的马甲只用来攒可用分的。刚才看见楼主的问题然后急忙就来回答 结果发现是马甲 555555555
    不信的话 我马上换马甲上来澄清一切。 嘿嘿
      

  6.   

    to hbwhwang(catmiw的ID已经停用,现在用这个) ();看到了吧  我确实是马甲啊  ===================================楼主要给分的话就给我的OnlyFor_love(『不给我分 就剪掉楼主小鸡几』) 号 
    切记~切记
    呵呵 
      

  7.   

    TO OnlyFor_love(『不给我分 就剪掉楼主小鸡几』):
    > 我晕 上面的那个bbwls() 确实是我的马甲啊
    > 我的马甲只用来攒可用分的。攒可用分干嘛呀?你都两颗星星啦,还有那么多问题要问吗?!还要,兄弟小声点告诉我,别让别人听到,你搞那两颗小星星有什么秘诀没有啊?是因为你的 ID 还是因为你的马甲啊?……hehe, just kidding   ;P
      

  8.   

    to maquan('ma:kju):我以前是OnlyFor_love(【清水出芙蓉 天然去雕饰】)
    我的星星可是自己回答问题挣来的 绝对光明磊落。升星星需要的是专家分,我的马甲主要攒可用分,然后进行可用分捐赠,这样我的大号就可以用这些可用分来散分了啊
      

  9.   

    TO OnlyFor_love(【清水出芙蓉 天然去雕饰】)hehe, 不错不错,我相信芙蓉兄(可以这么称呼你吗?)是光明磊落的,相信看过你回帖的朋友都会和我一样的  :D说到“可用分捐赠”,CSDN 设计这个功能的初衷当然是好的,不过,要是有人搞个“机器人”来攒可用分,那 CSDN 岂不是要虚长很多人气,毕竟这里是“中国程序员的大本营”啊,hehe。其实我就动过这个念头,不知道 CSDN 有什么防范措施没有~~
      

  10.   

    哦!是斑竹大哥呀~~失敬失敬!原来大哥苦心孤诣地是给小兄弟们攒奖品哪,钦佩!“机器人”可以有分身术的哦,搞它 100 个 ID,呵呵,一天就能攒 1000 分!怎么样芙蓉兄,奖品不愁了吧?  ^O^跑题了,楼主见谅 :)
      

  11.   

    虽然跑题了,但话还没说完,楼主再次见谅 :)可用分捐赠当然不会影响专家分,但如果开个帖子,自己给自己结帖的话……这恐怕只能靠大家监督和斑竹检查了吧?我和芙蓉兄一样光明磊落(^D^),不屑做这种事,但我确实见过可疑的帖子,就在本版。一个提的莫名其妙的问题,100 分,然后紧跟着有一个不伦不类的回答,不知从哪儿 copy 来的,等我费好大劲敲了一堆字进去,自以为解释清楚了,结果提交上去,发现人家已经结帖了。郁闷哪  :(
      

  12.   

    见鬼了,都再说什么..
    楼主要的是不超过18位数字.. 实际的应用程序可没有限制..
    昏倒..
    ---------
    正题: 
    把   while (NumStr.length() > 0) 
    改:  while (NumStr.length() > 0 && NumStr.length()<=18)
      

  13.   

    hbwhwang(catmiw的ID已经停用,现在用这个) (
    改这里:        sUnit = new String[5];
            sUnit[0] = "万";
            sUnit[1] = "亿";
            sUnit[2] = "万";
            sUnit[3] = "亿";
            sUnit[4] = "万";        sUnitNum = new int[5];
            sUnitNum[0] = 4;
            sUnitNum[1] = 8;
            sUnitNum[2] = 12;
            sUnitNum[3] = 16;
            sUnitNum[4] = 20;
    ----------
    我想我笨了,看不出来改这个符合题目要求.
      

  14.   

    这样来:把   while (NumStr.length() > 0) 
    改:  while (NumStr.length() > 0 && NumStr.length()<=18)
      

  15.   

    加上类方法的确显示出技术,不过根据题目的意思,我觉得只是需要动一下位数就可以,也就是满足不超过18位就行,我的方法只是在主函数入口处加上简单的语句实现的,呵呵!
    public static void main(String[] args) {
      int sign=0;

    try
    {
    while(sign<=18){
       System.out.println("请输入要转换的数字:");

       BufferedReader br = new BufferedReader(new InputStreamReader(
         System.in));
     
       String s = br.readLine();
       sign=s.length();
    if(sign<18){
    Trans_2  m =   new Trans_2();
        System.out.println(s + " = " + m.multi(s));
        break;
    }
    else{
    System.out.println("您输入的长度超过18位,请输入18位的整数!");
    sign=0;
    }
    }


      }
    catch (IOException e)
      {
          e.printStackTrace();
      }
     }
      

  16.   

    难怪有人说csdn败类多
    分高你知识就一定高? 网络上还在意这个(白眼)无聊
      

  17.   

    package javaproject;import java.io.*;public class Trans_2 {
        public Trans_2() {
            init();
        }    //单位
        private String[] bUnit; // 基本单位 十、百、千
        private String[] sUnit; // 高级单位 万、亿
        private int[] sUnitNum; // 高级单位 万、亿 位数
        private String[] NumberStr; // 数字-中文对照
        private boolean zeroSign; // 连续零 标识
        void init() {
            NumberStr = new String[10];
            NumberStr[0] = "零";
            NumberStr[1] = "壹";
            NumberStr[2] = "贰";
            NumberStr[3] = "叁";
            NumberStr[4] = "肆";
            NumberStr[5] = "伍";
            NumberStr[6] = "陆";
            NumberStr[7] = "柒";
            NumberStr[8] = "捌";
            NumberStr[9] = "玖";
            bUnit = new String[4];
            bUnit[0] = "";
            bUnit[1] = "拾";
            bUnit[2] = "佰";
            bUnit[3] = "仟";
            sUnit = new String[3];
            sUnit[0] = "万";
            sUnit[1] = "亿";
            sUnit[2] = "兆";
            sUnitNum = new int[2];
            sUnitNum[0] = 4;
            sUnitNum[1] = 8;
        }    private int count = -1;
        public String convert(String oldStr) {
            String newStr = "";
            String tempStr = oldStr;
            String targetStr = "";
            while (tempStr != "") {
                if (tempStr.length() <= 4) {
                    count++;
                    targetStr = tempStr;
                    newStr = cellConvert(targetStr) + newStr;
                    tempStr = "";
                } else {
                    targetStr = tempStr.substring(tempStr.length() - 4);
                    tempStr = tempStr.substring(0, tempStr.length() - 4);
                    count++;
                    newStr = cellConvert(targetStr) + newStr;
                }
            }
            return newStr;
        }    private String cellConvert(String oldCellStr) {
            String newCellStr = ""; //转换后的oldCellStr
            String num = ""; //转换后的数字
            String bunit; //转换后的基础单位
            String sunit = ""; //转换后的高级单位
            int tempCount = count;
          
            for (int i = sUnit.length - 1; (tempCount != 0) && (i >= 0); i--) {
                tempCount %= Math.pow(2, i);
                sunit = sUnit[i];
            }
            int j = 0;
            for (int i = oldCellStr.length(); i > 0; i--) {
                try {
                    num = NumberStr[Integer.parseInt(oldCellStr.substring(i - 1, i))];
                } catch (NumberFormatException ex) {
                    System.out.println("xie cuo le!!!");
                } catch (ArrayIndexOutOfBoundsException ex) {
                    System.out.println("xie duo le!!!");
                }
                bunit = bUnit[j++];
                newCellStr = num + bunit + newCellStr;
            }
            return newCellStr + sunit;
        }
    }看的头好大  分了个函数出来  不好意思哈, 1234123412341234123412341234
    结果是
    壹仟贰佰叁拾肆亿壹仟贰佰叁拾肆万壹仟贰佰叁拾肆兆壹仟贰佰叁拾肆万壹仟贰佰叁拾肆亿壹仟贰佰叁拾肆万壹仟贰佰叁拾肆