结构推理 编写程序,实现金额转换,阿拉伯数字的金额转换成中国传统的形式如:(¥1011)→(一千零一拾一元整)输出。
【正确答案】参考程序如下:
   package test.format;
   import  java.text.NumberFormat;
   import java.util.HashMap;
   public class SimpleMoneyFormat{
     public static final String EMPTY="";
     public static final String ZERO="零";
     public static final String ONE="壹";
     public static final String TWO="贰";
     public static final String THREE="叁";
     public static final String FOUR="肆";
     public static final String FIVE="伍";
     public static final String SIX="陆";
     public static final String SEVEN="柒";
     public static final String EIGHT="捌";
     public static final String NINE="玖";
     public static final String TEN = "拾";
     public static final String HUNDRED = "佰";
     public static final String THOUSAND="仟";
     public static final String TEN_THOUSAND = "万";
     public static final String HUNDRED_MILLION = "亿";
     public static final String YUAN = "元";
     public static final String JIAO = "角";
     public static final String FEN="分";
     public static final String DOT = ". ";
     private static SimpleMoneyFormat formatter = null;
     private HashMap chineseNumberMap = new HashMap();
     private HashMap chineseMoneyPattern : new HashMap();
     private NumberFormat numberFormat = NumberFormat.getInstance();
     private SimpleMoneyFormat(){
        numberFormat.setMaximumFractionDigits(4);
        numberFormat.setMinimumFractionDigits(2);
        numberFormat.setGroupingUsed(false);
        chineseNumberMap.put("0",  ZERO);
        chineseNumberMap.put("1",   ONE);
        chineseNumberMap.put("2",  TWO) ;
        chineseNumberMap.put ("3",  THREE) ;
        chineseNumberMap.put("4",  FOUR) ;
        chineseNumberMap.put("5",  FIVE) ;
        chineseNumberMap.put("6",  SIX) ;
        chineseNumberMap.put ("7",  SEVEN) ;
        chineseNumberMap.put("8",  EIGHT) ;
        chineseNumberMap.put ("9",  NINE) ;
        chineseNumberMap.put(DOT,  DOT);
        chineseMoneyPattern.put ("1"   TEN) ;
        chineseMoneyPattern.put ("2"   HUNDRED) ;
        chineseMoneyPattern.put ("3"   THOUSAND) ;
        chineseMoneyPattern.put("4"   TEN THOUSAND);
        chineseMoneyPattern.put("5"   TEN);
        chineseMoneyPattern.put("6"   HUNDRED);
        chineseMoneyPattern.put("7"   THOUSAND);
        chineseMoneyPattern.put("8"   HUNDRED MILLION)
    }
    public static SimpleMoneyFormat getInstance(){
     if  (formatter == null)
         formatter = new SimpleMoneyFormat();
     return formatter;
         }
         public String format(String moneyStr)  {
             checkPrecision(moneyStr);
             String result;
             result = convertToChineseNumber(moneyStr);
             result = addUnitsToChineseMoneyString(result);
             return result;
       }
         public String format(double moneyDouble)  {
             return format(numberFormat.format(moneyDouble));
        }
         public String format(int moneyInt)  {
             return format(numberFormat.format(moneyInt));
       }
         public String format(long moneyLong)  {
             return format(numberFormat.format(moneyLong));
        }
         public String format(Number moneyNum)  {
             return format(numberFormat.format(moneyNum));
       }
         private String convertToChineseNumber(String moneyStr)  {
             String result;
             StringBuffer cMoneyStringBuffer = new StringBuffer();
             for  (int i = 0;  i < moneyStr.length();  i++)  {
                cMoneyStringBuffer.append(chineseNumberMap.get(moneyStr.substring(i,+ i)));
          }
             int indexOfDot = cMoneyStringBuffer.indexOf(DOT);
             int moneyPatternCursor = i;
             for  (int i = indexOfDot - 1;  i > 0;  i--)  {
                cMoneyStringBuffer.insert(i, chineseMoneyPattern.get(EMPTY+moneyPatternCursor));
               moneyPatternCursor = moneyPatternCursor == 8 ? 1 : moneyPatternCursor + i;
          }
             String  fractionPart  =  cMoneyStringBuffer.substring(cMoneyStringBuffer.indexOf("."));
             cMoneyStringBuffer.delete(cMoneyStringBuffer.indexOf("."),cMoneyStringBuffer.length());
            while  (cMoneyStringBuffer.indexOf("零拾") != -1)  {
                cMoneyStringBuffer.replace(cMoneyStringBuffer.indexOf("零拾"),
   cMoneyStringBuffer.indexOf("零拾")  + 2,  ZERO);
             while  (cMoneyStringBuffer.indexOf("零佰") !=-1)  {
                cMoneyStringBuffer.replace(cMoneyStringBuffer.indexOf("零佰"),
   cMoneyStringBuffer.indexOf "零佰")  + 2,  ZERO);
             while  (cMoneyStringBuffer.indexOf("零仟") !=-1)  {
                cMoneyStringBuffer.replace(cMoneyStringBuffer.indexOf("零仟"),
   cMoneyStringBuffer.indexOf "零仟")  + 2,  ZERO);
             while  (cMoneyStringBuffer.indexOf("零万") != -1)  {
                cMoneyStringBuffer.replace(cMoneyStringBuffer.indexOf("零万"),
   cMoneyStringBuffer.indexOf ("零万")  + 2,  TEN THOUSAND);
             while  (cMoneyStringBuffer.indexOf("零亿") != -1)  {
                cMoneyStringBuffer.replace(cMoneyStringBuffer.indexOf("零亿"),
   cMoneyStringBuffer.indexOf ("零亿")  + 2,  HUNDRED MILLION);
             while  (cMoneyStringBuffer.indexOf("零零") !=-1)  {
                cMoneyStringBuffer.replace(cMoneyStringBuffer.indexOf("零零"),
   cMoneyStringBuffer.indexOf ("零零")  + 2,  ZERO);
          }
             if (cMoneyStringBuffer.lastIndexOf(ZERO) == cMoneyStringBuffer.length() - 1)
                cMoneyStringBuffer.delete(cMoneyStringBuffer.length() - 1, cMoneyStringBuffer.
   length());
             cMoneyStringBuffer.append(fractionPart);
             result = cMoneyStringBuffer.toString();
             return result;
         private String addUnitsToChineseMoneyString(String moneyStr)  {
             String result;
             StringBuffer cMoneyStringBuffer = new StringBuffer(moneyStr);
             int indexOfDot = cMoneyStringBuffer.indexOf(DOT);
             cMoneyStringBuffer.replace(indexOfDot,  indexOfDot + 1,  YUAN);
   }
【答案解析】