Java 金额转换 阿拉伯数字金额转换成汉字大写金额
- 写的不是很完善,仅供参考!还望各大佬多多指点!下面直接上代码:
package demo;
import java.math.BigDecimal;
import java.util.Scanner;
public class MoneyToCN2 {
private static final String CNSUM[] = {"零","壹","贰","叁","肆","伍","陆","柒","捌","玖"};
private static final String SMALLSUM[] = {"分","角"};
private static final String MIDSUM[] = {"","拾","佰","仟"};
private static final String BIGSUM[] = {"","万 ","亿 "};
private static final String YUAN = "圆";
private static final String YUANZHENG = "圆整";
private static final String LINGYUANZHENG = "零圆整";
/**
* 默认精确到小数点后两位
*/
private static final int PRECISION = 2;
/**
* 阿拉伯数字类型的金额 转换为 汉字大写金额类型
* @param strMoney 输入后经过四舍五入的金额(保留两位小数,保留位数可更改)
* @return 汉字大写金额
*/
public static String toCN(String strMoney){
//用于接收转换了的汉字大写金额
StringBuffer sb = new StringBuffer();
String str[] = strMoney.split("\\."); //根据小数点将金额分成两部分
String strLeft = str[0]; //金额的整数部分
String strRight = str[1]; //金额的小数部分
/**
* 小数部分是否为零的情况
*/
if(Integer.parseInt(strRight)!=0){
//小数部分不为零,先读小数部分的角、分情况
int fen = Integer.parseInt(strRight.substring(1));
int jiao = Integer.parseInt(strRight.substring(0,1));
if(fen != 0){
sb.insert(0, SMALLSUM[0]);
sb.insert(0, toUpperNumber(fen));
}
if(jiao != 0){
sb.insert(0, SMALLSUM[1]);
sb.insert(0, toUpperNumber(jiao));
}
//如果整数部分不为零,先将“圆”添加上去
if(Long.parseLong(strLeft)!=0){
sb.insert(0, YUAN+" ");
}
}else{
//小数部分为零,小数后面的部分忽略不读,即均为 “圆整” 情况
sb.append(YUANZHENG);
//如果整数部分也为零,那就是“零圆整” 0.00
if(Long.parseLong(strLeft)==0){
return LINGYUANZHENG;
}
}
int leftLength = strLeft.length(); //整数部分的位数
if(leftLength <= 4){
//金额不超过上千的话
MidToUpper(strLeft, sb);
return sb.toString();
}else{
//金额上万起步的话
//将整数部分的金额拆成4个长度为一组的数,第一组单位“”,第二组单位“万”,第三组单位“亿”
//到底要分成几组?fenzu<=3
int fenzu = 0;
if(leftLength%4!=0){
fenzu = leftLength/4+1;
}else{
fenzu = leftLength/4;
}
//整数部分拆分出来的小组都装进leftMoney数组中
String leftMoney[] = new String[fenzu];
//将左边的整数拆分成最多四位的数组
for(int i=0; i<fenzu; i++){
int indexBegin = leftLength-4*(i+1); //开始切割的点
//从后往前拆分
if(indexBegin>0){
leftMoney[i] = strLeft.substring(indexBegin, leftLength-4*i);
}else{
//indexBegin≤0,即将要切分的字符串已经不足4位
leftMoney[i] = strLeft.substring(0, leftLength-4*i);
}
}
//j<=2 进行小组阿拉伯金额转换成大写汉字金额
for(int j=0; j<leftMoney.length; j++){
if(!leftMoney[j].equals("0000")){
sb.insert(0, BIGSUM[j]);
}
MidToUpper(leftMoney[j],sb);
}
return sb.toString();
}
}
/**
* 将最多四位的金额转换成十百千的大写金额 如4181 -->肆仟壹佰捌拾壹
* @param str 整数金额的字符串形式(最高四位数)
* @param sb 转换后的大写金额
* @return 返回大写金额
*/
public static String MidToUpper(String str, StringBuffer sb){
if(str == null || str.trim().length() == 0){
return "";
}
int strLength = str.length();
for(int i=0; i<strLength; i++){
int sum = Integer.parseInt(str.substring(strLength-i-1,strLength-i));
if(sum!=0){
sb.insert(0, MIDSUM[i]);
sb.insert(0, toUpperNumber(sum));
}
}
return sb.toString();
}
/**
* 阿拉伯数字转换成汉字大写
* @param num 阿拉伯数字 1~9
* @return 返回汉字大写 壹~玖
*/
public static String toUpperNumber(int num){
if(num>=0 && num<=9){
return CNSUM[num];
}
return "";
}
public static void main(String[] args) {
while(true){
System.out.print("1.请输入最高整数为12位的金额:");
BigDecimal money = new Scanner(System.in).nextBigDecimal();
String strMoney = money.setScale(PRECISION, BigDecimal.ROUND_HALF_UP).toString();
System.out.println("2.输入的金额保留两位小数后为:" + strMoney);
if(strMoney.length()>15){
System.out.println("3.抱歉,本小宝无法转换超过 上千亿 的金额!");
}else{
System.out.println("3.将其转换成汉字大写金额后为:" + toCN(strMoney));
}
System.out.println();
}
}
}
其他版本:
package demo;
/**
* 数字货币转换成汉字大写人民币 ¥100,203.20 --→ 拾万零贰佰零弎元贰角
*
* @author LaoYiPing
*
*/
public class MoneyToCN {
private static final String[] NUMBERS = { "零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖" };
private static final String[] BIG_POS = { "", "万", "亿" };
private static final String[] SMALL_POS = { "", "拾", "佰", "仟" };
private static final String[] UNITS = { "角", "分", "厘" };
private static final String YUAN = "圆";
private static final String YUAN_ZHENG = "圆整";
private static final String[] SMALL_O = { "零仟", "零佰", "零拾" };
private static final String[] BIG_O = { "零亿", "零万", "零圆" };
private static final String[] BIG_T = { "亿", "万", "圆" };
private static final String BILL = "亿";
private static final String ZERO = "零";
private static final String DOUBLE_ZERO = "零零";
public static void main(String[] args) {
System.out.println(toCurrency("100000000001.00"));
}
public static String toCurrency(String d) {
if (d == null) {
return "";
}
String s = null;
String high = null;
String low = null;
d = d.trim();
d = d.replaceAll("\\s+", "");
if (d.contains(".")) {
high = d.substring(0, d.indexOf("."));
low = d.substring(d.indexOf(".") + 1);
} else {
high = d;
}
high = toHigh(high);
low = toLow(low);
if (!isEmpty(low) && !isEmpty(high)) {
s = high + YUAN + low;
} else if (!isEmpty(high) && isEmpty(low)) {
s = high + YUAN_ZHENG;
} else if (isEmpty(high) && !isEmpty(low)) {
while (true) {
if (low.startsWith(NUMBERS[0])) {
low = low.substring(2);
} else {
break;
}
}
s = low;
}
return s;
}
private static String toHigh(String high) {
if (high == null) {
return null;
}
high = high.trim();
if (high.length() < 10 && Integer.parseInt(high) == 0) {
return null;
}
StringBuffer data = new StringBuffer(high);
//everse()方法表示的是将一个输入流倒叙输出。
data = data.reverse();
high = data.toString();
boolean b = false;
boolean m = false;
boolean f = false;
StringBuffer rs = new StringBuffer();
if (high.length() > 8) {
String[] billions = getBillions(high);
for (int i = 0; i < billions.length; i++) {
if (isEmpty(billions[i])) {
break;
}
if (i > 0) {
b = true;
}
if (b) {
rs.append(BILL);
}
if (m && f) {
rs.append(BILL);
}
String[] millions = getMillions(billions[i]);
if (millions != null) {
for (int j = 0; j < millions.length; j++) {
if (isEmpty(millions[j])) {
break;
}
if (b && j > 0) {
m = true;
}
if (Integer.parseInt(millions[j]) == 0) {
f = false;
continue;
} else {
f = true;
}
if (b && m) {
rs.append(BILL);
}
rs.append(BIG_POS[j]);
for (int n = 0; n < millions[j].length(); n++) {
rs.append(SMALL_POS[n]).append(
NUMBERS[Integer.parseInt(millions[j]
.charAt(n) + "")]);
}
}
} else {
for (int n = 0; n < billions[i].length(); n++) {
rs.append(SMALL_POS[n]).append(
NUMBERS[Integer.parseInt(billions[i].charAt(n)
+ "")]);
}
}
}
} else if (high.length() > 4) {
String[] millions = getMillions(high);
for (int j = 0; j < millions.length; j++) {
if (isEmpty(millions[j])) {
break;
}
rs.append(BIG_POS[j]);
for (int n = 0; n < millions[j].length(); n++) {
rs.append(SMALL_POS[n])
.append(NUMBERS[Integer.parseInt(millions[j]
.charAt(n) + "")]);
}
}
} else {
for (int n = 0; n < high.length(); n++) {
rs.append(SMALL_POS[n]).append(
NUMBERS[Integer.parseInt(high.charAt(n) + "")]);
}
}
rs = rs.reverse();
return getResult(rs.toString());
}
private static String getResult(String s) {
int l = s.length();
if (s == null) {
return null;
}
for (int i = 0; i < SMALL_O.length; i++) {
s = s.replaceAll(SMALL_O[i], ZERO);
}
s = s.replaceAll(DOUBLE_ZERO, ZERO);
for (int i = 0; i < BIG_O.length; i++) {
s = s.replaceAll(BIG_O[i], BIG_T[i]);
}
if (l != s.length()) {
s = getResult(s);
}
return s;
}
private static String[] getMillions(String high) {
if (high.length() > 4) {
int l = high.length() / 4 + 1;
String[] billions = new String[l];
int index = 0;
int st = 0;
int en = 4;
while (true) {
if (high.length() > 4) {
billions[index] = high.substring(st, en);
high = high.substring(en);
} else {
billions[index] = high;
break;
}
index++;
}
return billions;
}
return null;
}
private static boolean isEmpty(String s) {
return s == null || "".equals(s.trim());
}
private static String[] getBillions(String high) {
if (high.length() > 8) {
int l = high.length() / 8 + 1;
String[] billions = new String[l];
int index = 0;
int st = 0;
int en = 8;
while (true) {
if (high.length() > 8) {
billions[index] = high.substring(st, en);
high = high.substring(en);
} else {
billions[index] = high;
break;
}
index++;
}
return billions;
}
return null;
}
private static String toLow(String low) {
if (low == null) {
return null;
}
StringBuffer rs = new StringBuffer();
for (int i = 0; i < low.length(); i++) {
rs.append(NUMBERS[Integer.parseInt(low.charAt(i) + "")]).append(UNITS[i]);
}
return rs.toString();
}
}