以前收的
---------------
/**
* 功能:数字 变成 汉字
*       汉字 变成 数字
* -----------------------------------
* 说明: 只能处理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
*/

解决方案 »

  1.   

    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();}
      

  2.   

    /**
     * 功能:用给定字符串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;
    }
      

  3.   

    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.println(100000);
       System.err.println(NumberToChinese(100000));   System.err.println(1000008);
       System.err.println(NumberToChinese(1000008));   System.err.println(10000080);
       System.err.println(NumberToChinese(10000080));
       System.err.println(1000020300);
       System.err.println(NumberToChinese(1000020300));
       System.err.println(0.34);
       System.err.println(NumberToChinese(0.34));   System.err.println(10.34);
       System.err.println(NumberToChinese(10.34));   System.err.println(101.34);
       System.err.println(NumberToChinese(101.34));   System.err.println(-101.34);
       System.err.println(NumberToChinese(-101.34));   System.err.println(-100100010.33);
       System.err.println(NumberToChinese(-100100010.33));
     }
    }