网上找了一圈,都不合我意,自己花点时间写了一下。
数字不好,逻辑差了点,性能应该还可以。
如果需要修改为转财务大写或转换为语音文件的,可以简单把汉字改一个就行。
package com.lixor;
import java.util.ArrayList;
import java.util.Collections;
/**
* 数字转中文。最大支持到万亿级别。
*
* @author alex
*
*/
public class Num2CN {
/**
* 单位进位,中文默认为4位即(万、亿)
*/
public int UNIT_STEP = 4;
/**
* 单位
*/
public String[] CN_UNITS = new String[] { "个", "十", "百", "千", "万", "十",
"百", "千", "亿", "十", "百", "千", "万" };
/**
* 汉字
*/
public String[] CN_CHARS = new String[] { "零", "一", "二", "三", "四",
"五", "六", "七", "八", "九" };
/**
* 数值转换为中文字符串
*
* @param num
* 需要转换的数值
* @return
*/
public String cvt(long num) {
return this.cvt(num, false);
}
/**
* 数值转换为中文字符串(口语化)
*
* @param num
* 需要转换的数值
* @param isColloquial
* 是否口语化。例如12转换为'十二'而不是'一十二'。
* @return
*/
public String cvt(long num, boolean isColloquial) {
String[] result = this.convert(num, isColloquial);
StringBuffer strs = new StringBuffer(32);
for (String str : result) {
strs.append(str);
}
return strs.toString();
}
/**
* 将数值转换为中文
*
* @param num
* 需要转换的数值
* @param isColloquial
* 是否口语化。例如12转换为'十二'而不是'一十二'。
* @return
*/
public String[] convert(long num, boolean isColloquial) {
if (num < 10) {// 10以下直接返回对应汉字
return new String[] { CN_CHARS[(int) num] };// ASCII2int
}
char[] chars = String.valueOf(num).toCharArray();
if (chars.length > CN_UNITS.length) {// 超过单位表示范围的返回空
return new String[] {};
}
boolean isLastUnitStep = false;// 记录上次单位进位
ArrayList<String> cnchars = new ArrayList<String>(chars.length * 2);// 创建数组,将数字填入单位对应的位置
for (int pos = chars.length - 1; pos >= 0; pos--) {// 从低位向高位循环
char ch = chars[pos];
String cnChar = CN_CHARS[ch - '0'];// ascii2int 汉字
int unitPos = chars.length - pos - 1;// 对应的单位坐标
String cnUnit = CN_UNITS[unitPos];// 单位
boolean isZero = (ch == '0');// 是否为0
boolean isZeroLow = (pos + 1 < chars.length && chars[pos + 1] == '0');// 是否低位为0
boolean isUnitStep = (unitPos >= UNIT_STEP && (unitPos % UNIT_STEP == 0));// 当前位是否需要单位进位
if (isUnitStep && isLastUnitStep) {// 去除相邻的上一个单位进位
int size = cnchars.size();
cnchars.remove(size - 1);
if (!CN_CHARS[0].equals(cnchars.get(size - 2))) {// 补0
cnchars.add(CN_CHARS[0]);
}
}
if (isUnitStep || !isZero) {// 单位进位(万、亿),或者非0时加上单位
cnchars.add(cnUnit);
isLastUnitStep = isUnitStep;
}
if (isZero && (isZeroLow || isUnitStep)) {// 当前位为0低位为0,或者当前位为0并且为单位进位时进行省略
continue;
}
cnchars.add(cnChar);
isLastUnitStep = false;
}
Collections.reverse(cnchars);
// 清除最后一位的0
int chSize = cnchars.size();
String chEnd = cnchars.get(chSize - 1);
if (CN_CHARS[0].equals(chEnd) || CN_UNITS[0].equals(chEnd)) {
cnchars.remove(chSize - 1);
}
// 口语化处理
if (isColloquial) {
String chFirst = cnchars.get(0);
String chSecond = cnchars.get(1);
if (chFirst.equals(CN_CHARS[1]) && chSecond.startsWith(CN_UNITS[1])) {// 是否以'一'开头,紧跟'十'
cnchars.remove(0);
}
}
return cnchars.toArray(new String[] {});
}
public static void main(String[] args) {
String[] testData = ("0,1,2,3,4,5,6,7,8,9,"
+ "10,11,20,91,"
+ "110,102,1234,1023,1002,"
+ "10000,12345,10234,10023,10002,12034,12003,12000,12300,12340,"
+ "100000,123456,102345,200234,100023,100002,120345,120034,120003,120000,123000,123400,123450,"
+ "1000000,1234567,2023456,1002345,3000234,1000023,1000002,1203456,1200345,1200034,1200003,1200000,1230000,1234000,1234500,1234560,"
+ "10000000,12345678,10234567,10023456,10002345,10000234,10000023,12034567,12003456,12000345,12000034,12000003,12000000,12300000,12340000,12345600,12345670,"
+ "1000000000,1234567890,1023456789,1002300078,1000230067,1000023456,1000002345,1203456789,1200345678,1200034567,1200003456,1200000345,1200000034,1200000003,1230000000,1234000000,1234500000,1234560000,1234567000,1234567800,1234567890,"
+ String.valueOf(Integer.MAX_VALUE)
+ ",9223372036854,9002233007200").split(",");
for (String data : testData) {
long num = Long.parseLong(data);
if (num < 0) {
continue;
}
System.out.println(String.format("%-12s \t %s", data,
new Num2CN().cvt(num,true)));
}
}
}
运行结果
0 零
1 一
2 二
3 三
4 四
5 五
6 六
7 七
8 八
9 九
10 十
11 十一
20 二十
91 九十一
110 一百一十
102 一百零二
1234 一千二百三十四
1023 一千零二十三
1002 一千零二
10000 一万
12345 一万二千三百四十五
10234 一万零二百三十四
10023 一万零二十三
10002 一万零二
12034 一万二千零三十四
12003 一万二千零三
12000 一万二千
12300 一万二千三百
12340 一万二千三百四十
100000 十万
123456 十二万三千四百五十六
102345 十万二千三百四十五
200234 二十万零二百三十四
100023 十万零二十三
100002 十万零二
120345 十二万零三百四十五
120034 十二万零三十四
120003 十二万零三
120000 十二万
123000 十二万三千
123400 十二万三千四百
123450 十二万三千四百五十
1000000 一百万
1234567 一百二十三万四千五百六十七
2023456 二百零二万三千四百五十六
1002345 一百万二千三百四十五
3000234 三百万零二百三十四
1000023 一百万零二十三
1000002 一百万零二
1203456 一百二十万三千四百五十六
1200345 一百二十万零三百四十五
1200034 一百二十万零三十四
1200003 一百二十万零三
1200000 一百二十万
1230000 一百二十三万
1234000 一百二十三万四千
1234500 一百二十三万四千五百
1234560 一百二十三万四千五百六十
10000000 一千万
12345678 一千二百三十四万五千六百七十八
10234567 一千零二十三万四千五百六十七
10023456 一千零二万三千四百五十六
10002345 一千万二千三百四十五
10000234 一千万零二百三十四
10000023 一千万零二十三
12034567 一千二百零三万四千五百六十七
12003456 一千二百万三千四百五十六
12000345 一千二百万零三百四十五
12000034 一千二百万零三十四
12000003 一千二百万零三
12000000 一千二百万
12300000 一千二百三十万
12340000 一千二百三十四万
12345600 一千二百三十四万五千六百
12345670 一千二百三十四万五千六百七十
1000000000 十亿
1234567890 十二亿三千四百五十六万七千八百九十
1023456789 十亿二千三百四十五万六千七百八十九
1002300078 十亿零二百三十万零七十八
1000230067 十亿零二十三万零六十七
1000023456 十亿零二万三千四百五十六
1000002345 十亿零二千三百四十五
1203456789 十二亿零三百四十五万六千七百八十九
1200345678 十二亿零三十四万五千六百七十八
1200034567 十二亿零三万四千五百六十七
1200003456 十二亿零三千四百五十六
1200000345 十二亿零三百四十五
1200000034 十二亿零三十四
1200000003 十二亿零三
1230000000 十二亿三千万
1234000000 十二亿三千四百万
1234500000 十二亿三千四百五十万
1234560000 十二亿三千四百五十六万
1234567000 十二亿三千四百五十六万七千
1234567800 十二亿三千四百五十六万七千八百
1234567890 十二亿三千四百五十六万七千八百九十
2147483647 二十一亿四千七百四十八万三千六百四十七
9223372036854 九万二千二百三十三亿七千二百零三万六千八百五十四
9002233007200 九万零二十二亿三千三百万七千二百
分享到:
相关推荐
主要为大家详细介绍了java实现数字转换人民币中文大写工具,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
人民币数字转换成汉字大写 android Java 运行效率
独立开发,实测可用, 将阿拉伯和中文数字组合的字符串转成阿拉伯数字的整型 包。例如: “八万三千20”就可以转成整型 803020 。解压后,引用包。调用方法 在UnitTest.java 中有
java 阿拉伯数字转化中文大写。包括小数点的操作。是转化的源代码。可以参考这修改出所需格式。
将数字转为中文金额的大写方式(Java版) 博文链接:https://lovinchan.iteye.com/blog/202768
java将字符串中数字转换为中文大写,在输出字符串java将字符串中数字转换为中文大写,在输出字符串java将字符串中数字转换为中文大写,在输出字符串java将字符串中数字转换为中文大写,在输出字符串java将字符串中数字...
java 把数字转成中文大写,钱转成中文,格式化钱,自己写的,有小数,元角分
将数字金额转换为大写汉字的java工具类,方便财务相关开发转换金额。
用java实现将阿拉伯数字转换为金额的汉字大写
java程序代码,阿拉伯数字转化为大写
用java代码 实现金额阿拉伯数字 转成 中文汉字大写形式
java实现中文排序,按数字字母汉字的顺序进行排序
输入10亿以下的数字,自动转成大写中文的字符串,如输入920807080,则返回玖亿贰仟萬零捌拾萬零柒仟零捌拾
将小写数字变大写 如 输入1234567 可以输出一二三四五六七
将阿拉伯数字金额转成中文大写 "零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖"......
将阿拉伯数字转化成汉字金钱 如1234.45转化为壹仟贰佰叁拾肆元肆角伍分
在做商业领域中,开发票、支票等与金钱相关的项目时通常会遇到要求把数字转换成中文大写。诸如“壹拾圆陆角玖分”。借鉴网友成熟的想法,再加上我周密的思考,最终形成此代码。压缩包中仅包含一个java文件,里面仅有...
网上有很多类似的代码,试了很多个都有这样哪样的错误。这个是我参照修改的,最大到“万亿”只这一点已经很少有实现了的代码了。需要更大数的扩充很方便。看看代码就知道了。关于 万 、亿 、零 等的处理也近乎完美。...
主要为大家详细介绍了Java将数字金额转为大写中文金额,具有一定的参考价值,感兴趣的小伙伴们可以参考一下