System.out.println(cnFmt.format(1000001009));
输出
壹拾零亿零仟零佰零拾零万壹仟零佰零拾玖元整
这个结果不好
锁定老帖子 主题:Java实现的数字中文大写(正写)转换
精华帖 (0) :: 良好帖 (0) :: 新手帖 (1) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2013-04-17
import java.text.DecimalFormat; import java.text.NumberFormat; /** * 中文数字格式化,将数字转换成中文大写形式,以及将中文大写形式转换成数字 * @title CNNumberFormat.java * @author chouhua * @date 2013-4-16 */ public class CNNumberFormat { /** * 中文数字正写 */ private static final char[] cnNumbers = { '零', '壹', '贰', '叁', '肆', '伍', '陆', '柒', '捌', '玖' }; private static final char[] stdNumbers = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' }; /** * 货币单位 */ // 顺序不能变,否则下面的实现代码页需要同步修改 private static final char[] units = { '厘', '分', '角', '元', '拾', '佰', '仟', '万', '拾', '佰', '仟', '亿', '拾', '佰', '仟' }; /** * 是否输出货币单位元角分的完整格式,简单格式通常用于套打纸张上已印有货币单位的情形。 */ private boolean fullFormat = true; public CNNumberFormat() { } public CNNumberFormat(boolean fullFormat) { this.fullFormat = fullFormat; } /** * 取得大写形式的字符串 * @return 中文正写的数字字符串 */ public String format(double d) { NumberFormat nf = new DecimalFormat("#.###"); String original = String.valueOf(nf.format(d)); return this.transform(original); } public String format(long ln) { return this.transform(String.valueOf(ln)); } private String transform(String original) { String integerPart = ""; String floatPart = ""; if (original.indexOf(".") > -1) { int dotIndex = original.indexOf("."); integerPart = original.substring(0, dotIndex); floatPart = original.substring(dotIndex + 1); } else { integerPart = original; } StringBuffer sb = new StringBuffer(); // 整数部分处理 for (int i = 0; i < integerPart.length(); i++) { int number = Integer .parseInt(String.valueOf(integerPart.charAt(i))); sb.append(cnNumbers[number]); if (fullFormat) { sb.append(units[integerPart.length() + 2 - i]); } } // 小数部分处理 if (floatPart.length() >= 1) { for (int i = 0; i < floatPart.length(); i++) { int number = Integer.parseInt(String.valueOf(floatPart .charAt(i))); sb.append(cnNumbers[number]); if (fullFormat && i < 3) { sb.append(units[2 - i]); } } } else if (fullFormat) { sb.append('整'); } return sb.toString(); } /** * 将中文大写数字字符串转换成对应的数字类型 * @param cnNumStr * @return Java Number类型对象 */ public Number parse(String cnNumStr) { if (null == cnNumStr || "".equals(cnNumStr.trim())) { return null; } cnNumStr = cnNumStr.replaceAll("整", ""); if (!cnNumStr.endsWith("元")) { cnNumStr = cnNumStr.replaceAll("元", "."); } for (int i = 0; i < cnNumbers.length; i++) { cnNumStr = cnNumStr.replace(cnNumbers[i], stdNumbers[i]); } for (int j = 0; j < units.length; j++) { cnNumStr = cnNumStr.replaceAll(units[j] + "", ""); } BigDecimal b = new BigDecimal(cnNumStr); return b; } /** * @param args */ public static void main(String[] args) { CNNumberFormat cnFmt = new CNNumberFormat(true); System.out.println(cnFmt.format(123456789.12345)); System.out.println(cnFmt.format(123456789)); System.out.println(cnFmt.format(.123456789)); System.out.println(cnFmt.format(0.1234)); System.out.println(cnFmt.format(1)); System.out.println(cnFmt.format(12)); System.out.println(cnFmt.format(123)); System.out.println(cnFmt.format(1234)); System.out.println(cnFmt.format(12345)); System.out.println(cnFmt.format(123456)); System.out.println(cnFmt.format(1234567)); System.out.println(cnFmt.format(12345678)); System.out.println(cnFmt.format(123456789)); System.out.println(cnFmt.parse("壹亿贰仟叁佰肆拾伍万陆仟柒佰捌拾玖元壹角贰分叁厘")); } 运行结果: 壹亿贰仟叁佰肆拾伍万陆仟柒佰捌拾玖元壹角贰分叁厘 壹亿贰仟叁佰肆拾伍万陆仟柒佰捌拾玖元整 零元壹角贰分叁厘 零元壹角贰分叁厘 壹元整 壹拾贰元整 壹佰贰拾叁元整 壹仟贰佰叁拾肆元整 壹万贰仟叁佰肆拾伍元整 壹拾贰万叁仟肆佰伍拾陆元整 壹佰贰拾叁万肆仟伍佰陆拾柒元整 壹仟贰佰叁拾肆万伍仟陆佰柒拾捌元整 壹亿贰仟叁佰肆拾伍万陆仟柒佰捌拾玖元整 123456789.123 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2013-04-19
能用,但提个建议吧
1、最好使用大数据对象处理 2、这个功能没必要封装成类,static方法更加灵活 3、处理的过程或许正则表达式能帮忙 |
|
返回顶楼 | |
发表时间:2013-04-19
试试4万亿
|
|
返回顶楼 | |
发表时间:2013-04-21
System.out.println(cnFmt.format(1000001009)); 输出 壹拾零亿零仟零佰零拾零万壹仟零佰零拾玖元整
这个结果不好 |
|
返回顶楼 | |
发表时间:2013-04-22
http://blog.csdn.net/lip009/article/details/1340814
7年前写的,仅供参考! |
|
返回顶楼 | |