java如何将数字转为中文大写

Python014

java如何将数字转为中文大写,第1张

import org.apache.commons.lang3.StringUtils

/**

* @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))

}

}

}