我是把1008转成一仟零八.1008变成壹零零捌那也太简单了/**
 * 功能:数字 变成 汉字
 *       汉字 变成 数字
 * -----------------------------------
 * 说明: 只能处理1000亿范围内的数据.
 *        小数点后面最多保留9位
 * -----------------------------------
 * 如:
 *    123          变成 零佰贰拾叁
 *    零佰贰拾叁   变成 123
 *
 * 需求分析:
 * ====================
 *    数字到汉字
 * ====================
 *       数字的组成部分: 1: 符号位: 取值范围 {"正","负"}
 *                        2: 整数部分
 *                        3: 小数部分
 *                        4: 整数部分和小数部分之间的分割符号"."
 *       A:符号位影射到汉字比较简单  “+”----"正"
 *                                    "-" ----"负"
 *       B:分割符号"."的影射是最简单的了 "." ---"点"
 *       C:小数部分的影射也很简单,直接"翻译"
 *               .234  ---点贰叁肆.
 *       D:整数部分的影射复杂点.
 *       整数部分的”翻译“之所以复杂是因为除了要将数字影射到对应的汉字,还
 *       要添加一些"修饰词"(我把拾,佰,仟,万,亿称做修饰词).
 *       如: 1234123421
 *       对应汉字: 1拾2亿3仟4佰1拾2万3仟4佰2拾1.(输汉字好麻烦,所以我没有将
 *                  数字”翻译“过来.
 *       如果你仔细分析一下,你会发现,这样的翻译工作很简单.
 *       请从 ”1拾2亿3仟4佰1拾2万3仟4佰2拾1“取出全部修饰符(依次从左往右取)
 *       你会发现取出来的修饰符号,会很有规律,看上去一定是这个样子:
 *       拾,佰,仟,万,拾,佰,仟,亿,拾,佰,仟
 *        实现很简单,请看源代码.
 * ---------------------------------------------------------------------------
 * ====================
 *    汉字到数字
 * ====================
 *       现在发现这样的处理没有什么实际意义。所以我就不写了.
 * ---------------------------------------------------------------------
 * @version 1.00
 * @author huangyh
 * @email  [email protected]
 * @date   2002.10.11
 */
package com.cxlife.convert;
public class Convert {  private final static String[] a_strNumber = {"零","壹","贰","叁","肆",
                                               "伍","陆","柒","捌","玖"};
  private final static String[] a_strModify = {"","拾","佰","仟",
                                               "万","拾","佰","仟",
                                               "亿","拾","佰","仟"};  private final static String strSign = "负";//实际上”+“号永远都不可能出现.  private final static String strDot = "点";  /**
   * 功能: 提取符号位.
   * 说明: 如果输入参数是 "-13.3",调用该函数的返回值是 "负";
   *        如果输入参数是 "13.3", 调用该函数的返回值是  ""(空值).
   * @param pValue
   *
   */
  static private String getSign(String pValue){
     return pValue.indexOf("-") == 0 ? "负" : "";
  }  /**
   * 功能:返回小数部分的汉字
   * 说明:如果输入数据是 12.35,调用该函数返回值是 叁伍
   *
   * @param pValue
   * @return
   */
 static private String getFraction(String pValue){
    String strFraction = null;//用来保存小数部分的数字串
    int intDotPos = pValue.indexOf(".");
    if (intDotPos ==  -1)//没有小数部分.
      return "";
    strFraction = pValue.substring(intDotPos +1);
    StringBuffer sbResult = new StringBuffer(strFraction.length());
    //开始翻译.
    for(int i=0; i<strFraction.length(); i++)
      sbResult.append(a_strNumber[strFraction.charAt(i) - 48]);
    return sbResult.toString();
  }  /*
   * 功能: 返回整数部分的汉字.
   * 如果输入参数是: 234.3,调用该函数的返回值是 贰佰叁拾肆.
   * @param pValue
   * @return
   */
  static private String getInteger(String pValue){
    String strInteger = null;//用来保存整数部分数字串
    int intDotPos = pValue.indexOf(".");//记录"."所在位置
    int intSignPos = pValue.indexOf("-");
    if (intDotPos == -1 )
      intDotPos = pValue.length();    strInteger = pValue.substring(intSignPos+1, intDotPos);    //反转整数部分数据
    strInteger = new StringBuffer(strInteger).reverse().toString();
   //-----------------------------------------------------------
    //开始翻译:
    StringBuffer sbResult = new StringBuffer();
    for(int i=0; i<strInteger.length(); i++) {
      sbResult.append(a_strModify[i]);
      sbResult.append(a_strNumber[strInteger.charAt(i) - 48]);
    }    sbResult = sbResult.reverse();
    //这个时候得到的结果不标准,需要调整.
    //203返回值是 贰佰零拾三个 正确答案是 贰佰零三    //--------------------------------------------------------------------------
    //串调整.
    replace(sbResult,"零拾","零");
    replace(sbResult,"零佰","零");
    replace(sbResult,"零仟","零");
    replace(sbResult,"零万","万");
    replace(sbResult,"零亿","亿");
    //多个”零“调整处理
    replace(sbResult,"零零","零");
    replace(sbResult,"零零零","零");
    replace(sbResult,"零零零零万","");//这两句不能颠倒顺序
    replace(sbResult,"零零零零","");    replace(sbResult,"壹拾亿","拾亿");//这样读起来更习惯.
    replace(sbResult,"壹拾万","拾万");    //--------------------------------------------------------------------------    if (sbResult.charAt(sbResult.length()-1) == '零'&&
        sbResult.length() != 1)//删除个位上的零
      sbResult.deleteCharAt(sbResult.length()-1);    if (strInteger.length() == 2){
      replace(sbResult,"壹拾","拾");
    }    return sbResult.toString();//将结果反转回来.
  }  /**
   * 功能: 返回分割符号
   * 如果参数是"12.3" 调用该函数的返回值是"点"
   * 如果参数是"12"   调用该函数的返回值是""(空值)
   * @param pValue
   * @return
   */
 static private String getDot(String pValue){
    return pValue.indexOf(".") != -1 ? "点" : "";
 } //数字到汉字
 static public String NumberToChinese(double pValue){
  //注意:不能用string.valueOf(pValue)处理,你自己试试就知道了.
  java.text.DecimalFormat df = new java.text.DecimalFormat("#.#########");
   String pTemp = String.valueOf( df.format(pValue));
   StringBuffer sbResult = new StringBuffer(getSign(pTemp) +  getInteger(pTemp) +
                                            getDot(pTemp) + getFraction(pTemp));
   return sbResult.toString(); } /**
  * 功能:用给定字符串pDest替换字符串pValue中的pSource
  * @param pValue
  * @param pSource
  * @param pDest
  * @return 经过替换处理的字符串
  * 例:pValue= xy ,pSource =x ,pDest = 测试
  *     调用改函数后pValue =测试y
  *
  * 说明一下: 如果 pvalue= xxx pSource = xx 处理结果是 x
  *            ,这个结果可能与您平时看到的替换函数有点不一样,通常应该是
  *             pSource =xx.
  *
  */
static private void replace(StringBuffer pValue, String pSource, String pDest){
   if (pValue  == null ||
       pSource == null ||
       pDest   == null)
     return ;   int intPos = 0;//记录pSource在pValue中的位置
   do{
    //---------------------------------------------------
    //intPos = pValue.toString().indexOf(pSource,intPos);
    //---------------------------------------------------    //============================================
    intPos = pValue.toString().indexOf(pSource);
    //============================================
    if (intPos == -1)//没有找到pSource.
      break;
    pValue.delete(intPos,intPos + pSource.length());
    pValue.insert(intPos,pDest);    //---------------------------------
    //intPos += pSource.length();
    //---------------------------------
   }while(true);
 }
 //现在发现这样的处理没有什么实际意义。所以我就不写了.
 public String ChineseToNumber(String pValue){
   return null;
 }
  public static void main(String[] args) {
    //为了方便您看程序运行结果,我将所有方法都设置成静态的    //测试:
    System.err.println(10);
    System.err.println(NumberToChinese(10));    System.err.println(12);
    System.err.println(NumberToChinese(12));    System.err.println(102);
    System.err.println(NumberToChinese(102));    System.err.println(1022);
    System.err.println(NumberToChinese(1022));    System.err.println(10009);
    System.err.println(NumberToChinese(10009));    System.err.print

解决方案 »

  1.   

    private static final String cnDigitString="零壹贰叁肆伍陆柒捌玖";    public static String getCnDigit(int digit){
            String str=String.valueOf(digit);
            StringBuffer sb=new StringBuffer();
            for(int i=0,len=str.length();i<len;i++){
                int index=str.charAt(i)-48;
                sb.append(cnDigitString.substring(index,index+1));
            }
            return sb.toString();
        }    public static void main(String[] args) {
            System.out.println(CnDigit.getCnDigit(10987608));//壹零玖捌柒陆零捌
        }