黑马程序员技术交流社区

标题: 编程题求大神帮忙 [打印本页]

作者: 1294668228    时间: 2016-3-28 14:53
标题: 编程题求大神帮忙
金额转换,阿拉伯数字转换成中国传统形式。
例如:101000001010   转换为   壹仟零壹拾亿零壹仟零壹拾圆整


作者: humility    时间: 2016-3-28 14:53
  1. package com.chen.test;

  2. import java.text.NumberFormat;
  3. import java.util.HashMap;
  4. /**
  5. *
  6.         金额转换,阿拉伯数字转换成中国传统形式。
  7.         例如:101000001010   转换为   壹仟零壹拾亿零壹仟零壹拾圆整
  8. * @author Lenovo
  9. *
  10. */
  11. public class SimpleMoneyFormat {
  12.         public static final String EMPTY="";
  13.     public static final String ZERO="零";
  14.     public static final String ONE="壹";
  15.     public static final String TWO="贰";
  16.     public static final String THREE="叁";
  17.     public static final String FOUR="肆";
  18.     public static final String FIVE="伍";
  19.     public static final String SIX="陆";
  20.     public static final String SEVEN="柒";
  21.     public static final String EIGHT="捌";
  22.     public static final String NINE="玖";
  23.     public static final String TEN="拾";
  24.     public static final String HUNDRED="佰";
  25.     public static final String THOUSAND="仟";
  26.     public static final String TEN_THOUSAND="万";
  27.     public static final String HUNDRED_MILLION="亿";
  28.     public static final String YUAN="元";
  29.     public static final String JIAO="角";
  30.     public static final String FEN="分";
  31.     public static final String DOT=".";
  32.    
  33.     private static SimpleMoneyFormat formatter=null;
  34.     private HashMap chineseNumberMap=new HashMap();
  35.     private HashMap chineseMoenyPattern=new HashMap();
  36.     private NumberFormat numberFormat=NumberFormat.getInstance();
  37.    
  38.     //私有构造函数
  39.     private SimpleMoneyFormat() {
  40.      numberFormat.setMaximumFractionDigits(4);
  41.      numberFormat.setMinimumFractionDigits(2);
  42.      numberFormat.setGroupingUsed(false);
  43.      
  44.      chineseNumberMap.put("0",ZERO);
  45.      chineseNumberMap.put("1",ONE);
  46.      chineseNumberMap.put("2",TWO);
  47.      chineseNumberMap.put("3",THREE);
  48.      chineseNumberMap.put("4",FOUR);
  49.      chineseNumberMap.put("5",FIVE);
  50.      chineseNumberMap.put("6",SIX);
  51.      chineseNumberMap.put("7",SEVEN);
  52.      chineseNumberMap.put("8",EIGHT);
  53.      chineseNumberMap.put("9",NINE);
  54.      chineseNumberMap.put(DOT,DOT);
  55.      
  56.      chineseMoenyPattern.put("1",TEN);
  57.      chineseMoenyPattern.put("2",HUNDRED);
  58.      chineseMoenyPattern.put("3",THOUSAND);
  59.      chineseMoenyPattern.put("4",TEN_THOUSAND);
  60.      chineseMoenyPattern.put("5",TEN);
  61.      chineseMoenyPattern.put("6",HUNDRED);
  62.      chineseMoenyPattern.put("7",THOUSAND);
  63.      chineseMoenyPattern.put("8",HUNDRED_MILLION);
  64.     }
  65.    
  66.     //单例模式
  67.     public static SimpleMoneyFormat getInstance(){
  68.      if(formatter==null)
  69.       formatter=new SimpleMoneyFormat();
  70.      return formatter;
  71.     }
  72.    
  73.     public String format(String moneyStr){
  74.      checkPrecision(moneyStr);
  75.      String result;
  76.      result=convertToChineseNumber(moneyStr);
  77.      result=addUnitsToChineseMoenyString(result);
  78.      return result;
  79.     }
  80.    
  81.     public String format(double moneyDouble){
  82.      return format(numberFormat.format(moneyDouble));
  83.     }
  84.    
  85.     public String format(int moneyInt){
  86.      return format(numberFormat.format(moneyInt));
  87.     }
  88.    
  89.     public String format(long moneyLong){
  90.      return format(numberFormat.format(moneyLong));
  91.     }
  92.    
  93.     public String format(Number moneyNum){
  94.      return format(numberFormat.format(moneyNum));
  95.     }
  96.    
  97.     private String convertToChineseNumber(String moneyStr){
  98.      String result;
  99.      StringBuffer cMoneyStringBuffer =new StringBuffer();
  100.      for(int i=0;i<moneyStr.length();i++){
  101.       cMoneyStringBuffer.append(chineseNumberMap.
  102.        get(moneyStr.substring(i,i+1)));
  103.      }
  104.      
  105.      int indexOfDot=cMoneyStringBuffer.indexOf(DOT);
  106.      int moneyPatternCursor=1;
  107.      for(int i=indexOfDot-1;i>0;i--){
  108.       cMoneyStringBuffer.insert(i,
  109.           chineseMoenyPattern.get(EMPTY+moneyPatternCursor));
  110.       moneyPatternCursor=moneyPatternCursor==
  111.        8?1:moneyPatternCursor+1;
  112.      }
  113.      
  114.      String fractionPart=cMoneyStringBuffer.substring(
  115.       cMoneyStringBuffer.indexOf("."));
  116.         cMoneyStringBuffer.delete(
  117.          cMoneyStringBuffer.indexOf("."),
  118.              cMoneyStringBuffer.length());
  119.         while(cMoneyStringBuffer.indexOf("零拾")!=-1){
  120.          cMoneyStringBuffer.replace(
  121.           cMoneyStringBuffer.indexOf("零拾"),
  122.               cMoneyStringBuffer.indexOf("零拾")+2,ZERO);
  123.         }
  124.         while(cMoneyStringBuffer.indexOf("零佰")!=-1){
  125.          cMoneyStringBuffer.replace(
  126.           cMoneyStringBuffer.indexOf("零佰"),
  127.                  cMoneyStringBuffer.indexOf("零佰")+2,ZERO);
  128.         }
  129.         while(cMoneyStringBuffer.indexOf("零仟")!=-1){
  130.          cMoneyStringBuffer.replace(
  131.           cMoneyStringBuffer.indexOf("零仟"),
  132.                  cMoneyStringBuffer.indexOf("零仟")+2,ZERO);
  133.         }
  134.         while(cMoneyStringBuffer.indexOf("零万")!=-1){
  135.          cMoneyStringBuffer.replace(
  136.           cMoneyStringBuffer.indexOf("零万"),
  137.              cMoneyStringBuffer.indexOf("零万")+2,TEN_THOUSAND);
  138.         }
  139.         while(cMoneyStringBuffer.indexOf("零亿")!=-1){
  140.          cMoneyStringBuffer.replace(
  141.           cMoneyStringBuffer.indexOf("零亿"),
  142.              cMoneyStringBuffer.indexOf("零亿")+2,HUNDRED_MILLION);
  143.         }
  144.         while(cMoneyStringBuffer.indexOf("零零")!=-1){
  145.          cMoneyStringBuffer.replace(
  146.           cMoneyStringBuffer.indexOf("零零"),
  147.              cMoneyStringBuffer.indexOf("零零")+2,ZERO);
  148.         }
  149.         if(cMoneyStringBuffer.lastIndexOf(ZERO)
  150.          ==cMoneyStringBuffer.length()-1){
  151.          cMoneyStringBuffer.delete(
  152.           cMoneyStringBuffer.length()-1,
  153.           cMoneyStringBuffer.length());
  154.         }
  155.         cMoneyStringBuffer.append(fractionPart);
  156.         result=cMoneyStringBuffer.toString();
  157.         return result;
  158.     }
  159.    
  160.     private String addUnitsToChineseMoenyString(String moneyStr){
  161.      String result;
  162.      StringBuffer cMoneyStringBuffer=new StringBuffer(moneyStr);
  163.      
  164.      int indexOfDot=cMoneyStringBuffer.indexOf(DOT);
  165.      cMoneyStringBuffer.replace(indexOfDot,indexOfDot+1,YUAN);
  166.      cMoneyStringBuffer.insert(cMoneyStringBuffer.length()-1,JIAO);
  167.      cMoneyStringBuffer.insert(cMoneyStringBuffer.length(),FEN);
  168.      
  169.       //拾佰仟万亿等都是汉字里面才有的单位,加上它们
  170.      if(cMoneyStringBuffer.indexOf("零角零分")!=-1)//去掉零头,加整
  171.       cMoneyStringBuffer.replace(cMoneyStringBuffer.indexOf("零角零分"),
  172.        cMoneyStringBuffer.length(),"整");
  173.      else if(cMoneyStringBuffer.indexOf("零分")!=-1)//去掉零分,加整
  174.          cMoneyStringBuffer.replace(cMoneyStringBuffer.indexOf("零分"),
  175.              cMoneyStringBuffer.length(),"整");
  176.      else if(cMoneyStringBuffer.indexOf("零角")!=-1)
  177.       cMoneyStringBuffer.delete(cMoneyStringBuffer.indexOf("零角"),
  178.            cMoneyStringBuffer.indexOf("零角")+2);
  179.          result=cMoneyStringBuffer.toString();
  180.          return result;
  181.     }
  182.    
  183.     //检查精度的合法性
  184.     private void checkPrecision(String moneyStr){
  185.      int fractionDigits=moneyStr.length()-moneyStr.indexOf(DOT)-1;
  186.      if(fractionDigits>2)//精度不能比分低
  187.       throw new RuntimeException("金额"+moneyStr+"的小数位数多余两位.");
  188.     }
  189.    
  190.     public static void main(String[] args){
  191.      System.out.println(getInstance().format(new Double(10010001.01)));
  192.     }
  193.    
  194. }
复制代码

作者: lennycxy    时间: 2016-3-28 16:22
这么长的代码
作者: fanxiaolin    时间: 2016-3-28 17:07
其实不需要这么麻烦吧,去百度一下。看看博客里面的大神的讲解,或许会知道的更多
作者: fanxiaolin    时间: 2016-3-28 17:09
其实我在想为什么不用case
作者: 1294668228    时间: 2016-3-28 17:35
humility 发表于 2016-3-28 15:09

长度不够 ,差两位
作者: Ak-47    时间: 2016-3-29 01:24
这个题目表示搞不懂啊
作者: 1294668228    时间: 2016-3-29 08:36
就是编一个程序把数字形式转换成大写人民币格式

作者: ping3014    时间: 2016-3-29 18:56
  1. import java.util.ArrayList;
  2. import java.util.HashMap;
  3. import java.util.Iterator;
  4. import java.util.Scanner;

  5. public class Test10 {

  6.         /**
  7.          * 10、金额转换,阿拉伯数字转换成中国传统形式。
  8.          *
  9.          * 例如:101000001010 转换为 壹仟零壹拾亿零壹仟零壹拾圆整
  10.          *
  11.          *
  12.          * 分析:
  13.          * 1010 0000 1010
  14.          *
  15.          * 先读取到list集合中
  16.          *
  17.          * 以4个为单位,倒序读,若不为零则加上"拾,佰,仟"的单位,每给"仟"的同时,做判断给出"萬"位或者"亿"位
  18.          *
  19.          *
  20.          *
  21.          * @param args
  22.          */
  23.         public static void main(String[] args) {
  24.                 //1.定义map集合,用于将数字转换为大写字时的对照表
  25.                 HashMap<Integer, String> map = new HashMap<>();
  26.                 map.put(0, "零");
  27.                 map.put(1, "壹");
  28.                 map.put(2, "贰");
  29.                 map.put(3, "叁");
  30.                 map.put(4, "肆");
  31.                 map.put(5, "伍");
  32.                 map.put(6, "陆");
  33.                 map.put(7, "柒");
  34.                 map.put(8, "捌");
  35.                 map.put(9, "玖");

  36.                 //2.获取键盘录入,如果不是12位以内的数字字符串,则提示,并重新输入
  37.                 Scanner scanner = new Scanner(System.in);
  38.                 String str;
  39.                 System.out.println("请输入12位内的整数:");
  40.                 while (true) {
  41.                         str = scanner.nextLine();
  42.                         if (str.matches("\\d{1,12}")) {
  43.                                 break;
  44.                         }
  45.                         System.out.println("格式不正确,请输入12位内的整数:");
  46.                 }
  47.                
  48.                 char[] ch = str.toCharArray();

  49.                 //3.创建list集合,对照map集合的键值对,将大写的字符存入list集合中
  50.                 ArrayList<String> list = new ArrayList<>();
  51.                 for (char c : ch) {
  52.                         list.add(map.get(Integer.parseInt(Character.toString(c))));
  53.                 }
  54.                
  55.                 //4.如果首位为"零"则删除
  56.                 for(int i = 0;;){
  57.                         if("零".equals(list.get(i))){
  58.                                 list.remove(i);
  59.                         }else{
  60.                                 break;
  61.                         }
  62.                 }
  63.                
  64.                 //5.以4个位为单位,依次加上每个位上的单位名,如果等于"零"则不加,每给"仟"的同时,做判断给出"萬"位或者"亿"位
  65.                 int counter_four = 1;
  66.                 int counter = 0;
  67.                 for (int i = list.size() - 1; i >= 0; i--) {
  68.                         counter++;
  69.                         if (!list.get(i).equals("零")) {
  70.                                 switch (counter) {
  71.                                 case 2:
  72.                                         list.add(i + 1, "拾");
  73.                                         break;
  74.                                 case 3:
  75.                                         list.add(i + 1, "佰");
  76.                                         break;
  77.                                 case 4:
  78.                                         list.add(i + 1, "仟");
  79.                                         if (i == 0)
  80.                                                 break;
  81.                                         addWanYi(list, i, counter_four);
  82.                                         counter_four++;
  83.                                         counter = 0;
  84.                                         break;
  85.                                 }
  86.                         } else if (list.get(i).equals("零") && counter == 4) {
  87.                                 if (i == 0)
  88.                                         break;
  89.                                 addWanYi(list, i, counter_four);
  90.                                 counter_four++;
  91.                                 counter = 0;
  92.                         }
  93.                 }
  94.                
  95.                 //6.删除零后面是连续不是数字的值
  96.                 for (int i = 0; i < list.size(); i++) {
  97.                         //若谷list.get(i)等于"零",则对 i+1 的元素进行判断
  98.                         if ("零".equals(list.get(i))) {
  99.                                 while (true) {
  100.                                         //如果i+1大于list集合的最大索引+1,则退出循环
  101.                                         if (i + 1 == list.size()){
  102.                                                 list.remove(i);
  103.                                                 break;
  104.                                         }
  105.                                         //如果list.get(i + 1)等于"零",则删除该值,结束本次循环,执行下次循环
  106.                                         if ("零".equals(list.get(i + 1))) {
  107.                                                 list.remove(i + 1);
  108.                                                 continue;
  109.                                                 //如果list.get(i + 1)不等于"零",且不是数字则进行判断
  110.                                                 //(一定是"萬"或"亿",不可能是"拾,佰,仟",因为他们前面不可能出现零)
  111.                                         } else if (!map.values().contains(list.get(i + 1))) {
  112.                                                 //如果list.get(i - 1)等于"萬"或"亿"则删除该值("萬"或"亿")
  113.                                                 if ("萬".equals(list.get(i - 1)) || "亿".equals(list.get(i - 1))) {
  114.                                                         list.remove(i + 1);
  115.                                                 }else{
  116.                                                         //如果list.get(i - 1)不等于"萬"或"亿"(是"拾,佰,仟"中的一个),
  117.                                                         //则调换 "零"(i)和该元素(i+1)的位置,
  118.                                                         list.remove(i);
  119.                                                         list.add(i+1, "零");
  120.                                                         break;
  121.                                                 }
  122.                                         }else{
  123.                                                 //如果是"零"以外其他数值,则结束循环
  124.                                                 break;
  125.                                         }
  126.                                 }
  127.                         }
  128.                 }
  129.                 list.add("圆整");

  130.                 //7.打印list集合
  131.                 for (String string : list) {
  132.                         System.out.print(string);
  133.                 }
  134.                

  135.         }

  136.         //1.给"仟"时,做判断给出"萬"位或者"亿"位
  137.         public static void addWanYi(ArrayList<String> list, int i, int counter_four) {
  138.                 if (counter_four == 1) {
  139.                         list.add(i, "萬");
  140.                 } else if (counter_four == 2) {
  141.                         list.add(i, "亿");
  142.                 }
  143.         }
  144. }
复制代码

作者: ping3014    时间: 2016-3-29 18:57
ping3014 发表于 2016-3-29 18:56

刚刚做出来的,试一下吧
作者: IT小笨鸟    时间: 2016-4-1 20:36
小需求长代码,集合类型果然常用,表示看得头晕




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2