货币金额大写转换工具类

import java.math.BigDecimal;
import java.math.RoundingMode;
import java.text.DecimalFormat;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.regex.Matcher;
import java.util.regex.Pattern;public class ChineseCurrencyUtils {// region regex for replaceprivate static final Pattern RE_ONE_0A = Pattern.compile("零分", Pattern.LITERAL);private static final Pattern RE_ONE_0B0A = Pattern.compile("零角零分", Pattern.LITERAL);private static final Pattern RE_ONE_G0F = Pattern.compile("亿零万", Pattern.LITERAL);private static final Pattern RE_ONE_H0G = Pattern.compile("兆零亿", Pattern.LITERAL);private static final Pattern RE_ONE_I0H = Pattern.compile("京零兆", Pattern.LITERAL);private static final Pattern RE_ONE_J0I = Pattern.compile("垓零京", Pattern.LITERAL);private static final Pattern RE_ONE_DOT = Pattern.compile(".", Pattern.LITERAL);// endregion// region regex for replaceAllprivate static final Pattern RE_ALL_0YZ = Pattern.compile("[零元整]");private static final Pattern RE_ALL_0_2_4 = Pattern.compile("零{2,4}");private static final Pattern RE_ALL_0_EDCB = Pattern.compile("零[仟佰拾角]");private static final Pattern RE_ALL_EDC_0_JIHGF = Pattern.compile("(?<=[仟佰拾])零(?=[垓京兆亿万])");private static final Pattern RE_ALL_NEG = Pattern.compile("(?<=负)[垓京兆亿万仟佰拾]");// endregion// region BigDecimal['分', '角', '拾', '佰', '仟', '万', '亿', '兆', '京', '垓']// @formatter:off/** 分 */private static final BigDecimal DEC_A = new BigDecimal("0.01");/** 角 */private static final BigDecimal DEC_B = new BigDecimal("0.1");/** 拾 */private static final BigDecimal DEC_C = BigDecimal.TEN;/** 佰 */private static final BigDecimal DEC_D = new BigDecimal(100);/** 仟 */private static final BigDecimal DEC_E = new BigDecimal(1000);/** 万 */private static final BigDecimal DEC_F = new BigDecimal(1_0000);/** 亿 */private static final BigDecimal DEC_G = new BigDecimal(1_0000_0000);/** 兆 */private static final BigDecimal DEC_H = new BigDecimal(1_0000_0000_0000L);/** 京 */private static final BigDecimal DEC_I = new BigDecimal(1_0000_0000_0000_0000L);/** 垓 */private static final BigDecimal DEC_J = new BigDecimal("1E+20");// @formatter:on// endregion// region ['负', '零', '壹', '贰', '叁', '肆', '伍', '陆', '柒', '捌', '玖']private static final Map<Character, Integer> NUMERIC = new ConcurrentHashMap<>();static {NUMERIC.put('负', -1);NUMERIC.put('零', 0);NUMERIC.put('壹', 1);NUMERIC.put('贰', 2);NUMERIC.put('叁', 3);NUMERIC.put('肆', 4);NUMERIC.put('伍', 5);NUMERIC.put('陆', 6);NUMERIC.put('柒', 7);NUMERIC.put('捌', 8);NUMERIC.put('玖', 9);}// endregionprivate static String replace(Pattern target, String src, String replacement) {return target.matcher(src).replaceAll(Matcher.quoteReplacement(replacement));}private static String replaceAll(Pattern regex, String src, String replacement) {return regex.matcher(src).replaceAll(replacement);}/*** 货币金额大写转换 (万进位系统)** @param number* @return java.lang.String*/public static String toString(Number number) {char[] digit = {'负', '元', '空', '零', '壹', '贰', '叁', '肆', '伍', '陆', '柒', '捌', '玖'};final String unit = "分角元拾佰仟万拾佰仟亿拾佰仟兆拾佰仟京拾佰仟垓";final String input = new DecimalFormat("#0.00").format(number);StringBuilder buff = new StringBuilder();int idx = input.lastIndexOf('.');final String lft = input.substring(0, idx);for (int i = lft.length() - 1, j = 3, len = unit.length(); i >= 0 && j < len; i--, j++) {buff.append(digit[lft.charAt(i) - '-']).append(i > 0 ? unit.charAt(j) : "");}buff.reverse().append(unit.charAt(2));final String rgt = input.substring(idx + 1);for (int i = 0, j = 1, len = rgt.length(); i < len && j >= 0; i++, j--) {buff.append(digit[rgt.charAt(i) - '-']).append(unit.charAt(j));}String chinese = buff.toString();chinese = replace(RE_ONE_0B0A, chinese, "整");chinese = replace(RE_ONE_0A, chinese, "");chinese = replaceAll(RE_ALL_0_EDCB, chinese, "零");chinese = replaceAll(RE_ALL_0_2_4, chinese, "零");chinese = replace(RE_ONE_G0F, chinese, "亿");chinese = replace(RE_ONE_H0G, chinese, "兆");chinese = replace(RE_ONE_I0H, chinese, "京");chinese = replace(RE_ONE_J0I, chinese, "垓");chinese = replaceAll(RE_ALL_EDC_0_JIHGF, chinese, "");chinese = replaceAll(RE_ALL_NEG, chinese, "数");return chinese;}/*** 货币金额大写转换 (万进位系统)** @param number* @return java.lang.String*/public static String toChinese(Number number) {String input = new DecimalFormat("#0.00").format(number);input = replace(RE_ONE_DOT, input, "");char[] digit = {'负', '元', '空', '零', '壹', '贰', '叁', '肆', '伍', '陆', '柒', '捌', '玖'};String unit = "仟佰拾垓仟佰拾京仟佰拾兆仟佰拾亿仟佰拾万仟佰拾元角分";int uLen = unit.length(), iLen = input.length();StringBuilder buff = new StringBuilder(unit);for (int i = input.length() - 1; i >= 0; i--) {buff.insert(uLen - iLen + i, digit[(input.charAt(i) - '-')]);}String chinese = buff.substring(uLen - iLen, uLen + iLen);chinese = replace(RE_ONE_0B0A, chinese, "整");chinese = replace(RE_ONE_0A, chinese, "");chinese = replaceAll(RE_ALL_0_EDCB, chinese, "零");chinese = replaceAll(RE_ALL_0_2_4, chinese, "零");chinese = replace(RE_ONE_G0F, chinese, "亿");chinese = replace(RE_ONE_H0G, chinese, "兆");chinese = replace(RE_ONE_I0H, chinese, "京");chinese = replace(RE_ONE_J0I, chinese, "垓");chinese = replaceAll(RE_ALL_EDC_0_JIHGF, chinese, "");chinese = replaceAll(RE_ALL_NEG, chinese, "数");return chinese;}/*** 货币金额大写转换 (万进位系统)** @param chinese* @return java.lang.Number*/public static Number toNumber(String chinese) {String input = new String(chinese.toCharArray());input = replaceAll(RE_ALL_0YZ, input, "");// 负数标记 ['数'] *** 不可复位 ***boolean fn = false;// 常规标记 ['分', '角', '拾', '佰', '仟'] * 复位 *boolean fa = false, fb = false, fc = false, fd = false, fe = false;// 进位标记 ['万', '亿', '兆', '京', '垓'] *** 不可复位 ***boolean ff = false, fg = false, fh = false, fi = false, fj = false;BigDecimal all = BigDecimal.ZERO;// 从低位到高位计算for (int i = (input.length() - 1); i >= 0; i--) {// @formatter:offchar ch = input.charAt(i);if (ch == '分') { fa = true; continue; }else if (ch == '角') { fb = true; continue; }else if (ch == '拾') { fc = true; continue; }else if (ch == '佰') { fd = true; continue; }else if (ch == '仟') { fe = true; continue; }else if (ch == '万') { ff = true; continue; }else if (ch == '亿') { fg = true; continue; }else if (ch == '兆') { fh = true; continue; }else if (ch == '京') { fi = true; continue; }else if (ch == '垓') { fj = true; continue; }else if (ch == '数') { fn = true; continue; }// else do not any things// 当前数位中文转数字BigDecimal current = new BigDecimal(NUMERIC.getOrDefault(ch, 0));// 负数处理 ['数']if (fn) { all = current.multiply(all); break; }// else do not any things// 常规处理 ['分', '角', '拾', '佰', '仟']if (fa) { current = DEC_A.multiply(current); }else if (fb) { current = DEC_B.multiply(current); }else if (fc) { current = DEC_C.multiply(current); }else if (fd) { current = DEC_D.multiply(current); }else if (fe) { current = DEC_E.multiply(current); }// else do not any things// 进位处理 ['万', '亿', '兆', '京', '垓']if (fj) { current = DEC_J.multiply(current); }else if (fi) { current = DEC_I.multiply(current); }else if (fh) { current = DEC_H.multiply(current); }else if (fg) { current = DEC_G.multiply(current); }else if (ff) { current = DEC_F.multiply(current); }// else do not any things// 合并当前计数all = all.add(current);// 复位常规标记fe = fd = fc = fb = fa = false;// @formatter:on}return all.setScale(2, RoundingMode.HALF_UP);}public static void main(String[] args) {System.out.println("===== ===== ===== ===== ===== ===== ===== ===== =====");System.out.println("人民币 : " + toString(-9876_5432.1));System.out.printf("数字 : %,.2f\n", toNumber("负数玖仟捌佰柒拾陆万伍仟肆佰叁拾贰元壹角"));System.out.println("----- ----- ----- ----- ----- ----- ----- ----- -----");System.out.println("人民币 : " + toChinese(1010_0101_1011.01));System.out.printf("数字 : %,.2f\n", toNumber("壹仟零壹拾亿零壹佰零壹万壹仟零壹拾壹元零壹分"));System.out.println("===== ===== ===== ===== ===== ===== ===== ===== =====");}}

【Java】ChineseCurrencyUtils(货币金额大写转换工具类)相关推荐

  1. java常用地图坐标系转换工具类,支持谷歌,腾讯,百度等主流的地理坐标转换

    package com.shen.springboot.redis.util;import java.util.ArrayList; import java.util.HashMap; import ...

  2. java hh24miss_时间日期转换工具类,获取当前时间YYYYMMDD24HHMISS、YYYYMMDDHHMISS

    packagecom.ztesoft.iotcmp.util;importcom.ztesoft.zsmart.core.log.ZSmartLogger;importjava.sql.Timesta ...

  3. Java 全角半角转换工具类

    /*** @author: lee* @Date: 2018/11/29 09:56* @Description: 全角半角转换工具类*/ public class AsciiUtil {public ...

  4. 【转载】Java文件编码自动转换工具类

    本篇随笔主要介绍了一个用java语言写的将一个文件编码转换为另一个编码并不改变文件内容的工具类: 通过读取源文件内容,用URLEncoding重新编码解码的方式实现. 1 public class C ...

  5. Java 数据转换/进制转换 工具类

    public class ByteUtil {/*** 十六进制转为十进制*/public static String getHexToTen(String hex) {return String.v ...

  6. java inputtools_Java后台开发常用工具类

    本文涉及的工具类部分是自己编写,另一部分是在项目里收集的.工具类涉及数据库连接.格式转换.文件操作.发送邮件等等.提高开发效率,欢迎收藏与转载. 数据库连接工具类 数据库连接工具类--仅仅获得连接对象 ...

  7. Java金额转换工具类

    package com.healthy.prms.common.util;import java.math.BigDecimal;/*** @ClassName: RMBUtils* @Descrip ...

  8. java 视频转码工具类_JavaCV入门指南:FrameConverter转换工具类及CanvasFrame图像预览工具类(javaCV教程完结篇)...

    JavaCV入门指南:FrameConverter转换工具类及CanvasFrame图像预览工具类(javaCV教程完结篇) 前言 再此章之前,我们已经详细介绍和剖析了javacv的结构和ffmpeg ...

  9. java字体颜色编程_Java 字体颜色转换工具类 ColorUtil

    Java 字体颜色转换工具类 ColorUtil,Java 字体颜色转换工具类 ColorUtil-- import java.awt.Color; import jxl.format.Colour; ...

最新文章

  1. 获得插入行身份的最佳方法?
  2. 总结一些常用Android adb 命令
  3. Qt Creator连接Android设备
  4. pytorch开发环境准备(学习资料自备)
  5. Ubuntu-C++环境设置
  6. java slot_LocalVariableTable之 Slot 复用
  7. visual c++ 技术资料(网络收集)
  8. 递归——幂次方(洛谷 P1010)
  9. SqlAlchemy操作(一)
  10. SAP BTP 简介以及演化历史
  11. java用下划线分开字母和数字_数字文字中的Java 7下划线
  12. BI报表工具FineReport的使用2【帆软聚合报表设计,最常用功能】
  13. statusbar 纯白色的解决方案 android:fitsSystemWindows
  14. 压缩视频 HandBrake软件
  15. Life Restart 人生模拟器 网址
  16. netty自定义通讯协议校验魔数
  17. 汽车材料QC/T 944-2013ELV中多溴联苯(PBBs)和多溴二苯醚(PBDEs)的检测
  18. 咩话,event前总是要判定?
  19. 素人做知识付费,还有没有机会
  20. 刘汝佳 9.2.1 硬币问题

热门文章

  1. 怎么折腾怎么有。。。。。
  2. 13.Ubuntu20.04使用网线连接路由器无法上网
  3. Quartz从入门到精通(最详细基础-进阶-实战)
  4. Xml文件保存聊天记录
  5. 软件工程实践作业---软件评测
  6. 故障电弧探测器在某医院项目上的应用
  7. Scratch完美的初体验
  8. img水平居中、居左、居右方法
  9. 页面(HTML)优化的方法
  10. 计算机毕业设计之java+ssm公交站牌广告灯箱管理系统