/**
* @Title: ConvertUpMoney
* @Description: 将数字金额转换为大写中文金额
* @date: 2019年6月18日 下午10:52:27
*/
public class ConvertUpMoney {
// 大写数字
private static final String[] NUMBERS = {"零","壹","贰","叁","肆","伍","陆","柒","捌","玖"}
private static final String[] IUNIT = {"元","拾","佰","仟","万","拾","佰","仟","亿","拾","佰","仟","万","拾","佰","仟"}
// 小数部分的单位
private static final String[] DUNIT = {"角","分","厘"}
/**
* 转换为大写的中文金额
* @param str 字符串类型的 金额数字
* @return
*/
public static String toChinese(String str) {
// 判断输入的金额字符串是否符合要求
if (StringUtils.isBlank(str) || !str.matches("(-)?[\\d]*(.)?[\\d]*")) {
return "抱歉,请输入数字!"
}
if("0".equals(str) || "0.00".equals(str) || "0.0".equals(str)) {
return "零元"
}
// 判断金额数字中是否存在负号"-"
boolean flag = false
if(str.startsWith("-")){
// 标志位,标志此金额数字为负数
flag = true
str = str.replaceAll("-", "")
}
// 去掉金额数字中的逗号","
str = str.replaceAll(",", "")
String integerStr//整数部分数字
String decimalStr//小数部分数字
// 初始化:分离整数部分和小数部分
if(str.indexOf(".")>0) {
integerStr = str.substring(0,str.indexOf("."))
decimalStr = str.substring(str.indexOf(".") + 1)
}else if(str.indexOf(".")==0) {
integerStr = ""
decimalStr = str.substring(1)
}else {
integerStr = str
decimalStr = ""
}
// beyond超出计算能力,直接返回
if(integerStr.length()>IUNIT.length) {
return "超出计算能力!"
}
// 整数部分数字
int[] integers = toIntArray(integerStr)
// 判断整数部分是否存在输入012的情况
if (integers.length>1 &&integers[0] == 0) {
return "抱歉,输入数字不符合要求!"
}
// 设置万单位
boolean isWan = isWan5(integerStr)
// 小数部分数字
int[] decimals = toIntArray(decimalStr)
// 返回最终的大写金额
String result = getChineseInteger(integers, isWan) + getChineseDecimal(decimals)
if(flag){
// 如果是负数,加上"负"
return "负" + result
}else{
return result
}
}
/**
* 将字符串转为int数组
* @param number 数字
* @return
*/
private static int[] toIntArray(String number) {
int[] array = new int[number.length()]
for(int i = 0i<number.length()i++) {
array[i] = Integer.parseInt(number.substring(i,i+1))
}
return array
}
/**
* 将整数部分转为大写的金额
* @param integers 整数部分数字
* @param isWan 整数部分是否已经是达到【万】
* @return
*/
public static String getChineseInteger(int[] integers,boolean isWan) {
StringBuffer chineseInteger = new StringBuffer("")
int length = integers.length
if (length == 1 &&integers[0] == 0) {
return ""
}
for(int i=0i<lengthi++) {
String key = ""
if(integers[i] == 0) {
if((length - i) == 13)//万(亿)
key = IUNIT[4]
else if((length - i) == 9) {//亿
key = IUNIT[8]
}else if((length - i) == 5 &&isWan) {//万
key = IUNIT[4]
}else if((length - i) == 1) {//元
key = IUNIT[0]
}
if((length - i)>1 &&integers[i+1]!=0) {
key += NUMBERS[0]
}
}
chineseInteger.append(integers[i]==0?key:(NUMBERS[integers[i]]+IUNIT[length - i -1]))
}
return chineseInteger.toString()
}
/**
* 将小数部分转为大写的金额
* @param decimals 小数部分的数字
* @return
*/
private static String getChineseDecimal(int[] decimals) {
StringBuffer chineseDecimal = new StringBuffer("")
for(int i = 0i<decimals.lengthi++) {
if(i == 3) {
break
}
chineseDecimal.append(decimals[i]==0?"":(NUMBERS[decimals[i]]+DUNIT[i]))
}
return chineseDecimal.toString()
}
/**
* 判断当前整数部分是否已经是达到【万】
* @param integerStr 整数部分数字
* @return
*/
private static boolean isWan5(String integerStr) {
int length = integerStr.length()
if(length >4) {
String subInteger = ""
if(length >8) {
subInteger = integerStr.substring(length- 8,length -4)
}else {
subInteger = integerStr.substring(0,length - 4)
}
return Integer.parseInt(subInteger) >0
}else {
return false
}
}
// Test
public static void main(String[] args) {
String number = "12.56"
System.out.println(number+": "+ConvertUpMoney.toChinese(number))
number = "1234567890563886.123"
System.out.println(number+": "+ConvertUpMoney.toChinese(number))
number = "1600"
System.out.println(number+": "+ConvertUpMoney.toChinese(number))
number = "156,0"
System.out.println(number+": "+ConvertUpMoney.toChinese(number))
number = "-156,0"
System.out.println(number+": "+ConvertUpMoney.toChinese(number))
number = "0.12"
System.out.println(number+": "+ConvertUpMoney.toChinese(number))
number = "0.0"
System.out.println(number+": "+ConvertUpMoney.toChinese(number))
number = "01.12"
System.out.println(number+": "+ConvertUpMoney.toChinese(number))
number = "0125"
System.out.println(number+": "+ConvertUpMoney.toChinese(number))
number = "-0125"
System.out.println(number+": "+ConvertUpMoney.toChinese(number))
number = "sdw5655"
System.out.println(number+": "+ConvertUpMoney.toChinese(number))
System.out.println(null+": "+ConvertUpMoney.toChinese(null))
}
}
java 数字转大写汉字的完整例子,请参考:package com.sitinspring
import java.math.BigDecimal
import java.util.Hashtable
import java.util.Map
import java.util.regex.Matcher
import java.util.regex.Pattern
/**
* 将阿拉伯数字转换成汉语大写数字
* @author sitinspring
* @date 2008-03-25
*/
public class ChineseUpperCaser{
/**
* 用于存储整数部分
*/
private String integerPart
/**
* 用于存储小数部分
*/
private String floatPart
/**
* 用于存储0-9大写的哈希表
*/
private static final Map<String,String>ZerotoNineHt
/**
* 用于存储十百千大写的哈希表
*/
private static final Map<Integer,String>thHuTenHt
/**
* 用于存储万亿兆大写的哈希表
*/
private static final Map<Integer,String>wanYiZhaoHt
static{
ZerotoNineHt=new Hashtable<String,String>()
ZerotoNineHt.put("0", "零")
ZerotoNineHt.put("1", "壹")
ZerotoNineHt.put("2", "贰")
ZerotoNineHt.put("3", "叁")
ZerotoNineHt.put("4", "肆")
ZerotoNineHt.put("5", "伍")
ZerotoNineHt.put("6", "陆")
ZerotoNineHt.put("7", "柒")
ZerotoNineHt.put("8", "捌")
ZerotoNineHt.put("9", "玖")
thHuTenHt=new Hashtable<Integer,String>()
thHuTenHt.put(0, "")
thHuTenHt.put(1, "拾")
thHuTenHt.put(2, "佰")
thHuTenHt.put(3, "仟")
wanYiZhaoHt=new Hashtable<Integer,String>()
wanYiZhaoHt.put(0, "")
wanYiZhaoHt.put(1, "万")
wanYiZhaoHt.put(2, "亿")
wanYiZhaoHt.put(3, "兆")
}
private static String getWanYiZhao(int level){
String retval=""
do{
retval+=wanYiZhaoHt.get(level % 4)
level-=3
}while(level>3)
return retval
}
/**
* 构造函数
* @param number
* @throws NumberFormatException
*/
public ChineseUpperCaser(float number) throws NumberFormatException{
this(String.valueOf(number))
}
/**
* 构造函数
* @param number
* @throws NumberFormatException
*/
public ChineseUpperCaser(double number) throws NumberFormatException{
this(String.valueOf(number))
}
/**
* 构造函数
* @param number
* @throws NumberFormatException
*/
public ChineseUpperCaser(int number) throws NumberFormatException{
this(String.valueOf(number))
}
/**
* 构造函数
* @param number
* @throws NumberFormatException
*/
public ChineseUpperCaser(long number) throws NumberFormatException{
this(String.valueOf(number))
}
/**
* 构造函数
* @param number
* @throws NumberFormatException
*/
public ChineseUpperCaser(String number) throws NumberFormatException{
String formalNumber=formatNumber(number)
// 辟分以给整数部分和小数部分赋值
String[] arr=formalNumber.split("[.]")
if(arr.length==2){
// 有小数点
integerPart=arr[0]
floatPart=arr[1]
}
else{
// 无小数点
integerPart=arr[0]
}
}
public String toString(){
String retval=""
if(integerPart!=null){
retval+=parseIntegerPart()
}
if(floatPart!=null){
retval+=parseFloatPart()
}
else{
retval+="整"
}
return retval
}
/**
* 得到整数部分的汉字大写表示
* @return
*/
private String parseIntegerPart(){
String retval=""
// 将整数部分逆序,因为需要反向读取
String reverseIntegerPart=""
for(int i=integerPart.length()-1i>-1i--){
reverseIntegerPart+=integerPart.charAt(i)
}
// 将整数部分按四位分段
Pattern p = Pattern.compile("\\d{4}",Pattern.CASE_INSENSITIVE)
Matcher m = p.matcher(reverseIntegerPart)
StringBuffer sb = new StringBuffer()
boolean result = m.find()
while (result) {
// 每找到四位放一个逗号
m.appendReplacement(sb, m.group(0) + ",")
result = m.find()
}
m.appendTail(sb)
// 按逗号劈分,得到四位分组数据的数组
String[] arr=sb.toString().split(",")
int j
String str
for(int i=arr.length-1i>=0i--){
String temp=arr[i]
// 阿拉伯数字转大写汉字加单位(千百十)
for(j=temp.length()-1j>=0j--){
str=String.valueOf(temp.charAt(j))
retval+=ZerotoNineHt.get(str)+thHuTenHt.get(j)
}
retval=retval.replaceAll("(零)($)", "$2")// 零在末尾则去掉
// 加单位(兆亿万)
retval+=getWanYiZhao(i)
}
// 零替换
retval=retval.replaceAll("(零[仟佰拾])", "零")
retval=retval.replaceAll("(零{2,})", "零")
retval=retval.replaceAll("(零)($)", "$2")// 零在末尾则去掉
return retval
}
/**
* 得到小数部分的汉字大写表示
* @return
*/
private String parseFloatPart(){
String retval="点"
for(int i=0i<floatPart.length()i++){
String temp=String.valueOf(floatPart.charAt(i))
retval+=ZerotoNineHt.get(temp)
}
return retval
}
/**
* 对输入的字符串进行验证,如果不能转化为数字形式则抛出数字转化异常
* ,注意这是一个运行时异常(非检查型异常),程序不用显式捕获
* @param number
* @throws NumberFormatException
*/
private String formatNumber(String number) throws NumberFormatException{
return (new BigDecimal(number)).toString()
}
public static void main(String[] args){
String[] arr={"1.543524304302432","12.432423432","123.454235","1234","12345","123456","1234567",
"12345678","123456789","1234567891","12345678912","123456789123","1234567891234","12345678912345",
"123456789123456","1234567891234567","12345678912345678","123456789123456789",
"123456789123456789123456089123456789123456789123450780","0","00","000","0000","01","001","0001",
"00001","10","100","1000","10000","101","1001","10001","100001","1.23","21.234","243400031.233234",
"5400035.980","543.6545"}
//String[] arr={"0","00","000","0000","01","001","0001","00001","10","100","1000","10000","101","1001","10001","100001"}
//String[] arr={"1.23","21.234","243400031.233234","5400035.980","543.6545"}
for(String str:arr){
System.out.println("阿拉伯数字等于:"+str+" 大写汉字等于:"+new ChineseUpperCaser(str))
}
}
}