题目是这样的:
我随便输入一个汉字的数值就要将他转为数字.
比如说我输入:二千七百零二 就要将他转为 2702
输入:一千八百五十五万零四百要转为 18550400
输入的值再一亿一下! 用JAVA代码该如何实现?
我随便输入一个汉字的数值就要将他转为数字.
比如说我输入:二千七百零二 就要将他转为 2702
输入:一千八百五十五万零四百要转为 18550400
输入的值再一亿一下! 用JAVA代码该如何实现?
解决方案 »
- jdbc连接mysql中数据库名字的问题
- 120分求解决啊
- 急求java计算器代码详细解析
- hibernate-Could not synchronize database state with session
- 高手请进,apache warn 怎么解决啊!
- 各位大哥,请帮帮小弟.
- 把CSDN的XLST文件缩水了一下,网络速度实在太慢了,只好用FlashGet下载XML文件下来看了,XML文件第二行改一下,再用缩水后的XSLT
- 菜鸟求助,为什么我用dreamwaver MX做完的网页,在IE中显示字体和行与行的间距,都产生了变化。
- 写了一个简单的struts程序,找不到web.xml文件
- 怎样学习JAVA?
- 我写了一个mvc的工程,怎么启动myeclipse调试?
- 关于iFrame在不同尺寸的显示器下的显示问题
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); 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);
tmpBuffer.append("整"); } 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))); }}
// initialize map
java.util.Map<String, Integer> unitMap = new java.util.HashMap<String, Integer>();
unitMap.put("个", 1);// 仅在数据存储时使用
unitMap.put("十", 10);
unitMap.put("百", 100);
unitMap.put("千", 1000);
unitMap.put("万", 10000);
unitMap.put("亿", 100000000);
java.util.Map<String, Integer> numMap = new java.util.HashMap<String, Integer>();
numMap.put("零", 0);
numMap.put("一", 1);
numMap.put("二", 2);
numMap.put("三", 3);
numMap.put("四", 4);
numMap.put("五", 5);
numMap.put("六", 6);
numMap.put("七", 7);
numMap.put("八", 8);
numMap.put("九", 9);
// 数据存储结构:
// 单位 数量
// "个" num
// "十" num
// "百" num
// "千" num
// "万" num
// "亿" num
java.util.Map<String, Long> dataMap = new java.util.LinkedHashMap<String, Long>();
// 保存"亿"或"万"之前存在的多位数
java.util.List<Long> multiNumList = new java.util.ArrayList<Long>();
long tempNum = 0;
for (int i = 0; i < chnNum.length(); i++) {
char bit = chnNum.charAt(i);
System.out.print(bit);
// 因为"亿"或"万"存在多位情况,所以需要进行判断
boolean isExist = false;
// 存在"亿"或"万"情况(不计算当前索引位)
if ((chnNum.indexOf('亿', i) != -1 || chnNum.indexOf('万', i) != -1)
&& chnNum.charAt(i) != '亿' && chnNum.charAt(i) != '万') {
isExist = true;
}
// 数字
if (numMap.containsKey(bit + "")) {
if (i != chnNum.length() - 1) {
tempNum = tempNum + numMap.get(bit + "");
}
// 最末位数字情况
else {
dataMap.put("个", Long.valueOf(numMap.get(bit + "") + ""));
tempNum = 0;
}
} else if (bit == '亿') {
// 存在"万亿"情况,取出"万"位值*10000,0000后重新put到map
if (i - 1 >= 0 && chnNum.charAt(i - 1) == '万') {
Long dataValue = dataMap.get("万");
if (dataValue != null && dataValue > 0) {
dataMap.put("万", dataValue * unitMap.get(bit + ""));
}
continue;
}
// 最后一位数进list等待处理
if (tempNum != 0) {
multiNumList.add(tempNum);
}
// 处理"亿"之前的多位数
long sum = 0;
for (Long num : multiNumList) {
sum += num;
}
multiNumList.clear();
dataMap.put("亿", sum);
tempNum = 0;
} else if (bit == '万') {
// 最后一位数进list等待处理
if (tempNum != 0) {
multiNumList.add(tempNum);
}
// 处理"万"之前的多位数
long sum = 0;
for (Long num : multiNumList) {
sum += num;
}
multiNumList.clear();
dataMap.put("万", sum);
tempNum = 0;
} else if (bit == '千' && tempNum > 0) {
// 存在"亿"或"万"情况,临时变量值*"千"单位值进list等待处理
if (isExist) {
multiNumList.add(tempNum * unitMap.get(bit + ""));
tempNum = 0;
}
// 不存在"亿"或"万"情况,临时变量值put到map
else {
dataMap.put("千", tempNum);
tempNum = 0;
}
} else if (bit == '百' && tempNum > 0) {
// 存在"亿"或"万"情况,临时变量值*"百"单位值进list等待处理
if (isExist) {
multiNumList.add(tempNum * unitMap.get(bit + ""));
tempNum = 0;
}
// 不存在"亿"或"万"情况,临时变量值put到map
else {
dataMap.put("百", tempNum);
tempNum = 0;
}
} else if (bit == '十') {
// 存在"亿"或"万"情况,临时变量值*"十"单位值进list等待处理
if (isExist) {
if (tempNum != 0) {
multiNumList.add(tempNum * unitMap.get(bit + ""));
tempNum = 0;
}
// 将"十"转换成"一十"
else {
tempNum = 1 * unitMap.get(bit + "");
}
}
// 不存在"亿"或"万"情况,临时变量值put到map
else {
if (tempNum != 0) {
dataMap.put("十", tempNum);
}
// 将"十"转换成"一十"
else {
dataMap.put("十", 1l);
}
tempNum = 0;
}
}
}
// output
System.out.println();
long sum = 0;
java.util.Set<String> keys = dataMap.keySet();
for (String key : keys) {
Integer unitValue = unitMap.get(key);
Long dataValue = dataMap.get(key);
sum += unitValue * dataValue;
}
System.out.println(sum);
}
/**
* 将10亿以内的阿拉伯数字转成汉字大写形式
*/
public class CnUpperCaser {
// 整数部分
private String integerPart;
// 小数部分
private String floatPart;
// 将数字转化为汉字的数组,因为各个实例都要使用所以设为静态
private static final char[] cnNumbers={'零','壹','贰','叁','肆','伍','陆','柒','捌','玖'};
// 供分级转化的数组,因为各个实例都要使用所以设为静态
private static final char[] series={'元','拾','百','仟','万','拾','百','仟','亿'};
/**
* 构造函数,通过它将阿拉伯数字形式的字符串传入
* @param original
*/
public CnUpperCaser(String original){
// 成员变量初始化
integerPart="";
floatPart="";
if(original.contains(".")){
// 如果包含小数点
int dotIndex=original.indexOf(".");
integerPart=original.substring(0,dotIndex);
floatPart=original.substring(dotIndex+1);
}
else{
// 不包含小数点
integerPart=original;
}
}
/**
* 取得大写形式的字符串
* @return
*/
public String getCnString(){
// 因为是累加所以用StringBuffer
StringBuffer sb=new StringBuffer();
// 整数部分处理
for(int i=0;i<integerPart.length();i++){
int number=getNumber(integerPart.charAt(i));
sb.append(cnNumbers[number]);
sb.append(series[integerPart.length()-1-i]);
}
// 小数部分处理
if(floatPart.length()>0){
sb.append("点");
for(int i=0;i<floatPart.length();i++){
int number=getNumber(floatPart.charAt(i));
sb.append(cnNumbers[number]);
}
}
// 返回拼接好的字符串
return sb.toString();
}
/**
* 将字符形式的数字转化为整形数字
* 因为所有实例都要用到所以用静态修饰
* @param c
* @return
*/
private static int getNumber(char c){
String str=String.valueOf(c);
return Integer.parseInt(str);
}
/**
* @param args
*/
public static void main(String[] args) {
System.out.println(new CnUpperCaser("123456789.12345").getCnString());
System.out.println(new CnUpperCaser("123456789").getCnString());
System.out.println(new CnUpperCaser(".123456789").getCnString());
System.out.println(new CnUpperCaser("0.1234").getCnString());
System.out.println(new CnUpperCaser("1").getCnString());
System.out.println(new CnUpperCaser("12").getCnString());
System.out.println(new CnUpperCaser("123").getCnString());
System.out.println(new CnUpperCaser("1234").getCnString());
System.out.println(new CnUpperCaser("12345").getCnString());
System.out.println(new CnUpperCaser("123456").getCnString());
System.out.println(new CnUpperCaser("1234567").getCnString());
System.out.println(new CnUpperCaser("12345678").getCnString());
System.out.println(new CnUpperCaser("123456789").getCnString());
}
}