package com.springboot.entity.utils;

import lombok.extern.slf4j.Slf4j;

/**
 * @author maniac
 * date:2019/07/14 09:56
 * @do 数字转换处理工具类
 */
@Slf4j
public class NumberTransformUtil {
    //阿拉伯数字转中文小写,基础数值
    private static final String[] BASE_LOW = {"零", "一", "二", "三", "四", "五", "六", "七", "八", "九"};
    //阿拉伯数字转中文小写,数字权重位
    private static final String[] UNIT_LOW = {"", "十", "百", "千", "万", "亿"};
    //阿拉伯数字转中文大写,基础数值
    private static final String[] BASE_CAP = {"零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖"};
    //阿拉伯数字转中文大写,数字权重位
    private static final String[] UNIT_CAP = {"", "拾", "佰", "仟", "万", "亿"};

/**
     * 转换阿拉伯数字为中文小写(int:0-2147483647)
     *
     * @param number 数字字符串
     * @return 转换后的中文小写字符串  空串为发生转换异常
     */
    public static String toLowercaseCh(String number) {
        return toChineseNumber(number, BASE_LOW, UNIT_LOW);
    }

/**
     * 转换阿拉伯数字为中文大写(int:0-2147483647)
     *
     * @param number 数字字符串
     * @return 转换后的中文大写字符串  空串为发生转换异常
     */
    public static String toCapitalCh(String number) {
        return toChineseNumber(number, BASE_CAP, UNIT_CAP);
    }

/**
     * 转换阿拉伯数字为中文小写(int:0-99)
     *
     * @param number 正整数
     * @return 中文小写字符串
     */
    public static String toLowercaseChWithinHundred(int number) {
        if (number < 0) {
            return BASE_LOW[0];
        } else if (number <= 9) {
            return BASE_LOW[number];
        } else {
            return BASE_LOW[number / 10] + UNIT_LOW[1] + BASE_LOW[number % 10];
        }
    }

/**
     * 转换阿拉伯数字为中文数字
     *
     * @param number  数字字符串
     * @param baseNum 基础数值集合
     * @param unitNum 数字权重位集合
     * @return 转换后的中文字符串  空串为发生转换异常
     */
    private static String toChineseNumber(String number, String[] baseNum, String[] unitNum) {
        int num;
        try {
            num = Integer.parseInt(number);
        } catch (Exception e) {
            log.info("【数据转换操作】字符串转Int类型出现异常,字符串:{},e:", number, e);
            return "";
        }
        if (num < 0) {
            return baseNum[0];
        } else if (num <= 9) {                                                                                            
            return baseNum[num];
        }
        if (number.length() <= 4) {
            return dealNumberFragment(number, baseNum, unitNum);
        } else if (number.length() <= 8) {
            String fragmentOne = number.substring(number.length() - 4);
            String resultOne = dealNumberFragment(fragmentOne, baseNum, unitNum);
            String fragmentTwo = number.substring(0, number.length() - 4);
            String resultTwo = dealNumberFragment(fragmentTwo, baseNum, unitNum);
            return resultTwo + unitNum[4] + resultOne;
        } else {//int 最长为10位数字字符串
            String fragmentOne = number.substring(number.length() - 4);
            String resultOne = dealNumberFragment(fragmentOne, baseNum, unitNum);
            String fragmentTwo = number.substring(number.length() - 8, number.length() - 4);
            String resultTwo = 
            if (!"0000".equals(fragmentTwo)) {//判断是否追加万字
              resultTwo  = dealNumberFragment(fragmentTwo, baseNum, unitNum)+ unitNum[4];
            }else{
                if (!"0000".equals(fragmentOne)) {//权重万 为0000 但是0-9999 不为0000 则需补零
                    resultTwo = baseNum[0];
                }
            }
            String fragmentThree = number.substring(0, number.length() - 8);
            String resultThree = dealNumberFragment(fragmentThree, baseNum, unitNum);
            return resultThree + unitNum[5] + resultTwo + unitNum[4] + resultOne;
        }
    }

/**
     * 转换阿拉伯数字为中文小写(int:0-9999)
     *
     * @param number  数字字符串
     * @param baseNum 基础数字数组
     * @param unitNum 权重数组
     * @return 中文字符串
     */
    private static String dealNumberFragment(String number, String[] baseNum, String[] unitNum) {
        StringBuilder result = new StringBuilder();
        int dealNum = Integer.parseInt(number);
        boolean preFlag = false;//标识上一个余数是否为0 true 为0 false 不为0
        for (int i = number.length() - 1; i >= 0; i--) {
            int remainder = dealNum % 10;
            dealNum = dealNum / 10;
            if (0 == remainder) {//用于处理连续为0的情况
                preFlag = true;
            } else {
                if (preFlag) {//上一个是0 当前不是0
                    result.insert(0, baseNum[0]);
                    result.insert(0, baseNum[remainder] + unitNum[number.length() - 1 - i]);
                    preFlag = false;
                } else {
                    result.insert(0, baseNum[remainder] + unitNum[number.length() - 1 - i]);
                    preFlag = false;
                }
            }
        }
        //补全首位的零  补零操作需放在去零操作的前面解决处理 “0000”情况
        if (number.startsWith("0")) {
            result.insert(0, baseNum[0]);
        }
        //去掉末尾的零
        if (number.endsWith("0")) {
            result.deleteCharAt(result.length() - 1);
        }
        return result.toString();
    }

private NumberTransformUtil() {
    }
}

阿拉伯数字转中文大写和中文小写封装工具类相关推荐

  1. 四、EasyExcel实现Excel读写,封装工具类

    在项目中,我们经常用到EasyExcel框架实现:对Excel文件的读写操作.为了方便后续其他项目中的使用,将对Excel文件的读写操作,封装成工具类. 一.EasyExcel实现Excel读写,封装 ...

  2. JAVA——Okhttp封装工具类

    基本概念 OKhttp:一个处理网络请求的开源项目,是安卓端最火热的轻量级框架. Maven <!--OK HTTP Client--><dependency><grou ...

  3. android文件读取工具类,Android 下读取Assets Properties操作封装工具类

    Android 下读取Assets Properties操作封装工具类 发布时间:2018-06-03作者:laosun阅读(2081) 为了方便使用,首先创建BaseApplication类,如下所 ...

  4. 数据库MySQL基础---JDBC开发步骤--JDBC封装工具类--PreparedStatement实现CRUD操作

    JDBC简介 1.JDBC定义Java数据库连接(Java Database Connectivity,简称JDBC):是Java语言中用来规范客户端程序如何来访问数据库的应用程序接口,提供了诸如查询 ...

  5. JAVA之旅(五)——this,static,关键字,main函数,封装工具类,生成javadoc说明书,静态代码块...

    JAVA之旅(五)--this,static,关键字,main函数,封装工具类,生成javadoc说明书,静态代码块 周末收获颇多,继续学习 一.this关键字 用于区分局部变量和成员变量同名的情况 ...

  6. 如何调用封装工具类调用网上接口查询工作日

    如何调用封装工具类调用网上接口查询工作日 这里的编辑器是STS,用的springboot集成环境: 先引进pom.xml依赖包 <?xml version="1.0" enc ...

  7. 仿京东APP分类页面(mvp模式+OkHttp封装工具类+拦截器+弱引用回收)

    仿京东APP分类页面: 添加依赖 compile 'com.android.support:recyclerview-v7:24.0.0' compile 'com.google.code.gson: ...

  8. Spring Boot 整合 SpringDataNeo4j 并封装工具类解析PathValue

    Spring Boot 整合 SpringDataNeo4j 并封装工具类解析PathValue 一.Neo4j 二.Neo4j客户端浏览器 三.maven依赖 四.节点/关系映射 1.NodePer ...

  9. MySQL JDBC常用知识,封装工具类,时区问题配置,SQL注入问题

    JDBC JDBC介绍 Sun公司为了简化开发人员的(对数据库的统一)操作,提供了(Java操作数据库的)规范,俗称JDBC,这些规范的由具体由具体的厂商去做 对于开发人员来说,我们只需要掌握JDBC ...

最新文章

  1. DNS--3--Master DNS架设
  2. python单例类命名_单例模式(java/python/c++)
  3. vs怎么把textbox输入的实数放置变量里_方程的计算机处理96(3)_C++vs
  4. LeetCode MySQL 1097. 游戏玩法分析 V
  5. NB-IoT将给智能锁行业带来哪些影响?
  6. Java多线程学习三十九:CAS 有什么缺点?
  7. LTI系统对WSS Processes的作用
  8. ImportError: cannot import name ‘activations‘ from ‘keras.layers‘
  9. 天地图JS API制作专题图
  10. 本地文件怎么传到linux服务器,本地文件传到linux服务器
  11. 支付宝小程序前端开发简介
  12. vue中的attribute 和 property 是什么意思
  13. 什么是VHDL?一文带你了解VHDL语言
  14. ssh mysql 导出excel_使用ssh远程执行命令批量导出数据库到本地(转)
  15. MongoDB数据迁移之迁移工具Kettle
  16. Windows11安卓子系统使用贷理登录谷歌框架
  17. Microsoft Office for Mac 报错
  18. 提供3Dmax,Zbrush,C4D,MAYA,MD,进来看看
  19. 2019南京帆软春招
  20. 【Multisim仿真】CD4017+555流水灯

热门文章

  1. 计算机毕设 Springboot+Vue在线答疑系统 高考咨询在线答疑系统 在线作业答疑系统Java Vue MySQL数据库 远程调试 代码讲解
  2. 技校计算机课程教学课件,技工学校计算机应用基础教学
  3. 360云盘不给力,只能上限200M,还是新浪微盘给力
  4. QQ思维导图--消息模块
  5. 代账行业急需标准,良莠不齐成为过去!
  6. 昨天帮朋友转一个CAD文件
  7. DNA框架下error in opening zip file
  8. 分析软件创业者的几个素质
  9. 网络摄像头监控中什么情况下需要使用流媒体转发服务器?
  10. cos图像(cos图像周期)