• 2021-02-12 16:24:16

/**

* Created by 33303 on 2017/7/28.

*/

import java.math.BigDecimal;

/**

* 数字转换为汉语中人民币的大写

*

*/

public class NumberToCN {

/**

* 汉语中数字大写

*/

private static final String[] CN_UPPER_NUMBER = { "零", "壹", "贰", "叁", "肆",

"伍", "陆", "柒", "捌", "玖" };

/**

* 汉语中货币单位大写，这样的设计类似于占位符

*/

private static final String[] CN_UPPER_MONETRAY_UNIT = { "分", "角", "元",

"拾", "佰", "仟", "万", "拾", "佰", "仟", "亿", "拾", "佰", "仟", "兆", "拾",

"佰", "仟" };

/**

* 特殊字符：整

*/

private static final String CN_FULL = "整";

/**

* 特殊字符：负

*/

private static final String CN_NEGATIVE = "负";

/**

* 金额的精度，默认值为2

*/

private static final int MONEY_PRECISION = 2;

/**

* 特殊字符：零元整

*/

private static final String CN_ZEOR_FULL = "零元" + CN_FULL;

/**

* 把输入的金额转换为汉语中人民币的大写

*

* @param numberOfMoney

* 输入的金额

* @return 对应的汉语大写

*/

public static String number2CNMontrayUnit(BigDecimal numberOfMoney) {

StringBuffer sb = new StringBuffer();

// -1, 0, or 1 as the value of this BigDecimal is negative, zero, or

// positive.

int signum = numberOfMoney.signum();

// 零元整的情况

if (signum == 0) {

return CN_ZEOR_FULL;

}

//这里会进行金额的四舍五入

long number = numberOfMoney.movePointRight(MONEY_PRECISION)

.setScale(0, 4).abs().longValue();

// 得到小数点后两位值

long scale = number % 100;

int numUnit = 0;

int numIndex = 0;

boolean getZero = false;

// 判断最后两位数，一共有四中情况：00 = 0, 01 = 1, 10, 11

if (!(scale > 0)) {

numIndex = 2;

number = number / 100;

getZero = true;

}

if ((scale > 0) && (!(scale % 10 > 0))) {

numIndex = 1;

number = number / 10;

getZero = true;

}

int zeroSize = 0;

while (true) {

if (number <= 0) {

break;

}

// 每次获取到最后一个数

numUnit = (int) (number % 10);

if (numUnit > 0) {

if ((numIndex == 9) && (zeroSize >= 3)) {

sb.insert(0, CN_UPPER_MONETRAY_UNIT[6]);

}

if ((numIndex == 13) && (zeroSize >= 3)) {

sb.insert(0, CN_UPPER_MONETRAY_UNIT[10]);

}

sb.insert(0, CN_UPPER_MONETRAY_UNIT[numIndex]);

sb.insert(0, CN_UPPER_NUMBER[numUnit]);

getZero = false;

zeroSize = 0;

} else {

++zeroSize;

if (!(getZero)) {

sb.insert(0, CN_UPPER_NUMBER[numUnit]);

}

if (numIndex == 2) {

if (number > 0) {

sb.insert(0, CN_UPPER_MONETRAY_UNIT[numIndex]);

}

} else if (((numIndex - 2) % 4 == 0) && (number % 1000 > 0)) {

sb.insert(0, CN_UPPER_MONETRAY_UNIT[numIndex]);

}

getZero = true;

}

// 让number每次都去掉最后一个数

number = number / 10;

++numIndex;

}

// 如果signum == -1，则说明输入的数字为负数，就在最前面追加特殊字符：负

if (signum == -1) {

sb.insert(0, CN_NEGATIVE);

}

// 输入的数字小数点后两位为"00"的情况，则要在最后追加特殊字符：整

if (!(scale > 0)) {

sb.append(CN_FULL);

}

return sb.toString();

}

public static void main(String[] args) {

double money = 2020004.01;

BigDecimal numberOfMoney = new BigDecimal(money);

String s = NumberToCN.number2CNMontrayUnit(numberOfMoney);

System.out.println("你输入的金额为：【"+ money +"】 #--# [" +s.toString()+"]");

}

}

更多相关内容
• 主要为大家详细介绍了java金额数字转中文工具类的相关资料，具有一定的参考价值，感兴趣的小伙伴们可以参考一下
• 金额转换，中文金额转数字金额，数字金额转中文金额，中文金额转数字金额从字符串中获取中文大写金额或是数字金额，不支持小数，中文金额不支持混写，如 五千零壹十万元，不支持转换会输出0，字符串可以不用截取，...
• 主要为大家详细介绍了Java数字金额转为大写中文金额，具有一定的参考价值，感兴趣的小伙伴们可以参考一下
• import org.apache.commons.lang3.StringUtils;... * @Description: 将数字金额转换为大写中文金额 * @date: 2019年6月18日 下午10:52:27 */ public class ConvertUpMoney { // 大写数字 private static fi
import com.guangyi.project.config.BDException;
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]*")) {
throw new BDException("金额不正确");
}

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 = 0;i<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=0; i<length; i++) {
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 = 0;i<decimals.length;i++) {
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版） 博文链接：https://lovinchan.iteye.com/blog/202768
• 独立开发，实测可用， 将阿拉伯和中文数字组合的字符串成阿拉伯数字的整型 包。例如： “八万三千20”就可以成整型 803020 。解压后，引用包。调用方法 在UnitTest.java 中有
• 将阿拉伯数字金额转中文大写 "零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖"......
• 一个 Java数字金额转中文大写的工具类，还不是很完善。 import java.util.regex.Matcher; import java.util.regex.Pattern; public class ChineseYuanUtil { private static final Pattern AMOUNT_...

一个 Java 将数字金额转成中文大写的工具类，还不是很完善。

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class ChineseYuanUtil {

private static final Pattern AMOUNT_PATTERN = Pattern.compile("^(0|[1-9]\\d{0,11})\\.(\\d\\d)\$"); // 不考虑分隔符的正确性
private static final char[] RMB_NUMS = "零壹贰叁肆伍陆柒捌玖".toCharArray();
private static final String[] UNITS = { "元", "角", "分", "整" };
private static final String[] U1 = { "", "拾", "佰", "仟" };
private static final String[] U2 = { "", "万", "亿" };

/**
* 将金额（整数部分等于或少于 12 位，小数部分 2 位）转换为中文大写形式.
*
* @param amount 金额数字
* @return 中文大写
* @throws IllegalArgumentException
*/
public static String convert(String amount) throws IllegalArgumentException {
// 去掉分隔符
amount = amount.replace(",", "");

// 验证金额正确性
if (amount.equals("0.00")) {
throw new IllegalArgumentException("金额不能为零.");
}
Matcher matcher = AMOUNT_PATTERN.matcher(amount);
if (!matcher.find()) {
throw new IllegalArgumentException("输入金额有误.");
}

String integer = matcher.group(1); // 整数部分
String fraction = matcher.group(2); // 小数部分

String result = "";
if (!integer.equals("0")) {
result += integer2rmb(integer) + UNITS[0]; // 整数部分
}
if (fraction.equals("00")) {
result += UNITS[3]; // 添加[整]
} else if (fraction.startsWith("0") && integer.equals("0")) {
result += fraction2rmb(fraction).substring(1); // 去掉分前面的[零]
} else {
result += fraction2rmb(fraction); // 小数部分
}

return result;
}

// 将金额小数部分转换为中文大写
private static String fraction2rmb(String fraction) {
char jiao = fraction.charAt(0); // 角
char fen = fraction.charAt(1); // 分
return (RMB_NUMS[jiao - '0'] + (jiao > '0' ? UNITS[1] : ""))
+ (fen > '0' ? RMB_NUMS[fen - '0'] + UNITS[2] : "");
}

// 将金额整数部分转换为中文大写
private static String integer2rmb(String integer) {
StringBuilder buffer = new StringBuilder();
// 从个位数开始转换
int i, j;
for (i = integer.length() - 1, j = 0; i >= 0; i--, j++) {
char n = integer.charAt(i);
if (n == '0') {
// 当 n 是 0 且 n 的右边一位不是 0 时，插入[零]
if (i < integer.length() - 1 && integer.charAt(i + 1) != '0') {
buffer.append(RMB_NUMS[0]);
}
// 插入[万]或者[亿]
if (j % 4 == 0) {
if (i > 0 && integer.charAt(i - 1) != '0' || i > 1 && integer.charAt(i - 2) != '0'
|| i > 2 && integer.charAt(i - 3) != '0') {
buffer.append(U2[j / 4]);
}
}
} else {
if (j % 4 == 0) {
buffer.append(U2[j / 4]); // 插入[万]或者[亿]
}
buffer.append(U1[j % 4]); // 插入[拾]、[佰]或[仟]
buffer.append(RMB_NUMS[n - '0']); // 插入数字
}
}
return buffer.reverse().toString();
}
}

测试类：

 public static void main(String[] args) {

System.out.println(ChineseYuanUtil.convert("16,409.02"));
System.out.println(ChineseYuanUtil.convert("1,409.50"));
System.out.println(ChineseYuanUtil.convert("6,007.14"));
System.out.println(ChineseYuanUtil.convert("1,680.32"));
System.out.println(ChineseYuanUtil.convert("325.04"));
System.out.println(ChineseYuanUtil.convert("4,321.00"));
System.out.println(ChineseYuanUtil.convert("0.05"));

System.out.println(ChineseYuanUtil.convert("1234,5678,9012.34"));
System.out.println(ChineseYuanUtil.convert("1000,1000,1000.10"));
System.out.println(ChineseYuanUtil.convert("9005,9009,9009.99"));
System.out.println(ChineseYuanUtil.convert("5432,0001,0001.01"));
System.out.println(ChineseYuanUtil.convert("1000,0000,1110.00"));
System.out.println(ChineseYuanUtil.convert("1010,0000,0001.11"));
System.out.println(ChineseYuanUtil.convert("1012,0000,0000.01"));
}

输出结果：

壹万陆仟肆佰零玖元零贰分
壹仟肆佰零玖元伍角
陆仟零柒元壹角肆分
壹仟陆佰捌拾元叁角贰分
叁佰贰拾伍元零肆分
肆仟叁佰贰拾壹元整
伍分
壹仟贰佰叁拾肆亿伍仟陆佰柒拾捌万玖仟零壹拾贰元叁角肆分
壹仟亿零壹仟万零壹仟元壹角
玖仟零伍亿玖仟零玖万玖仟零玖元玖角玖分
伍仟肆佰叁拾贰亿零壹万零壹元零壹分
壹仟亿零壹仟壹佰壹拾元整
壹仟零壹拾亿零壹元壹角壹分
壹仟零壹拾贰亿元零壹分

转载于:https://www.cnblogs.com/weisenz/archive/2012/09/05/2672176.html

展开全文
• 有时候一些金额数字需要中文大写展示到发票的金额框这类地方，包括一些纯粹的数量非金额数字的大写转换，网上看很多都是金额的，纯数字的话有些不同，这里写了一个数字转中文大写的工具类： 1：金额数字转...

有时候一些金额数字需要转成中文大写展示到发票的金额框这类地方，包括一些纯粹的数量非金额的数字的大写转换，网上看很多都是金额的，纯数字的话有些不同，这里写了一个数字转中文大写的工具类：

1：金额数字转中文；

2：数字转大写 ：100 = 壹佰；

3：数字转大写 ：100 = 壹佰零拾零；

有啥意见欢迎交流，好用点个赞哇！哈哈

package com.syncsoft.service.center.util;

/**
* 数字转大写工具类
* @Author 郑鸿钦
* @CreatedTime 2019/12/21
*/
public class NumberToChineseUtil {

private static final String UNIT = "万千佰拾亿千佰拾万千佰拾元角分";
private static final String SL_UNIT = "万千佰拾亿千佰拾万千佰拾 ";
private static final String DIGIT = "零壹贰叁肆伍陆柒捌玖";
private static final double MAX_VALUE = 9999999999999.99D;

// 金额转中文
public static String moneyToChinese(double v) {
String prefix = "";
if(v < 0 ) {
prefix = "负";
v = Math.abs(v);
}
if (v > MAX_VALUE) {
return "参数非法!";
}

long l = Math.round(v * 100);
if (l == 0) {
return "零元整";
}
String strValue = l + "";
// i用来控制数
int i = 0;
// j用来控制单位
int j = UNIT.length() - strValue.length();
String rs = "";
boolean isZero = false;
for (; i < strValue.length(); i++, j++) {
char ch = strValue.charAt(i);
if (ch == '0') {
isZero = true;
if (UNIT.charAt(j) == '亿' || UNIT.charAt(j) == '万' || UNIT.charAt(j) == '元') {
rs = rs + UNIT.charAt(j);
isZero = false;
}
} else {
if (isZero) {
rs = rs + "零";
isZero = false;
}
rs = rs + DIGIT.charAt(ch - '0') + UNIT.charAt(j);
}
}
if (!rs.endsWith("分")) {
rs = rs + "整";
}
rs = rs.replaceAll("亿万", "亿");
return prefix + rs;
}

/**
* 数字转大写 ：100 = 壹佰
* @param v 数字
* @return
* @Author 郑鸿钦
* @CreatedTime 2019/12/21
*/
// 数量转中文
public static String slToChinese(double v) {
String prefix = "";
if(v < 0 ) {
prefix = "负";
v = Math.abs(v);
}
if (v > MAX_VALUE) {
return "参数非法!";
}

long l = Math.round(v);
if (l == 0) {
return "零";
}
String strValue = l + "";
// i用来控制数
int i = 0;
// j用来控制单位
int j = SL_UNIT.length() - strValue.length();
String rs = "";
boolean isZero = false;
for (; i < strValue.length(); i++, j++) {
char ch = strValue.charAt(i);
if (ch == '0') {
isZero = true;
if (SL_UNIT.charAt(j) == '亿' || SL_UNIT.charAt(j) == '万' ) {
rs = rs + SL_UNIT.charAt(j);
isZero = false;
}
} else {
if (isZero) {
rs = rs + "零";
isZero = false;
}
rs = rs + DIGIT.charAt(ch - '0') + SL_UNIT.charAt(j);
}
}
rs = rs.replaceAll("亿万", "亿");
return prefix + rs;
}

/**
* 数字转大写 ：100 = 壹佰零拾零
* @param userInput
* @return
* @Author 郑鸿钦
* @CreatedTime 2019/12/21
*/
public static String transFormation(String userInput) {
//1.定义一个匹配数组
char[] capitaLization = {'零', '壹', '贰', '叁', '肆', '伍', '陆', '柒', '捌', '玖'};
char[] company = {'拾', '佰', '仟','万'};

//2.把传入的字符串转换为数组遍历进行替换数字
//2.1定义一个字符串存储拼接
String p = "";
//2.2定义字符串变量用作返回值
String numFinal = "";
//字符串转换为数字
char[] ps = userInput.toCharArray();

//定义变量统计单位下标
int a = 0;
//倒序循环字符串
for (int i = ps.length - 1; i >= 0; i--) {
//如果单位下标不越界
if(i == ps.length - 1){
p += capitaLization[Integer.parseInt(String.valueOf(ps[i]))];
}else if (a < company.length) {
p += String.valueOf(company[a]);
p += capitaLization[Integer.parseInt(String.valueOf(ps[i]))];
a++;
} else {
//如果下标越界了然下标回到1这里使用0
a = 0;
p += String.valueOf(company[0]);
p += capitaLization[Integer.parseInt(String.valueOf(ps[i]))];
a++;
}
}
//如果字符串长度大于9说明到亿位所以替换亿位和万位的单位
//1.替换好的字符串转为数组 玖拾捌佰柒仟陆拾伍佰肆仟叁拾贰佰壹
char[] userI = p.toCharArray();
//如果字符数组长度大于17则说明有亿位
if(userI.length>=17){
//替换亿位单位15
userI[15] = '亿';
}
//反转字符数组
//倒循环数组对p赋值
for (int i = userI.length-1; i >=0; i--) {
numFinal += String.valueOf(userI[i]);
}
return numFinal;
}

public static void main(String[] args) {
String numStr = "21";
System.out.println(NumberToChineseUtil.moneyToChinese(21.00));
System.out.println(NumberToChineseUtil.transFormation(numStr));
}

}

展开全文
• java数字转中文大写，钱中文，格式化钱，自己写的，有小数，元角分
• 前言：输入数字金额参数，运行程序得到其对应的大写中文金额；例如：输入 12.56，输出 12.56 ： 壹拾贰元伍角陆分。代码：/*** @Title: ConvertUpMoney* @Description: 将数字金额转换为大写中文金额* @date: 2019年...
• 前言： 网上很多算法都是到亿就gg了，目前的算法能到大数，什么是大数？来张图了解下 算法可以到1000大数，也就是10的75次方，不过一般...示例二：大数字转换 Integer.MAX_VALUE都不想演示了，直接Long.MAX_VALUE
• 不多说上代码，亲测有效，... * 大写汉字转为阿拉伯数字 * @author gyd * */ public class ChineseChangeToNumber { /** * 中文简体 */ public static final String[] RMB_NUMBERS = new String[] {"一","二",
• * 金额转换工具类 */ public class MoneyUtils { private static final String UNIT = "万千佰拾亿千佰拾万千佰拾元角分"; private static final String DIGIT = "零壹贰叁肆伍陆柒捌玖"; private static final...
• 输入字符，通过正则验证是否为金额不超过万亿精确到小数点后两位，然后将数字转换为大写 包括后台java正则验证及前台js验证 请输入一个数字（精确到小数点后两位）： fdsa54325.54 fdsa54325.54 false 请输入一个...
• 本文实例为大家分享了java阿拉伯数字转换成中文数字的具体代码，供大家参考，具体内容如下package org.lulu.learn.work;import java.io.*;/*** Project: Day07* Created: Lulu* Date: 2016/8/5*/public class Work02...
• 最近做解析描述时提取到金额字段后，需要将文本中的大写金额转换成数字，然而发现... * 大写金额转数字 * */ public static String ChineseConvertToNumber(String chineseAmount) { if (chineseAmount == null |.
• 前言：输入数字金额参数，运行程序得到其对应的大写中文金额；例如：输入 12.56，输出 12.56 ： 壹拾贰元伍角陆分；重点来了：本人亲测有效。奉上代码：/*** @Title: ConvertUpMoney* @Description: 将数字金额转换...
• MoneyUtil.javapublic class MoneyUtil {public static String[] chineseDigits = new String[] { "零", "壹", "贰", "叁.../*** 把金额转换为汉字表示的数量，小数点后四舍五入保留两位* @param amount* @return*/p...
• 这里写自定义目录标题java方法集：大写金额转换数字 ... * 中文金额转数字工具 * @date 2022/02/25 13:44 * 金额大写规则参考 * https://baike.baidu.com/item/%E5%A4%A7%E5%86%99%E9%87%91%E9%A2%9D/1
• importjava.util.HashMap;importjava.util.Map;/****@authorjavens*偶尔网上看到这个题目，现在做不下去了！求高手继续做！*程序已经...package com.javens.test;import java.util.HashMap;import java.util.Map;/**...
• 可以把金额数值转为财务上常用的金额大写，如100元 转为壹佰园
• Java实现阿拉伯数字转大写中文

...

java 订阅