本帖最后由 w5644266 于 2009-09-21 17:10:07 编辑

解决方案 »

  1.   

    大写的汉字应该就10个数字+5个级别=15个吧定义好然后replace好了
      

  2.   

    万亿一般念“兆”:import java.math.BigDecimal;
    import java.math.BigInteger;/**
     * 将金额转换为人民币大写的工具类。
     */
    public final class RMBChineseNumerals {  /**
       * 数字
       */
      private static final char[] DIGITS = new char[] {
          '零', '壹', '贰', '叁', '肆', '伍', '陆', '柒', '捌', '玖'
      };  /**
       * 单位1
       */
      private static final String[] PREFIX = new String[] {
          "", "拾", "佰", "仟"
      };  /**
       * 单位2
       */
      private static final String[] UNITS = new String[] {
          "", "萬", "亿", "兆", "京"
      };  /**
       * 小数单位
       */
      private static final String FRACTIONAL_UNITS = "角分厘毫";  /**
       * 不需要实例化。
       */
      private RMBChineseNumerals() {
      }  /**
       * 将人民币金额转换为大写。
       * 
       * @param amount
       *          金额
       * @return 大写
       */
      public static final String toChineseNumerals(BigDecimal amount) {
        if (amount == null) {
          return "";
        }    // 确定正负数
        switch (amount.signum()) {
          case -1:
            return "负" + toChineseNumerals(amount.abs());
          case 0:
            return "零圆";
          default:
        }    // 小数部分超过支持的小数位数,需要四舍五入
        if (amount.scale() > FRACTIONAL_UNITS.length()) {
          amount = amount.setScale(FRACTIONAL_UNITS.length(),
                                   BigDecimal.ROUND_HALF_UP);
        }    // 字符串缓冲
        StringBuilder buff = new StringBuilder(amount.precision() * 2 + 5);    /* -------------------- 整数部分 -------------------- */    // 整数
        BigInteger integer = amount.toBigInteger();
        // 整数文字
        String intText = integer.toString();
        // 整数长度
        int intLength = intText.length();    // 刚才输出的是否是0
        boolean lastZero = true;
        String lastNonZeroUnit = null;
        for (int i = 0; i < intLength; i++) {
          // 位数(个位为0,十位为1)
          int pos = intLength - i - 1;
          // 数字
          int digit = intText.charAt(i) - '0';
          // 数字名称
          char digitName = DIGITS[digit];
          // 前缀
          String prefix = PREFIX[pos % PREFIX.length];
          // 进位
          int step = pos / PREFIX.length;
          // 单位
          String unit = UNITS[step];      if (digit == 0) {
            if (!lastZero) {
              buff.append(digitName);
            }
            lastZero = true;
          } else {
            if (!(digit == 1 && "拾".equals(prefix))) {
              buff.append(digitName);
            }
            buff.append(prefix);
            lastNonZeroUnit = unit;
            lastZero = false;
          }      if (pos % PREFIX.length == 0 && unit.equals(lastNonZeroUnit)) {
            if (lastZero) {
              buff.deleteCharAt(buff.length() - 1);
              lastZero = false;
            }
            buff.append(unit);
          }
        }    if (buff.length() > 0) {
          if (buff.charAt(buff.length() - 1) == '零') {
            buff.deleteCharAt(buff.length() - 1);
          }      buff.append("圆");
        }    /* -------------------- 小数部分 -------------------- */    // 小数部分,去除多余的零
        BigDecimal fraction = amount.subtract(new BigDecimal(integer));
        // 小数文字
        String fracText = fraction.toString().replaceFirst("0.", "");    lastZero = false;
        for (int i = 0; i < fracText.length(); i++) {
          // 数字
          int digit = fracText.charAt(i) - '0';
          if (digit == 0 && lastZero) {
            continue;
          }
          // 数字名称
          char digitName = DIGITS[digit];
          // 单位
          char unit = FRACTIONAL_UNITS.charAt(i);      if (digit != 0) {
            if (lastZero) {
              buff.append("零");
            }
            buff.append(digitName).append(unit);
          }      lastZero = digit == 0;
        }    return buff.toString().replaceFirst("^零", "");
      }
    }
      

  3.   

    小数部分不精确,我拿了一个值做了下测试:toChineseNumerals(new BigDecimal(1000000052622525.1)),结果小数部分显示的是125
      

  4.   

    问题解决了,new BigDecimal("1000000052622525.1"),换个构造函数就可以了...
      

  5.   


    import java.util.*;
    import java.util.regex.*;class CurrencyUtil { public static Pattern CURRENCY = Pattern
    .compile("^(\\d{1,13}+)(.\\d{1,2}+)?+$"); private static String[] DECIMAL = { "角", "分" };
    private static String[] UNIT = { "元", "拾", "佰", "仟", "万", "亿" };
    private static String[] DIGIT = { "零", "壹", "贰", "叁", "肆", "伍", "陆", "柒",
    "捌", "玖" }; private static String formatNote(long n) {
    if (n == 0L) {
    return "";
    } int i = 0;
    StringBuilder sb = new StringBuilder(); while (n != 0L) {
    if (n % 10L != 0) {
    switch (i) {
    case 0:
    case 1:
    case 2:
    case 3:
    case 4:
    case 5:
    case 6:
    case 7:
    case 8:
    case 9:
    case 10:
    case 11:
    case 12:
    case 13:
    if (i == 8 && sb.length() > 0
    && contain(UNIT, String.valueOf(sb.charAt(0)))) {
    sb.replace(0, 1, UNIT[5]);
    } else {
    sb.insert(0, UNIT[i == 8 ? 5 : i > 8 ? i - 8
    : i > 4 ? i - 4 : i]);
    }
    i++;
    }
    sb.insert(0, DIGIT[(int) (n % 10L)]);
    } else {
    if (sb.length() > 0
    && !contain(UNIT, String.valueOf(sb.charAt(0)))
    && sb.indexOf(DIGIT[0]) != 0) {
    sb.insert(0, DIGIT[0]);
    }
    if (i == 4) {
    sb.insert(0, UNIT[4]);
    }
    if (i == 8 && contain(UNIT, String.valueOf(sb.charAt(0)))) {
    sb.replace(0, 1, UNIT[5]);
    } else if (i == 8) {
    sb.insert(0, UNIT[5]);
    }
    i++;
    }
    n = n / 10L;
    }
    if (!UNIT[0].equals(String.valueOf(sb.charAt(sb.length() - 1)))) {
    sb.append(UNIT[0]);
    } return sb.toString();
    } private static String formatChange(String str) {
    if (str == null || str.equals("")) {
    return "";
    } StringBuilder sb = new StringBuilder(str);
    int length = sb.length();
    int jiao = sb.charAt(0) - '0';
    int fen = -1; sb.replace(0, 1, DIGIT[jiao]); if (length > 1) {
    fen = sb.charAt(1) - '0';
    sb.replace(1, 2, DIGIT[fen]);
    sb.insert(1, DECIMAL[0]);
    sb.append(DECIMAL[1]);
    } else {
    sb.append(DECIMAL[0]);
    } return sb.toString();
    } private static boolean contain(String[] arr, String str) {
    if (str == null || arr == null || arr.length == 0) {
    return false;
    }
    for (String s : arr) {
    if (str.equals(s)) {
    return true;
    }
    }
    return false;
    } public static String format(String money) {
    if (money == null) {
    return null;
    }
    if (!CURRENCY.matcher(money).matches()) {
    return money + " 并非正确的货币格式,抑或是其长度超过了可接受的范围";
    }
    String result = null;
    int dotIndex = money.indexOf(".");
    if (dotIndex != -1) {
    String note = money.substring(0, dotIndex);
    String change = money.substring(dotIndex + 1);
    result = formatNote(Long.parseLong(note)) + formatChange(change);
    } else {
    result = formatNote(Long.parseLong(money));
    }
    return result;
    } public static void main(String[] args) {
    System.out.println(CurrencyUtil.format("1")); // 壹元
    System.out.println(CurrencyUtil.format("12")); // 壹拾贰元
    System.out.println(CurrencyUtil.format("123")); // 壹佰贰拾叁元
    System.out.println(CurrencyUtil.format("1234")); // 壹仟贰佰叁拾肆元
    System.out.println(CurrencyUtil.format("12345")); // 壹万贰仟叁佰肆拾伍元
    System.out.println(CurrencyUtil.format("123456")); // 壹拾贰万叁仟肆佰伍拾陆元
    System.out.println(CurrencyUtil.format("1234567")); // 壹佰贰拾叁万肆仟伍佰陆拾柒元
    System.out.println(CurrencyUtil.format("12345678")); // 壹仟贰佰叁拾肆万伍仟陆佰柒拾捌元
    System.out.println(CurrencyUtil.format("123456789")); // 壹亿贰仟叁佰肆拾伍万陆仟柒佰捌拾玖元
    System.out.println(CurrencyUtil.format("1023456789")); // 壹拾亿零贰仟叁佰肆拾伍万陆仟柒佰捌拾玖元
    System.out.println(CurrencyUtil.format("10023456789")); // 壹佰亿零贰仟叁佰肆拾伍万陆仟柒佰捌拾玖元
    System.out.println(CurrencyUtil.format("100023456789")); // 壹仟亿零贰仟叁佰肆拾伍万陆仟柒佰捌拾玖元
    System.out.println(CurrencyUtil.format("1000023456789.12")); // 壹万亿零贰仟叁佰肆拾伍万陆仟柒佰捌拾玖元壹角贰分
    }
    }
    欢迎访问我的空间,希望多提宝贵意见
    http://user.qzone.qq.com/1037849661?ptlang=2052
      

  6.   


    这是我的TestCase
      public final void testToChineseNumerals() {
        assertEquals("零圆", toChineseNumerals(BigDecimal.valueOf(0)));
        assertEquals("壹仟圆", toChineseNumerals(BigDecimal.valueOf(1000)));
        assertEquals("壹仟零肆拾捌圆", toChineseNumerals(BigDecimal.valueOf(1048)));
        assertEquals("壹仟壹佰零捌圆", toChineseNumerals(BigDecimal.valueOf(1108)));
        assertEquals("壹萬圆", toChineseNumerals(BigDecimal.valueOf(10000)));
        assertEquals("壹萬零壹圆", toChineseNumerals(BigDecimal.valueOf(10001)));
        assertEquals("玖佰玖拾玖萬玖仟玖佰玖拾玖圆", toChineseNumerals(BigDecimal
            .valueOf(9999999)));
        assertEquals("玖亿零玖佰零玖萬零玖佰零玖圆", toChineseNumerals(BigDecimal
            .valueOf(909090909)));
        assertEquals("叁佰零肆亿零伍佰零陆萬零柒佰捌拾玖圆", toChineseNumerals(BigDecimal
            .valueOf(30405060789L)));
        assertEquals("壹亿贰仟叁佰肆拾伍萬陆仟柒佰捌拾玖圆", toChineseNumerals(BigDecimal
            .valueOf(123456789)));
        assertEquals("拾贰亿叁仟肆佰伍拾陆萬柒仟捌佰玖拾圆", toChineseNumerals(BigDecimal
            .valueOf(1234567890)));
        assertEquals("拾亿零肆佰伍拾陆萬柒仟捌佰玖拾圆", toChineseNumerals(BigDecimal
            .valueOf(1004567890)));
        assertEquals("拾亿零肆佰伍拾萬柒仟捌佰玖拾圆", toChineseNumerals(BigDecimal
            .valueOf(1004507890)));
        assertEquals("叁仟肆佰拾亿零肆佰萬零玖拾圆", toChineseNumerals(BigDecimal
            .valueOf(341004000090L)));
        assertEquals("叁仟肆佰拾亿零肆佰伍拾萬柒仟捌佰玖拾圆", toChineseNumerals(BigDecimal
            .valueOf(341004507890L)));
        assertEquals("拾亿零柒仟捌佰玖拾圆",
                     toChineseNumerals(BigDecimal.valueOf(1000007890)));
        assertEquals("负拾贰亿叁仟肆佰伍拾陆萬柒仟捌佰玖拾圆", toChineseNumerals(BigDecimal
            .valueOf(-1234567890)));
        assertEquals("负拾亿零肆佰伍拾萬柒仟捌佰玖拾圆", toChineseNumerals(BigDecimal
            .valueOf(-1004507890)));    assertEquals("壹圆零伍分", toChineseNumerals(new BigDecimal("1.05")));
        assertEquals("伍分", toChineseNumerals(new BigDecimal("0.05")));
        assertEquals("伍角", toChineseNumerals(new BigDecimal("0.5")));
        assertEquals("伍角", toChineseNumerals(new BigDecimal("0.500")));
        assertEquals("伍角零肆毫", toChineseNumerals(new BigDecimal("0.5004")));
        assertEquals("伍角肆分叁厘", toChineseNumerals(new BigDecimal("0.543")));
        assertEquals("壹圆伍角", toChineseNumerals(new BigDecimal("1.5")));
        assertEquals("壹圆伍角", toChineseNumerals(new BigDecimal("1.500")));
        assertEquals("壹圆伍角肆分叁厘", toChineseNumerals(new BigDecimal("1.543")));
        assertEquals("玖佰玖拾玖萬玖仟玖佰玖拾玖圆玖角玖分玖厘玖毫", toChineseNumerals(new BigDecimal(
            "9999999.9999")));
        assertEquals("玖佰玖拾玖萬玖仟玖佰玖拾玖圆玖角玖分玖厘玖毫", toChineseNumerals(new BigDecimal(
            "9999999.99991")));
        assertEquals("壹仟萬圆", toChineseNumerals(new BigDecimal("9999999.99999")));
        assertEquals("负壹仟萬圆", toChineseNumerals(new BigDecimal("-9999999.99999")));
      }
      

  7.   

    我想上面的代码应该是你较早的作品吧...一个方法就搞定了.貌似有些东西是可以抽取的哦...
    非常高兴CSDN上有一群你们这样的人,谢谢你们的不吝赐教.
      

  8.   


     public final void testToChineseNumerals() {
        assertEquals("零圆", toChineseNumerals(BigDecimal.valueOf(0)));
        assertEquals("壹仟圆", toChineseNumerals(BigDecimal.valueOf(1000)));
        assertEquals("壹仟零肆拾捌圆", toChineseNumerals(BigDecimal.valueOf(1048)));
        assertEquals("壹仟壹佰零捌圆", toChineseNumerals(BigDecimal.valueOf(1108)));
        assertEquals("壹萬圆", toChineseNumerals(BigDecimal.valueOf(10000)));
        assertEquals("壹萬零壹圆", toChineseNumerals(BigDecimal.valueOf(10001)));
        assertEquals("玖佰玖拾玖萬玖仟玖佰玖拾玖圆", toChineseNumerals(BigDecimal
            .valueOf(9999999)));
        assertEquals("玖亿零玖佰零玖萬零玖佰零玖圆", toChineseNumerals(BigDecimal
            .valueOf(909090909)));
        assertEquals("叁佰零肆亿零伍佰零陆萬零柒佰捌拾玖圆", toChineseNumerals(BigDecimal
            .valueOf(30405060789L)));
        assertEquals("壹亿贰仟叁佰肆拾伍萬陆仟柒佰捌拾玖圆", toChineseNumerals(BigDecimal
            .valueOf(123456789)));
        assertEquals("拾贰亿叁仟肆佰伍拾陆萬柒仟捌佰玖拾圆", toChineseNumerals(BigDecimal
            .valueOf(1234567890)));
        assertEquals("拾亿零肆佰伍拾陆萬柒仟捌佰玖拾圆", toChineseNumerals(BigDecimal
            .valueOf(1004567890)));
        assertEquals("拾亿零肆佰伍拾萬柒仟捌佰玖拾圆", toChineseNumerals(BigDecimal
            .valueOf(1004507890)));
        assertEquals("叁仟肆佰拾亿零肆佰萬零玖拾圆", toChineseNumerals(BigDecimal
            .valueOf(341004000090L)));
        assertEquals("叁仟肆佰拾亿零肆佰伍拾萬柒仟捌佰玖拾圆", toChineseNumerals(BigDecimal
            .valueOf(341004507890L)));
        assertEquals("拾亿零柒仟捌佰玖拾圆",
                     toChineseNumerals(BigDecimal.valueOf(1000007890)));
        assertEquals("负拾贰亿叁仟肆佰伍拾陆萬柒仟捌佰玖拾圆", toChineseNumerals(BigDecimal
            .valueOf(-1234567890)));
        assertEquals("负拾亿零肆佰伍拾萬柒仟捌佰玖拾圆", toChineseNumerals(BigDecimal
            .valueOf(-1004507890)));    assertEquals("壹圆零伍分", toChineseNumerals(new BigDecimal("1.05")));
        assertEquals("伍分", toChineseNumerals(new BigDecimal("0.05")));
        assertEquals("伍角", toChineseNumerals(new BigDecimal("0.5")));
        assertEquals("伍角", toChineseNumerals(new BigDecimal("0.500")));
        assertEquals("伍角零肆毫", toChineseNumerals(new BigDecimal("0.5004")));
        assertEquals("伍角肆分叁厘", toChineseNumerals(new BigDecimal("0.543")));
        assertEquals("壹圆伍角", toChineseNumerals(new BigDecimal("1.5")));
        assertEquals("壹圆伍角", toChineseNumerals(new BigDecimal("1.500")));
        assertEquals("壹圆伍角肆分叁厘", toChineseNumerals(new BigDecimal("1.543")));
        assertEquals("玖佰玖拾玖萬玖仟玖佰玖拾玖圆玖角玖分玖厘玖毫", toChineseNumerals(new BigDecimal(
            "9999999.9999")));
        assertEquals("玖佰玖拾玖萬玖仟玖佰玖拾玖圆玖角玖分玖厘玖毫", toChineseNumerals(new BigDecimal(
            "9999999.99991")));
        assertEquals("壹仟萬圆", toChineseNumerals(new BigDecimal("9999999.99999")));
        assertEquals("负壹仟萬圆", toChineseNumerals(new BigDecimal("-9999999.99999")));
      }