黑马程序员技术交流社区
标题:
编程题求大神帮忙
[打印本页]
作者:
1294668228
时间:
2016-3-28 14:53
标题:
编程题求大神帮忙
金额转换,阿拉伯数字转换成中国传统形式。
例如:101000001010 转换为 壹仟零壹拾亿零壹仟零壹拾圆整
作者:
humility
时间:
2016-3-28 14:53
package com.chen.test;
import java.text.NumberFormat;
import java.util.HashMap;
/**
*
金额转换,阿拉伯数字转换成中国传统形式。
例如:101000001010 转换为 壹仟零壹拾亿零壹仟零壹拾圆整
* @author Lenovo
*
*/
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 chineseMoenyPattern=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);
chineseMoenyPattern.put("1",TEN);
chineseMoenyPattern.put("2",HUNDRED);
chineseMoenyPattern.put("3",THOUSAND);
chineseMoenyPattern.put("4",TEN_THOUSAND);
chineseMoenyPattern.put("5",TEN);
chineseMoenyPattern.put("6",HUNDRED);
chineseMoenyPattern.put("7",THOUSAND);
chineseMoenyPattern.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=addUnitsToChineseMoenyString(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,
chineseMoenyPattern.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 addUnitsToChineseMoenyString(String moneyStr){
String result;
StringBuffer cMoneyStringBuffer=new StringBuffer(moneyStr);
int indexOfDot=cMoneyStringBuffer.indexOf(DOT);
cMoneyStringBuffer.replace(indexOfDot,indexOfDot+1,YUAN);
cMoneyStringBuffer.insert(cMoneyStringBuffer.length()-1,JIAO);
cMoneyStringBuffer.insert(cMoneyStringBuffer.length(),FEN);
//拾佰仟万亿等都是汉字里面才有的单位,加上它们
if(cMoneyStringBuffer.indexOf("零角零分")!=-1)//去掉零头,加整
cMoneyStringBuffer.replace(cMoneyStringBuffer.indexOf("零角零分"),
cMoneyStringBuffer.length(),"整");
else if(cMoneyStringBuffer.indexOf("零分")!=-1)//去掉零分,加整
cMoneyStringBuffer.replace(cMoneyStringBuffer.indexOf("零分"),
cMoneyStringBuffer.length(),"整");
else if(cMoneyStringBuffer.indexOf("零角")!=-1)
cMoneyStringBuffer.delete(cMoneyStringBuffer.indexOf("零角"),
cMoneyStringBuffer.indexOf("零角")+2);
result=cMoneyStringBuffer.toString();
return result;
}
//检查精度的合法性
private void checkPrecision(String moneyStr){
int fractionDigits=moneyStr.length()-moneyStr.indexOf(DOT)-1;
if(fractionDigits>2)//精度不能比分低
throw new RuntimeException("金额"+moneyStr+"的小数位数多余两位.");
}
public static void main(String[] args){
System.out.println(getInstance().format(new Double(10010001.01)));
}
}
复制代码
作者:
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
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Scanner;
public class Test10 {
/**
* 10、金额转换,阿拉伯数字转换成中国传统形式。
*
* 例如:101000001010 转换为 壹仟零壹拾亿零壹仟零壹拾圆整
*
*
* 分析:
* 1010 0000 1010
*
* 先读取到list集合中
*
* 以4个为单位,倒序读,若不为零则加上"拾,佰,仟"的单位,每给"仟"的同时,做判断给出"萬"位或者"亿"位
*
*
*
* @param args
*/
public static void main(String[] args) {
//1.定义map集合,用于将数字转换为大写字时的对照表
HashMap<Integer, String> map = new HashMap<>();
map.put(0, "零");
map.put(1, "壹");
map.put(2, "贰");
map.put(3, "叁");
map.put(4, "肆");
map.put(5, "伍");
map.put(6, "陆");
map.put(7, "柒");
map.put(8, "捌");
map.put(9, "玖");
//2.获取键盘录入,如果不是12位以内的数字字符串,则提示,并重新输入
Scanner scanner = new Scanner(System.in);
String str;
System.out.println("请输入12位内的整数:");
while (true) {
str = scanner.nextLine();
if (str.matches("\\d{1,12}")) {
break;
}
System.out.println("格式不正确,请输入12位内的整数:");
}
char[] ch = str.toCharArray();
//3.创建list集合,对照map集合的键值对,将大写的字符存入list集合中
ArrayList<String> list = new ArrayList<>();
for (char c : ch) {
list.add(map.get(Integer.parseInt(Character.toString(c))));
}
//4.如果首位为"零"则删除
for(int i = 0;;){
if("零".equals(list.get(i))){
list.remove(i);
}else{
break;
}
}
//5.以4个位为单位,依次加上每个位上的单位名,如果等于"零"则不加,每给"仟"的同时,做判断给出"萬"位或者"亿"位
int counter_four = 1;
int counter = 0;
for (int i = list.size() - 1; i >= 0; i--) {
counter++;
if (!list.get(i).equals("零")) {
switch (counter) {
case 2:
list.add(i + 1, "拾");
break;
case 3:
list.add(i + 1, "佰");
break;
case 4:
list.add(i + 1, "仟");
if (i == 0)
break;
addWanYi(list, i, counter_four);
counter_four++;
counter = 0;
break;
}
} else if (list.get(i).equals("零") && counter == 4) {
if (i == 0)
break;
addWanYi(list, i, counter_four);
counter_four++;
counter = 0;
}
}
//6.删除零后面是连续不是数字的值
for (int i = 0; i < list.size(); i++) {
//若谷list.get(i)等于"零",则对 i+1 的元素进行判断
if ("零".equals(list.get(i))) {
while (true) {
//如果i+1大于list集合的最大索引+1,则退出循环
if (i + 1 == list.size()){
list.remove(i);
break;
}
//如果list.get(i + 1)等于"零",则删除该值,结束本次循环,执行下次循环
if ("零".equals(list.get(i + 1))) {
list.remove(i + 1);
continue;
//如果list.get(i + 1)不等于"零",且不是数字则进行判断
//(一定是"萬"或"亿",不可能是"拾,佰,仟",因为他们前面不可能出现零)
} else if (!map.values().contains(list.get(i + 1))) {
//如果list.get(i - 1)等于"萬"或"亿"则删除该值("萬"或"亿")
if ("萬".equals(list.get(i - 1)) || "亿".equals(list.get(i - 1))) {
list.remove(i + 1);
}else{
//如果list.get(i - 1)不等于"萬"或"亿"(是"拾,佰,仟"中的一个),
//则调换 "零"(i)和该元素(i+1)的位置,
list.remove(i);
list.add(i+1, "零");
break;
}
}else{
//如果是"零"以外其他数值,则结束循环
break;
}
}
}
}
list.add("圆整");
//7.打印list集合
for (String string : list) {
System.out.print(string);
}
}
//1.给"仟"时,做判断给出"萬"位或者"亿"位
public static void addWanYi(ArrayList<String> list, int i, int counter_four) {
if (counter_four == 1) {
list.add(i, "萬");
} else if (counter_four == 2) {
list.add(i, "亿");
}
}
}
复制代码
作者:
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