一个小算法-java人民币转大写

import java.math.BigDecimal;
import java.text.DecimalFormat;
import java.text.NumberFormat;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
/**
 * 
 * TODO:人民币小写转换为大写类
 *  <br>
 *  <b>Company </b>:
 *              *  <br>
 *  <b>Writer </b>: 
 *            *  <b>CreateTime <b>:
 *             */
public class SimpleMoneyFormat {
static boolean ISIGNORE = false;// 参数用来设置是否忽略错误,true为忽略错误,默认为false

static List digits = new ArrayList();

static List setDigits = new ArrayList();
static {
digits.add("拾");// 0:拾
digits.add("佰");// 1:佰
digits.add("仟");// 2:仟
digits.add("萬");// ,3:萬
digits.add("拾");// 4:拾萬
digits.add("佰");// ,5:佰萬
digits.add("仟");// 6:仟萬
digits.add("亿");// ,7:亿
digits.add("拾");// 8:拾亿
digits.add("佰");// ,9:佰亿
digits.add("仟");// 10:仟亿
digits.add("兆");// 11:兆
digits.add("拾");// 12:拾兆
digits.add("佰");// ,13:佰兆
digits.add("仟");// 仟兆
// digits.add("京"); //.
// digits.add("拾");//12:拾京
// digits.add("佰");//,13:佰京
// digits.add("仟");//???
// .....
setDigits.add("萬");
setDigits.add("亿");
setDigits.add("兆");
// setDigits.add("京"); //
// .....
// 百度搜索:个、十、百、千、万、十万、百万、千万、亿、兆(10的12次方)、京〔10的16次方)、垓、秭、穰、沟、涧、正、载、极(10的48次方)、恒河沙、阿僧示氏、(梵文译音、意思是无量)、那由他、不可思议(10的64次方)、无量数(∞)。
}

public String run(double moneyDb) throws Exception {
java.text.DecimalFormat fmt = new java.text.DecimalFormat(".00");
String moneyStr = fmt.format(moneyDb);
if (moneyDb == 0) {
return "零圆整";
}
return ConvertData(moneyStr);
}

// 转换RMB函数
String ConvertData(String moneyParam) throws Exception {
System.out.println("=====try to fmt:" + moneyParam);
StringBuffer returnValue = new StringBuffer();
String[] strMoneys = java.util.regex.Pattern.compile("//.").split(
moneyParam);
int len = strMoneys[0].length();
if (strMoneys[0].startsWith("-")) {
returnValue.append("负");
len--;
}
strMoneys[0] = strMoneys[0].replaceFirst("-", "");
// 判断可不可以转
if (len > digits.size() + 1) {
if (this.ISIGNORE) {
return moneyParam;
}
throw new Exception("函数:RMB出错:数字太大或太小,无法换算.");
}
// 转整数

for (int i = 0; i  < strMoneys[0].length(); i++) {
String value = strMoneys[0].charAt(i) + "";

returnValue.append(Convert1Digit(value, strMoneys[0].length() - 2
- i));
}

String tmp = returnValue.toString();
// linlin..
java.util.regex.Pattern p = java.util.regex.Pattern.compile(".*零零.*");// ("零零 ¦零萬 ¦零亿");
java.util.regex.Matcher m = p.matcher(tmp);
while (m.find()) {
tmp = tmp.replaceAll("零零", "零");
m = p.matcher(tmp);
}
// lindigits
String preDigitsName = "", digitsName;
for (int i = 0; i  < setDigits.size(); i++) {
digitsName = (String) setDigits.get(i);
tmp = tmp.replaceAll("零" + digitsName, digitsName);
}
if (!setDigits.isEmpty()) {
preDigitsName = (String) setDigits.get(0);
}
for (int i = 1; i  < setDigits.size(); i++) {// tmp =
// tmp.replaceAll("亿萬","亿零");
digitsName = (String) setDigits.get(i);
if (tmp.matches(".*" + digitsName.concat(preDigitsName) + ".*")) {
tmp = tmp.replaceAll(digitsName.concat(preDigitsName),
digitsName);
if (digitsName != "" && !(digitsName.equals(""))) {
tmp = tmp.replaceAll(digitsName, digitsName + "零");
tmp = tmp.replaceAll("零零", "零");
// System.out.println("===138");
}
}
preDigitsName = digitsName;
// java.util.regex.Pattern.matches(regex, input)
}
// end of lin
if (tmp.endsWith("零")) {
tmp = tmp.substring(0, tmp.length() - 1);
}
tmp = tmp.concat("圆");
if (tmp.startsWith("圆")) {
tmp = tmp.substring(1);
}
// 转小数
if (strMoneys[1].equals("00")) {
return tmp.concat("整");
} else {
String rstr = "";
String tmpstr = strMoneys[1].substring(0, 1);
String ret = Convert1Digit(tmpstr, -2);
if (ret != "零" && !(ret.equals("零"))) {
rstr = ret.concat("角");
} else if (tmp != "") {
rstr = "零";
}
tmpstr = strMoneys[1].substring(1, 2);
rstr = rstr.concat(Convert1Digit(tmpstr, -2) + "分");
return tmp.concat(rstr);
}

}

// digit为-1时是个位-2是小数位不加位名称直接返回大写数
private String Convert1Digit(String str, int digit) {
StringBuffer reStr = new StringBuffer("");
// System.out.println ("length:"+reStr.length());
int num = java.lang.Integer.parseInt(str);

if (digit != -2 && num == 0) {// 整数对零的处理

if (digit >= 0 && setDigits.contains(digits.get(digit))) {// 万位和亿位是零要念一个万或亿
reStr.append(digits.get(digit));
} else {
reStr.append("零");
}
return reStr.toString();
}
// digit = -1 为个位
switch (num) {// 取值名称,
case 0:
reStr.append("零");
break;
case 1:
reStr.append("壹");
break;
case 2:
reStr.append("贰");
break;
case 3:
reStr.append("叁");
break;
case 4:
reStr.append("肆");
break;
case 5:
reStr.append("伍");
break;
case 6:
reStr.append("陆");
break;
case 7:
reStr.append("柒");
break;
case 8:
reStr.append("捌");
break;
case 9:
reStr.append("玖");
break;
}

// -1为个位-2为小数,
if (digit >= 0) {// 取位名称
reStr.append(digits.get(digit));
}
return reStr.toString();
}

// test===
public static void main(String[] args) throws Exception {
Rmb rmb = new Rmb();
System.out.println(rmb.run(-45050000000122.2155));
System.out.println(rmb.run(5000122.2155));
}
//字符串反转
public static String convertStr(String str) {
int i;
String temp = "";
if (str != "") {
for (i = str.length() - 1; i >= 0; i--) {
temp = temp + str.charAt(i);
}
}
return temp;
}
}
//ChangeRMB.java /** * * programmed by HuangHeliang * 2009.04.15 10:20:51 * */ //package com.avtech.hhl; import java.io.*; public final class ChangeRMB { //每个数字对应的大写 private static final String[] num = { "零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖", }; //从低到高排列的单位 private static final String[] bit = { "圆", "拾", "佰", "仟", "万", "拾", "佰", "仟", "亿", "拾", "佰", "仟", "万", "拾", "佰", "仟", "亿" }; //金额里面的角和分 private static final String[] jf={ "角","分" }; /** * 处理金额的整数部分,返回"...圆整" * @param integer * @return String * @throws Exception */ public static String praseUpcaseRMB(String integer)throws Exception{ StringBuilder sbdr=new StringBuilder(""); int j=integer.length(); if(j>bit.length){ throw new Exception("\n只能处理亿万亿以内的数据(含亿万亿)!"); } char[] rmb=integer.toCharArray(); for (int i = 0; i 壹佰亿陆仟伍佰万肆仟伍佰捌拾叁圆零伍分 */ if(bit[bitLocate].equals("仟")){ String s=sbdr.toString(); if(!s.endsWith(bit[bitLocate+1]) && s.length()>0){ if (s.endsWith(num[0])) { sbdr.deleteCharAt(sbdr.length() - 1); } sbdr.append(bit[bitLocate+1]); } } sbdr.append(num[numLocate]); sbdr.append(bit[bitLocate]); }//end for /* * 去掉结尾"零"后,补全 */ if(sbdr.toString().endsWith(num[0])){ sbdr.deleteCharAt(sbdr.length()-1); sbdr.append("圆整"); }else{ sbdr.append("整"); } return sbdr.toString(); } /** * 处理带小数的金额,整数部分交由上一个方法处理,小数部分自己处理 * @param integer * @param decimal * @return String * @throws Exception */ public static String praseUpcaseRMB(String integer, String decimal)throws Exception{ String ret=ChangeRMB.praseUpcaseRMB(integer); ret=ret.split("整")[0]; //处理整数部分 StringBuilder sbdr=new StringBuilder(""); sbdr.append(ret); char[] rmbjf=decimal.toCharArray(); for(int i=0;i rmbDouble){ theInt-=1; } double theDecimal=rmbDouble-theInt; String integer=new Long((long)theInt).toString(); String decimal=""+Math.round(theDecimal*100); if(decimal.equals("0")){ result=ChangeRMB.praseUpcaseRMB(integer); }else{ result=ChangeRMB.praseUpcaseRMB(integer, decimal); } return result; } public static void main(String[] args) throws Exception{ System.out.print("输入小写人民币金额:"); BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String in = br.readLine(); String result=ChangeRMB.doChangeRMB(in); System.out.println("\n"+"------------换结果------------"); System.out.println(result); double d=54628569856.68; String ret=ChangeRMB.doChangeRMB(d); System.out.println("\n"+"------------换结果------------"); System.out.println(ret); } }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值