A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 李勇 初级黑马   /  2012-7-16 18:07  /  3704 人查看  /  20 人回复  /   1 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 李勇 于 2012-7-17 15:08 编辑

金额转换,阿拉伯数字的金额转换成中国传统的形式如:(¥1011)->(一千零一拾一元整)输出

我不太懂这个 想看看前辈们的 源代码

评分

参与人数 1技术分 +1 收起 理由
韦念欣 + 1 赞一个!

查看全部评分

20 个回复

正序浏览
import java.util.*;
public class test {
    public static void main(String[] arg) {
        String d="拾佰仟万拾佰仟亿拾佰仟万";
        String s="零壹贰叁肆伍陆柒捌玖";
        boolean zero=false, fu=false;
        long value;
        int count=0;
        String Cvalue="";
        Scanner r=new Scanner(System.in);
        while(!r.hasNextInt()) {
            System.out.println("Must a integer can be inputted!");
            r.next();
        }
        value=r.nextInt();
        if(value==0) {//如果为零,直接输出
            Cvalue="零";
            System.out.println(Cvalue);
            return;
        }
        else if(value<0) {//做负数标记,以便以后统一处理
            value=java.lang.Math.abs(value);
            fu=true;
        }
        while(value>0) {
            int b=(int)(value % 10);
            if(!zero || b!=0) {//不是连续零,就需要转换数据
                String t="";
                if(b!=0) {//非零的正常情况
                    t=s.substring(b,b+1);
                    if(count>0) t+=d.substring(count-1,count);
                    zero=false;
                }
                else if(count!=4 && count!=8){//零的情况,且不是万和亿位,应该写零
                    t="零";
                    zero=true;
                }
                Cvalue=t+Cvalue;
            }
            if(count==4 && !Cvalue.contains("万")) Cvalue="万"+Cvalue;//在第万位,添加万
            if(count==8 && !Cvalue.contains("亿")) Cvalue="亿"+Cvalue;//在第亿位,添加亿
            count++;
            value/=10;
        }
        Cvalue=Cvalue.replaceFirst("亿万","亿");//排除亿万连接
        Cvalue=Cvalue.replaceFirst("零亿","亿");//排除零亿连接
        Cvalue=Cvalue.replaceFirst("零万","万");//排除零万连接
        if(Cvalue.endsWith("零")) Cvalue=Cvalue.substring(0,Cvalue.length()-1);//去除尾零
        if(fu) Cvalue="负的"+Cvalue;//添加负标记
        System.out.println(Cvalue);
    }
}
回复 使用道具 举报
  1. package com.itcast.test;
  2. enum Digit {
  3.         ZERO("零",0),ONE("壹",1),TWO("贰",2),THREE("叁",3),FOUR("肆",4),
  4.         FIVE("伍",5),SIX("陆",6),SEVEN("柒",7),EIGHT("捌",8),NINE("玖",9);
  5.         // 成员变量
  6.         private String chars;
  7.         private int digit;
  8.         // 构造方法
  9.         private Digit(String chars,int digit) {
  10.                 this.chars = chars;
  11.                 this.digit = digit;
  12.         }
  13.         // getter
  14.         public String getChars() {
  15.                 return this.chars;
  16.         }
  17.         public int getDigit() {
  18.                 return this.digit;
  19.         }
  20.         // 普通方法
  21.         public static String getChars(int digit) {
  22.                 for(Digit d:Digit.values()) {
  23.                         if(d.getDigit() == digit) {
  24.                                 return d.chars;
  25.                         }
  26.                 }
  27.                 return null;
  28.         }
  29. }
  30.                
  31. public class Conversion {

  32.         /**
  33.          * @param args
  34.          */   
  35.         private static final String[] units = new String[]{  
  36.                 "元","拾","佰","仟","万","拾","佰","仟","亿","拾"
  37.         };
  38.         public static void main(String[] args) {
  39.                 // TODO Auto-generated method stub
  40.                 System.out.println(convert(1706030001));  
  41.         }
  42.         public static String convert(long money)  
  43.     {  
  44.                 String str = String.valueOf(money);
  45.                 StringBuilder sb = new StringBuilder();
  46.                 int index = 0;
  47.                 int digit = 0;
  48.                 sb.insert(0,units[index++]);
  49.                 char[] charArray = str.toCharArray();
  50.                 int [] intArray = new int[charArray.length];
  51.                 for(int i = charArray.length - 1;i >= 0;i--) {
  52.                         intArray[intArray.length - i - 1] = Character.getNumericValue(charArray[i]);
  53.                 }
  54.                 for(int i = 0;i < intArray.length;i++){               
  55.                         int preDigit = digit;// 前一个数字
  56.                         digit = intArray[i];                       
  57.                         String chars = Digit.getChars(digit);// 由阿拉伯数字获得对应的大写中文数字
  58.                         if(digit != 0) {
  59.                                 if(i != 0)
  60.                                         sb.insert(0,units[index++]);
  61.                                 sb.insert(0,chars);                               
  62.                         }
  63.                         else if(digit == 0) {       
  64.                                 if(preDigit != digit && i != 0) { // 两个连续的零只填入一个
  65.                                         sb.insert(0, "零");
  66.                                 }
  67.                                 if(index == 4 && intArray.length > 7 ) {
  68.                                         if(intArray[5] != 0 || intArray[6] != 0 || intArray[7] != 0){
  69.                                                 sb.insert(0,"万");
  70.                                         }       
  71.                                 }
  72.                                 // long型整数最大长度为10位
  73.                                 if(index == 8 && intArray[9] != 0) {
  74.                                         sb.insert(0, "亿");
  75.                                 }
  76.                                 else if(i == 0 && intArray[0] == 0) {
  77.                                         index--;
  78.                                 }
  79.                                 index++; // 遇0就递增       
  80.                         }               
  81.                 }
  82.         return sb.toString();   
  83.     }
  84. }
复制代码
其实应该早想到用栈数据结构的,因为可能一个数值中有多个连续的0,用栈的话就可以直接出栈,我用的是一种很笨的判断方式,遇到一个bug修复一个,最终完成的代码别人不见得看得懂。谁用这代码再去测试找下bug.可能还有

评分

参与人数 1技术分 +1 收起 理由
黑马张扬 + 1 不错 很努力吗

查看全部评分

回复 使用道具 举报
非常感谢  我拿去参考一下  尽量用自己的方法写出来
回复 使用道具 举报
黑马刘涛 发表于 2012-7-17 13:52
这时没问题了,不过这个程序我自己看着都头痛。头痛医头,脚痛医脚慢慢调试成功的,也懒得写注释了,逻辑 ...

能自己写出来真的很牛!
回复 使用道具 举报
刘馨琪 发表于 2012-7-17 13:24
1123124
壹佰壹拾贰万叁仟壹佰贰拾肆元元

这时没问题了,不过这个程序我自己看着都头痛。头痛医头,脚痛医脚慢慢调试成功的,也懒得写注释了,逻辑太混乱。
回复 使用道具 举报
哦,对,是的,我修改下。
回复 使用道具 举报
黑马刘涛 发表于 2012-7-17 13:16
没有啊。我用到了枚举的那个程序没问题的。你给个money值我测试下。

1123124
壹佰壹拾贰万叁仟壹佰贰拾肆元元

10001
壹万零壹元元

回复 使用道具 举报
刘馨琪 发表于 2012-7-17 13:07
是转换完后都是元元


没有啊。我用到了枚举的那个程序没问题的。你给个money值我测试下。
回复 使用道具 举报
本帖最后由 刘馨琪 于 2012-7-17 13:09 编辑
黑马刘涛 发表于 2012-7-17 04:04
//重写这个程序,用到了枚举,感觉枚举还是很方便的。我测试了下,程序运行没有什么问题。 ...


是转换完后都是元元

回复 使用道具 举报
鲍霄霄 发表于 2012-7-16 18:48
这是我上网看见的结果,可以参考下
package test.format;
import java.text.NumberFormat;

美女,你确定你贴的代码是完整的么?
回复 使用道具 举报
本帖最后由 黑马刘涛 于 2012-7-17 13:50 编辑
  1. package com.itcast.test;
  2. enum Digit {
  3.         ZERO("零",0),ONE("壹",1),TWO("贰",2),THREE("叁",3),FOUR("肆",4),
  4.         FIVE("伍",5),SIX("陆",6),SEVEN("柒",7),EIGHT("捌",8),NINE("玖",9);
  5.         // 成员变量
  6.         private String chars;
  7.         private int digit;
  8.         // 构造方法
  9.         private Digit(String chars,int digit) {
  10.                 this.chars = chars;
  11.                 this.digit = digit;
  12.         }
  13.         // getter
  14.         public String getChars() {
  15.                 return this.chars;
  16.         }
  17.         public int getDigit() {
  18.                 return this.digit;
  19.         }
  20.         // 普通方法
  21.         public static String getChars(int digit) {
  22.                 for(Digit d:Digit.values()) {
  23.                         if(d.getDigit() == digit) {
  24.                                 return d.chars;
  25.                         }
  26.                 }
  27.                 return null;
  28.         }
  29. }
  30.                
  31. public class Conversion {

  32.         /**
  33.          * @param args
  34.          */   
  35.         private static final String[] units = new String[]{  
  36.                 "元","拾","佰","仟","万","拾","佰","仟","亿","拾"
  37.         };
  38.         public static void main(String[] args) {
  39.                 // TODO Auto-generated method stub
  40.                 System.out.println(convert(130060891));  
  41.         }
  42.         public static String convert(long money)  
  43.     {  
  44.                 String str = String.valueOf(money);
  45.                 StringBuilder sb = new StringBuilder();
  46.                 int index = 0;
  47.                 int digit = 0;
  48.                 sb.insert(0,units[index++]);
  49.                 char[] charArray = str.toCharArray();
  50.                 int [] intArray = new int[charArray.length];
  51.                 for(int i = charArray.length - 1;i >= 0;i--) {
  52.                         intArray[intArray.length - i - 1] = Character.getNumericValue(charArray[i]);
  53.                 }
  54.                 for(int i = 0;i < intArray.length;i++){               
  55.                         int preDigit = digit;// 前一个数字
  56.                         digit = intArray[i];                       
  57.                         String chars = Digit.getChars(digit);// 由阿拉伯数字获得对应的大写中文数字
  58.                         if(digit != 0) {
  59.                                 if(i != 0)
  60.                                         sb.insert(0,units[index++]);
  61.                                 sb.insert(0,chars);                               
  62.                         }
  63.                         else if(digit == 0) {       
  64.                                 if(preDigit != digit && i != 0) { // 两个连续的零只填入一个
  65.                                         sb.insert(0, "零");
  66.                                 }
  67.                                 if(index == 4 && intArray.length > 7 ) {
  68.                                         if(intArray[5] != 0 || intArray[6] != 0 || intArray[7] != 0){
  69.                                                 sb.insert(0,"万");
  70.                                         }       
  71.                                 }
  72.                                 // long型整数最大长度为10位
  73.                                 if(index == 8 && intArray[9] != 0) {
  74.                                         sb.insert(0, "亿");
  75.                                 }
  76.                                 index++;
  77.                         }
  78.                 }
  79.         return sb.toString();  
  80.     }  
  81. }
复制代码
重写了。使用枚举
回复 使用道具 举报
本帖最后由 黑马刘涛 于 2012-7-17 04:03 编辑

我来修改下代码
  1. package com.itcast.test;

  2. public class Conversion {

  3.         /**
  4.          * @param args
  5.          */
  6.         private static final char[] data = new char[]{  
  7.                     '零','一','贰','叁','肆','伍','陆','柒','捌','玖'  
  8.         };   
  9.         private static final char[] units = new char[]{  
  10.                 '元','拾','佰','仟','万','拾','佰','仟','亿','拾'
  11.         };
  12.         public static void main(String[] args) {
  13.                 // TODO Auto-generated method stub
  14.                 System.out.println(convert(100018));  
  15.         }
  16.         public static String convert(int money)  
  17.     {  
  18.         StringBuffer sbf = new StringBuffer();  
  19.         int unit = 0;  
  20.         while(money!=0)  
  21.         {  
  22.             int number = money%10;
  23.                         if(number == 0)
  24.                         {
  25.                                 //第一次出现零填入零,连续出现零只填一次零
  26.                                 if(sbf.charAt(0) != data[0])
  27.                                         sbf.insert(0, data[number]);
  28.                                 if(unit == 4)
  29.                                         sbf.insert(0,units[unit++]);
  30.                                 else if(unit == 8)
  31.                                         sbf.insert(0,units[unit++]);
  32.                                 else
  33.                                         unit++;
  34.                         }
  35.                         else
  36.                         {
  37.                                 sbf.insert(0,units[unit++]);
  38.                                 sbf.insert(0, data[number]);                                 
  39.                         }
  40.             money /= 10;  
  41.         }  
  42.         return sbf.toString();  
  43.     }  
  44. }//这样写还是有bug.
复制代码
回复 使用道具 举报
程潇 中级黑马 2012-7-16 20:11:57
9#
鲍霄霄 发表于 2012-7-16 18:48
这是我上网看见的结果,可以参考下
package test.format;
import java.text.NumberFormat;

学习了:)
回复 使用道具 举报
李勇 初级黑马 2012-7-16 19:56:18
8#
谢谢各位 我拿去参考一下 ,下次尽力用自己的方法写出来
回复 使用道具 举报
本帖最后由 陆强强 于 2012-7-16 19:24 编辑

要把中文打印出来很容易,关键是格式,10000000我们不会读成一仟零佰零拾零万零仟零佰零拾零元的,不是么?
还有100000001我们也不会读成一亿零萬零一圆的;
1010我们也不是读一千零一拾零圆的。
这些不对的格式都要排除掉
回复 使用道具 举报
鲍霄霄 发表于 2012-7-16 18:48
package test.format;
import java.text.NumberFormat;
import java.util.HashMap;

http://zhidao.baidu.com/question/324988713.html
回复 使用道具 举报
有个很简单的方法,用swith循环做吧
回复 使用道具 举报
本帖最后由 鲍霄霄 于 2012-7-16 19:15 编辑

这是我上网看见的结果,可以参考下
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 + 1)));
    }
   //拾佰仟万亿等都是汉字里面才有的单位,加上它们
   int indexOfDot = cMoneyStringBuffer.indexOf(DOT);
   int moneyPatternCursor = 1;
   for (int i = indexOfDot - 1; i > 0; i--) {
     cMoneyStringBuffer.insert(i, chineseMoneyPattern.get(EMPTY + moneyPatternCursor));
     moneyPatternCursor = moneyPatternCursor == 8 ? 1 : moneyPatternCursor + 1;
    }

   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);
回复 使用道具 举报
楼上写的很好,顶
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 加入黑马