人民币(Rmb)数字转换大写(大写)
?
package com.test;
?
public class RmbConvert {
public String simpleToBig(double money) {
if (money <= 0) {
return "不能为负数";
}
?
String result = "";
?
char[] hunit = { '拾', '佰', '仟' }; // 段内的量度
char[] vunit = { '万', '亿' }; // 段间的量度
char[] digit = { '零', '壹', '贰', '叁', '肆', '伍', '陆', '柒', '捌', '玖' }; // 小写对应的大写
?
long longMoney = (long) (money * 100);
String strMoney = String.valueOf(longMoney); // 将小数变成整数,再放入字符串中
?
String head = strMoney.substring(0, strMoney.length() - 2); // 整数部分
String tail = strMoney.substring(strMoney.length() - 2); // 小数部分
?
String prefix = ""; // 存放转换的整数部分
String suffix = ""; // 存放转换的小数部分
?
if (tail.equals("00")) {
suffix += "整";
} else {
char tailChar[] = tail.toCharArray();
suffix += digit[tailChar[0] - '0'] + "角" // 将小数部分表示出来
+ digit[tailChar[1] - '0'] + "分"; // '0' ASCII 为 48,相减得索引号
}
?
char headChar[] = head.toCharArray();
?
/*
* 考虑零的情况,记录0的个数
*/
?
char zero = '0';
byte zeroSize = 0;
?
/*
* 先不考虑有0的情况,有点小复杂,因为有0的地方不能有单位
*?
* 等能实现大概功能时,再来考虑有0的情况
*/
for (int i = 0; i < headChar.length; i++) {
int idx = (headChar.length - i - 1) % 4; // 判断“段内”,"十,佰,千"
// idx=0,表示每4位分段了
int vidx = (headChar.length - i - 1) / 4; // 判断“段间”,“万,亿”
?
if (headChar[i] == '0') { // 考虑0的情况了
zeroSize++;
if (zero == '0') {
zero = digit[0];
} else if (idx == 0 && zeroSize < 4 && vidx > 0) {
prefix += vunit[vidx - 1]; // 当遇到1,1000,1234时, 1千万才能表示出来
zero = '0'; // 当1千万表示出来时,“零”就不需要了,在后来判断zero != 0
}
continue;
}
?
if (zero != '0') { // 没有转成千万时,就将”零“加入
prefix += zero; // 不至于出现很多个”零“
}
?
zeroSize = 0; // 还原成以前的
?
prefix += digit[headChar[i] - '0']; // ‘1’变成‘壹’
?
if (idx > 0) {
prefix += hunit[idx - 1]; // 加上 "十,佰,千"
}
if (idx == 0 && vidx > 0) {
prefix += vunit[vidx - 1]; // 加上 “万,亿”
}
}
?
if (prefix.length() > 0) {
result = prefix + "圆" + suffix;
}
?
return result;
}
?
public static void main(String[] args) {
?
RmbConvert rmb = new RmbConvert();
String cn = rmb.simpleToBig(1234567890.78);
System.out.println(cn);
}
}