某人写的,名字忘了,不好意思。public class Test2 {
  public Test2() {
  }  public static String replace(String strSource, String strFrom, String strTo) {
    String strDest = "";
    if (strSource == null || strSource.length() == 0) {
      return strDest;
    }
    else {
      int intFromLen = strFrom.length();
      int intPos;
      while ( (intPos = strSource.indexOf(strFrom)) != -1) {
        strDest = strDest + strSource.substring(0, intPos);
        strDest = strDest + strTo;
        strSource = strSource.substring(intPos + intFromLen);
      }
      strDest = strDest + strSource;
    }
    return strDest;
  }  private static String delOneSameChar(String str, char innerCh) {
    String rStr = "";
    String tempStr = str;
    StringBuffer sb = new StringBuffer(tempStr);
    char ch;
    boolean delCh = true;
    for (int i = 0; i < sb.length(); i++) {
      ch = sb.charAt(i);
      if (ch == innerCh && delCh) {
        sb.deleteCharAt(i);
        delCh = false;
      }
      else {
        if (ch == innerCh && !delCh)
          delCh = false;
        else
          delCh = true;
      }
    }
    rStr = sb.toString();
    return rStr;
  }  private static String lowerToUpper(String lower) throws Exception {
    if (lower.equals("1")) {
      return "壹";
    }
    if (lower.equals("2")) {
      return "贰";
    }
    if (lower.equals("3")) {
      return "叁";
    }
    if (lower.equals("4")) {
      return "肆";
    }
    if (lower.equals("5")) {
      return "伍";
    }
    if (lower.equals("6")) {
      return "陆";
    }
    if (lower.equals("7")) {
      return "柒";
    }
    if (lower.equals("8")) {
      return "捌";
    }
    if (lower.equals("9")) {
      return "玖";
    }
    if (lower.equals("0")) {
      return "零";
    }    throw new Exception("必须为数值");
  }  private static String getUnit4(String str4) throws Exception {
    if (str4.length() > 4)
      throw new Exception("数据长度必须小于等于4");
    String rStr = "";
    if (str4.equals("0000"))
      return "零";
    int str4Len = str4.length();
    int i = 0;
    while (str4Len > 0) {
      char ch = str4.charAt(i);
      String chStr = lowerToUpper("" + ch);
      switch (str4Len) {
        case 1:
          if (chStr.equals("零"))
            chStr = "";
          break;
        case 2:
          if (!chStr.equals("零"))
            chStr = chStr + "拾";
          break;
        case 3:
          if (!chStr.equals("零"))
            chStr = chStr + "佰";
          break;
        case 4:
          if (!chStr.equals("零"))
            chStr = chStr + "千";
          break;
      }
      rStr = rStr + chStr;
      str4Len--;
      i++;
    }
    return rStr;
  }  public static String toBig(String str) throws Exception {
    String rStr = "";
    String str4Upper = "";
    int dot = str.indexOf(".");
    String xiao = "";
    String zheng = "";
    if (dot != -1) {
      zheng = str.substring(0, dot);
      xiao = str.substring(dot + 1);
    }
    else {
      zheng = str;
      xiao = "";
    }
    int zhengLen = zheng.length();
    int phase = zhengLen / 4;
    if (zhengLen % 4 != 0)
      phase++;
    int i = 0;
    int endDot = zhengLen;
    int startDot = 0;
    int lastEndDot = -1;
    while (phase > 0) {
      if (lastEndDot != -1) {
        endDot = lastEndDot - 4;
        if (endDot < 0)
          endDot = 0;
      }
      else {
        endDot = phase * 4;
        if (endDot > zhengLen)
          endDot = zhengLen;
      }
      lastEndDot = endDot;
      startDot = endDot - 4;
      if (startDot < 0)
        startDot = 0;
      String str4 = zheng.substring(startDot, endDot);
      //System.out.println(str4);
      str4Upper = getUnit4(str4);
      int yi = i / 2;
      String wan = "";
      if (i % 2 == 1)
        wan = "万";
      String yiStr = "";
      while (yi > 0) {
        yiStr = yiStr + "亿";
        yi--;
      }
      yiStr = wan + yiStr;
      while (str4Upper.endsWith("零") && str4Upper.length() > 1) {
        str4Upper = str4Upper.substring(0, str4Upper.length() - 1);
      }
      if (!str4Upper.equals("零")) {
        str4Upper = str4Upper + yiStr;
      }
      //System.out.println(str4Upper);
      rStr = str4Upper + rStr;
      i++;
      phase--;
    }
    int xiaoLen = xiao.length();
    if (xiaoLen > 4)
      xiao = xiao.substring(0, 4);
    xiaoLen = xiao.length();
    String xiaoUpper = "";
    for (i = 0; i < xiaoLen; i++) {
      char ch = xiao.charAt(i);
      String chStr = lowerToUpper("" + ch);
      if (!chStr.equals("零"))
        switch (i) {
          case 0:
            chStr = chStr + "角";
            break;
          case 1:
            chStr = chStr + "分";
            break;
          case 2:
            chStr = chStr + "厘";
            break;
          case 3:
            chStr = chStr + "毫";
            break;
        }
      else
        chStr = "";
      xiaoUpper = xiaoUpper + chStr;
    }
    while (rStr.endsWith("零"))
      rStr = rStr.substring(0, rStr.length() - 1);
    while (rStr.startsWith("零"))
      rStr = rStr.substring(1, rStr.length());
    rStr = rStr + "元" + xiaoUpper;
    int lastYi = rStr.lastIndexOf("亿");    if (lastYi != -1) {
      String tempStr = rStr.substring(0, lastYi);
      String tempStr2 = rStr.substring(lastYi);
      while (tempStr.endsWith("亿")) {
        tempStr2 = "亿" + tempStr2;
        tempStr = rStr.substring(0, tempStr.length() - 1);
      }
      tempStr = delOneSameChar(tempStr, '亿');
      rStr = tempStr + tempStr2;
    }
    while (rStr.indexOf("零零") != -1)
      rStr = replace(rStr, "零零", "零");
    if (rStr.startsWith("元")) rStr = "零" + rStr;
    return rStr;
  }  public static void main(String[] args) {
    try {
      System.out.println(toBig("1005083100.45"));    }
    catch (Exception ex) {
      ex.printStackTrace();
    }
  }}

解决方案 »

  1.   

    这个程序写得也太恐怖了,完全可以写在一个字符串里的汉字被分到了那么多的"if"里s1 = "零壹贰叁肆伍陆柒捌玖"
    s2 = "拾佰仟万亿"
    s3 = "元角分"小数先不论;每4个数字分段,每个数字转换成相应的中文数字,如果有连续的零则忽略;这些段后再加"万"、"亿";没有小数就跟上"整",有小数再加上"角"、"分"
      

  2.   

    不用那么复杂,看我的:public final class Replace{

    public static String ChangeToBig(String CurrentNumber){   
    //输入CurrentNumber的数字格式为%*.**;
        String results=new String("¥");
    String temp = CurrentNumber;

        final String Units[]={"分","角","元","拾","佰","仟",   //单位
          "万","拾","佰","仟","亿","拾","佰","仟","兆","拾","佰","仟"};
          
          final String Numbers[]={"零","壹","贰","叁","肆","伍","陆","柒","捌","玖"}; //大写数
            
          java.lang.StringBuffer buf=new java.lang.StringBuffer(); //处理后的字符串
          
          char c;
          
          for(int i=0;i<temp.length();i++){  //去掉小数点
            c=temp.charAt(i);
            if(c!='.')
              buf.append(c);
          }
          
          for(int i=1;i<buf.length();i++){
            results+=Numbers[buf.charAt(i-1)-48];
            results+=Units[buf.length()-i];
          }
          return results;
      } 
    }
      

  3.   

    要一个适用各种情况的,通用的大写转换程序还是比较困难的.这个是我的,还不是很好,如果你有改进请发回给我一份 [email protected] java.text.DecimalFormat;
    public class CMoneyUtil {
      private static char[] big = {
        '亿', '仟', '佰', '拾', '兆', '万', '仟', '佰', '拾', '亿', '仟', '佰', '拾', '万', '仟',
        '佰', '拾', '元', '角', '分'
      };
      private static char[] num = { '零', '壹', '贰', '叁', '肆', '伍', '陆', '柒', '捌', '玖' };
      public final static int LONG = 1;
      public final static int INTEGER = 2;
      public final static int HUNMAN_READING = 4;
      public static String toCurrency(double value, int flag) {
        String ret = "";    if (value < 0.005) {
          ret = "数字太小,无法转换";
        } else {
          DecimalFormat df = new DecimalFormat("#.00");
          ret = df.format(value);      int index = ret.length();
          ret = ret.substring(0, index - 3) + ret.substring(index - 2);      char[] buf = ret.toCharArray();      int p = 0;      while (buf[p] == '0')
            p++;      char[] tmp = new char[buf.length - p];      for (int i = 0; p < buf.length; i++, p++)
            tmp[i] = buf[p];      buf = tmp;
          index = buf.length;      //      System.out.println(buf);
          StringBuffer sb = new StringBuffer(40);
          int off = big.length - index;      int uni = 0; // 持续为零标志
          for (int i = 0; i < index; i++,off ++) {
            int c = buf[i] - '0';        if (((flag & LONG) != 0) || (c != 0)) {
              if(c != 1 ){
                sb.append(num[c]);
                sb.append(big[off] );
              } else if ( (off == 3 )|| (off == 8 )|| (off == 12 )|| (off == 17 )){
                sb.append(big[off ]);
              } else {
                sb.append(num[c]);
                sb.append(big[off ]);
              }
              uni ++;
              if (( off == 4 ) || ( off == 9 ) || ( off == 13)) {
                uni = 0;
              }
              //               元           什么时候都会有该单位
            } else if ( off == 17 ) {
              sb.append(big[off ]);
              //               兆              亿               万
            } else if (( off == 4 ) || ( off == 9 ) || ( off == 13)) {
              if(uni > 0){
                sb.append(big[off]);
                if( (flag & HUNMAN_READING) != 0){
                  sb.append("零");
                }
              } else {
                if( (flag & HUNMAN_READING) != 0){
                  sb.append("零");
                }
              }
              uni = 0;
            }
          }      ret = sb.toString();
        }    return ret;
      }  public static String toCNumber(double value){
        String ret = "";      DecimalFormat df = new DecimalFormat();
          ret = df.format(value);      int index = ret.length();      char[] buf = ret.toCharArray();      int p = 0;      while (buf[p] == '0')
            p++;      char[] tmp = new char[buf.length - p];      for (int i = 0; p < buf.length; i++, p++)
            tmp[i] = buf[p];      buf = tmp;
          index = buf.length;      //      System.out.println(buf);
          StringBuffer sb = new StringBuffer(40);
          int off = big.length - index;      for (int i = 0; i < index; i++) {
            int c = buf[i] - '0';
            sb.append(num[c]);
            sb.append(big[off + i]);
          }      ret = sb.toString();
        return ret;
      }  private static char[] swapArray(char[] array) {
        int l = array.length;
        char[] ret = new char[l];    for (int i = 0; i < ret.length; i++) {
          ret[i] = array[l - i - 1];
        }    return ret;
      }  public static void test3(){
         System.out.println(CMoneyUtil.toCNumber(0));    // 零
         System.out.println(CMoneyUtil.toCNumber(0.1));  // 零点壹
         System.out.println(CMoneyUtil.toCNumber(0.02)); // 零点零贰
         System.out.println(CMoneyUtil.toCNumber(430));  // 肆佰叁拾
         System.out.println(CMoneyUtil.toCNumber(9503)); // 玖仟伍佰零叁
         System.out.println(CMoneyUtil.toCNumber(10503)); // 壹万零伍佰零叁
         System.out.println(CMoneyUtil.toCNumber(60003)); // 陆万零叁
         System.out.println(CMoneyUtil.toCNumber(20.2));  // 贰拾点贰
         System.out.println(CMoneyUtil.toCNumber(123456789.123456789)); // 壹亿贰仟叁佰肆拾伍万陆仟柒佰捌拾玖点壹贰叁肆伍陆柒捌玖7
      }
      public static void test1() {
        System.out.println(CMoneyUtil.toCurrency(0, 1));
        System.out.println(CMoneyUtil.toCurrency(0.001, 1));
        System.out.println(CMoneyUtil.toCurrency(0.1, 1));
        System.out.println(CMoneyUtil.toCurrency(0.02, 1));
        System.out.println(CMoneyUtil.toCurrency(2, 1));
        System.out.println(CMoneyUtil.toCurrency(3.1, 1));
        System.out.println(CMoneyUtil.toCurrency(224, 1));
        System.out.println(CMoneyUtil.toCurrency(2230.63, 1));
        System.out.println(CMoneyUtil.toCurrency(223.636, 1));
        System.out.println(CMoneyUtil.toCurrency(223.634, 1));
      }  public static void test2() {
        System.out.println(CMoneyUtil.toCurrency(0, 2));
        System.out.println(CMoneyUtil.toCurrency(0.001, 2));
        System.out.println(CMoneyUtil.toCurrency(0.1, 2));
        System.out.println(CMoneyUtil.toCurrency(0.02, 2));
        System.out.println(CMoneyUtil.toCurrency(2, 2));
        System.out.println(CMoneyUtil.toCurrency(3.1, 2));
        System.out.println(CMoneyUtil.toCurrency(4.07, 2));
        System.out.println(CMoneyUtil.toCurrency(500, 2));
        System.out.println(CMoneyUtil.toCurrency(224, 2));
        System.out.println(CMoneyUtil.toCurrency(2230.63, 2));
        System.out.println(CMoneyUtil.toCurrency(223.636, 2));
        System.out.println(CMoneyUtil.toCurrency(223.634, 2));
        System.out.println(CMoneyUtil.toCurrency(1201223.634, 2));
        System.out.println(CMoneyUtil.toCurrency(2000001223.634, 2));
        System.out.println(CMoneyUtil.toCurrency(Double.parseDouble("60000000101223.634"), HUNMAN_READING));
      }  public static void main(String[] argv) {
        test2();    //    System.out.println((int)'0');
        //    System.out.println((int)'9');
      }
    }
      

  4.   

    我也有一个,可以到很多位,我自己测试了一下,没有问题。
    /**
     * <p>Title: </p>
     * <p>Description: 用于将阿拉伯数字转化成中文汉字</p>
     * <p>Copyright: Copyright (c) 2003</p>
     * <p>Company: </p>
     * @author 
     * @version 1.0
     */public class ArabiaNumChineseNum {
      public static String[] CHINANUMBER = {"零", "壹", "贰", "叁", "肆",
                                             "伍", "陆", "柒", "捌", "玖",};
      public static String CHINATEM = "拾";
      public static String CHINAHUNDRED = "佰";
      public static String CHINAKILO = "仟";
      public static String CHINATEMKILO = "万";
      public static String CHINAHUNDREDMILLION = "亿"; //为最大
      public static String[] CHINAREPEATUNIT = {"", "拾", "佰", "仟", };  public static String CHINAUNIT = "圆";
      public static String CHINATENCENTUNIT = "角";
      public static String CHINACENTUNIT = "分";  public static String CHINAFULL = "整";  public ArabiaNumChineseNum() {
      }
      public static String getChineseNum(String arabiaNum) {
        if (arabiaNum == null || arabiaNum.equals("")) {
          return "";
        }
        String strArabiaNum = arabiaNum;
        String strChineseNum = "";
        double douChineseNum;    try {
          douChineseNum = Double.parseDouble(strArabiaNum);
        }
        catch(NumberFormatException nfe) {
          //传入的值可能不是数字
          throw new NumberFormatException("arabiaNum 过大或非法格式!");
        }
        boolean pointFlag = false;
        int pointPosition = strArabiaNum.indexOf(".");
        if (pointPosition != -1) {
          //如果存在小数点,置点标志true
          pointFlag = true;
        }
        else if (pointPosition == strArabiaNum.length() - 1) {
          //如果小数点是最后一位则把最后的点去掉,也可以看为整数, ex:9089.
          pointFlag = true;
          strArabiaNum = strArabiaNum.substring(0, strArabiaNum.length() - 1);  //最后的小数点去掉了,长度自然要减一
        }
        for (int i = 0; i < strArabiaNum.length(); i ++) {
          //用于判断第一个或前几个都是 "0" 的情况,  如: 004567
          if (strArabiaNum.indexOf("0") == 0) {
            strArabiaNum.substring(1, strArabiaNum.length());
          }
        }    if (!pointFlag) {
          //不带小数点的数
          strChineseNum = getDealedString(strArabiaNum);
        }
        else {
          //带小数点的数
          String strInteger = strArabiaNum.substring(0, strArabiaNum.indexOf("."));
          String strDecimal = strArabiaNum.substring(strArabiaNum.indexOf(".") + 1, strArabiaNum.length());
          String strResultInteger = getDealedString(strInteger); //有可能为空,比如   0.12
          String strResultDecimal = "";
    //      strChineseNum =
          if (strDecimal.length() > 2) {
            //只考虑角和分
            strDecimal = strDecimal.substring(0, 2);
          }
          int decimalCount = strDecimal.length();
          if (decimalCount == 0) {
            strChineseNum = strResultInteger + CHINAUNIT + CHINAFULL;
          }
          else if (decimalCount == 1) {
    //        strResultDecimal = strDecimal.substring(0, 1);
            strResultDecimal = CHINANUMBER[Integer.parseInt(strDecimal)] + CHINATENCENTUNIT
                             + CHINANUMBER[0] + CHINACENTUNIT;
            strChineseNum = strResultInteger + CHINAUNIT + strResultDecimal;
    //???????????????????????????????
          }
          else {
            //两个
            strResultDecimal = CHINANUMBER[Integer.parseInt(strDecimal.substring(0, 1))] + CHINATENCENTUNIT
                             + CHINANUMBER[Integer.parseInt(strDecimal.substring(1, 2))] + CHINACENTUNIT;
            strChineseNum = strResultInteger + CHINAUNIT + strResultDecimal;
          }    }    if (!pointFlag) {
          return strChineseNum + CHINAUNIT + CHINAFULL;
        }
        else {
          return strChineseNum;
        }
      }
      protected static String getDealedString(String strArabiaNum) {
        String strChineseNum = ""; //返回值
        boolean lastZeroFlag = true;
        boolean frontZeroFlag = false;
        for (int j = strArabiaNum.length(); j > 0 ; j --) {
          int intSingleNumber;
          String strSingleNumber = strArabiaNum.substring(j - 1, j);
          intSingleNumber = Integer.parseInt(strSingleNumber);
          if (!lastZeroFlag) {
            //如果不是一个为零的,且它的后面也都为零
            if (intSingleNumber == 0) {
              if (frontZeroFlag) {
                //有可能前面一个已经为零了,后面一个不用了
                strChineseNum = getUnitByDigit(strArabiaNum.length() - j) + strChineseNum;;
              }
              else {
                strChineseNum = CHINANUMBER[intSingleNumber] + strChineseNum;
              }
              frontZeroFlag = true;
            }
            else {
              strChineseNum = CHINANUMBER[intSingleNumber] + getUnitByDigit(strArabiaNum.length() - j) + strChineseNum;
              frontZeroFlag = false;
            }
          }
          else {
            if (intSingleNumber != 0) {
              lastZeroFlag = false;
              strChineseNum = CHINANUMBER[intSingleNumber] + getUnitByDigit(strArabiaNum.length() - j) + strChineseNum;
              frontZeroFlag = false;
            }
            else {
              frontZeroFlag = true;
            }      }
        }
        return strChineseNum;  }
      /**
       * 由位数生成单位  如:2 百;  3 仟;  6 拾万
       * @param digit 位数
       * @return
       */
      protected static String getUnitByDigit(int digit) {
        String returnUnit = "";
        int INTERVAL = 4;  //代表以四位位一组
        //如:  AAAA,(亿亿)AAAA,(万亿)AAAA,(亿)AAAA,(万),AAAA
        int again = digit / INTERVAL;
        int againResult = digit % INTERVAL;
        if (digit == 0) {
          return "";
        }
        if (againResult != 0) {
          return CHINAREPEATUNIT[againResult];
        }
        int residual = again % 2;
        int result = again / 2;    if (residual == 1) {
          for (int i = 0; i < result; i ++) {
            returnUnit += "亿";
          }
          returnUnit = "万" + returnUnit;
        }
        else {
          for (int i = 0; i < result; i ++) {
            returnUnit += "亿";
          }
        }    return returnUnit;
      }  public static void main(String args[]) {
        System.out.println("980078654300800-----" + ArabiaNumChineseNum.getChineseNum("980078654300800"));
    //    System.out.println("abcd".indexOf("a"));
      }
    }
      

  5.   

    to youthy_yy:
    经测试,得出的大写格式不符合会计格式,如
    错误格式:贰佰零拾零兆叁仟零佰零拾伍亿肆仟零佰零拾柒万捌仟伍佰零拾零元伍角
    正确格式:贰佰兆叁仟零伍亿肆仟零柒万捌仟伍佰元伍角零分