写代码的四点:
1.明确需求。要做什么?
2.分析思路。要怎么做?(1,2,3……)
3.确定步骤。每一个思路要用到哪些语句、方法和对象。
4.代码实现。用具体的语言代码将思路实现出来。
学习新技术的四点:
1.该技术是什么?
2.该技术有什么特点?(使用需注意的方面)
3.该技术怎么使用?(写Demo)
4.该技术什么时候用?(在Project中的使用场景 )

----------------------早计划,早准备,早完成。-------------------------

代码如下:

package com.wy.test.other;/*** 人民币格式化工具* 用于将人民币小写金额转换成大写金额* 要点:1.区分金额是整数还是小数,需要分开处理;*       2.将金额数字倒序,便于同单位合并*       3.异常处理,判断数字中是否含有非法字符,有则return;*       4.数字中0的处理;*/
public class MoneyFormatUtil {//单位private static final char[] UNIT = {'亿', '拾', '佰', '仟', '万', '拾', '佰', '仟'};//大写金额模板private static final char[] TEMPLATE = {'零', '壹', '贰', '叁', '肆', '伍', '陆', '柒', '捌', '玖'};private String submoneyCN[] = {"", "拾", "佰", "仟"};                                    //表示数字位数的数组private String numberCNN[] = {"零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖"};    //大写数字的数组private static MoneyFormatUtil instance;/*** 获取类的实例** @return 类的实例*/public static MoneyFormatUtil getInstance() {if (instance == null) {instance = new MoneyFormatUtil();}return instance;}/*** 将人民币小写金额转换成大写金额** @return 转换后的大写金额*/public String convert(String money) {String formatCN = "";int point = money.indexOf(".");                //判断字符串是否包含小数点(不包含返回-1)if (point != -1) {//包含小数点的情况formatCN = decimalConversion(money, point);} else {formatCN = integerConversion(money);}return formatCN;}/*** 小数转换** @param decimalString 小数字符串(例:1234567.89  壹佰贰拾叁万肆仟伍佰陆拾柒元捌角玖分)* @param pointPosition 小数点在字符串中的位置* @return 转换后的大写金额*/private String decimalConversion(String decimalString, int pointPosition) {String formatDecimalString = "";String money1 = decimalString.substring(0, pointPosition);    //小数点之前的部分String money1_1 = (new StringBuffer(money1).reverse()).toString();//字符串倒序String money2 = decimalString.substring(pointPosition + 1);    //小数点之后的部分//异常处理for (int i = 0; i < money1.length(); i++) {if (!Character.isDigit(money1.charAt(i))) {return "数字中含有非法字符";}}for (int i = 0; i < money2.length(); i++) {if (!Character.isDigit(money2.charAt(i))) {return "数字中含有非法字符";}}if (money2.length() < 2) {                    //如果小数点后的部分少于两位,用"0"补齐if (money2.length() == 0) {money2 = "00";} else {money2 += "0";}} else {//如果小数点后的位数大于2位,则只前2位money2 = decimalString.substring(pointPosition + 1, pointPosition + 3);}int len = money1_1.length();            //字符串反转之后,小数点之前的字符位数int pos = len - 1;String sigle = "";boolean allhavenum = false;boolean havenum = false;boolean mark = false;                    //设置一个开关变量,若当前数为"0",将该值设为true;不为"0"时设为false/**以下代码为读出小数点左面的部分*/while (pos >= 0) {sigle = money1_1.substring(pos, pos + 1);//截取1位数字,比如数字1234.56,将左侧的字符串反转,值为4321,则截取的值为1/**读取“亿单元”的代码。* 假设读取10024531042.34。* 小数点左面反转后为:24013542001* pos的初始值为10* mark的初始值为false* havenum的初始值为false* */if (pos >= 8 && pos < 12) {if (!sigle.equals("0")) {         //如果当前值不为"0"if (!mark) {                 //如果当前值的前一位数不为"0"formatDecimalString += numberCNN[Integer.parseInt(sigle)] + submoneyCN[pos % 4];} else {                         //如果当前值不为"0",但该值的前一位数为"0"if (allhavenum) {             //如果在当前值之前有不为"0"的数字出现。该条件用来处理用户输入的如:0012.34的数值formatDecimalString += "零";}formatDecimalString += numberCNN[Integer.parseInt(sigle)] + submoneyCN[pos % 4];mark = false;}havenum = true;allhavenum = true;            //变量allhavenum表示小数点左面的数中是否有不为"0"的数字;true表示有,false表示无} else {                            //如果当前值为"0"mark = true;}if (pos % 4 == 0 && havenum) {            //如果当前数字为该单元的最后一位,并且该单元中有不为"0"的数字出现formatDecimalString += "亿";havenum = false;}}/**读取“万单元”的代码*/if (pos >= 4 && pos < 8) {if (!sigle.equals("0")) {if (!mark) {formatDecimalString += numberCNN[Integer.parseInt(sigle)] + submoneyCN[pos % 4];} else {if (allhavenum) {formatDecimalString += "零";}formatDecimalString += numberCNN[Integer.parseInt(sigle)] + submoneyCN[pos % 4];mark = false;}havenum = true;allhavenum = true;} else {mark = true;}if (pos % 4 == 0 && havenum) {formatDecimalString += "万";havenum = false;}}/**读取“个、十、百、千”的代码*/if (pos >= 0 && pos < 4) {if (!sigle.equals("0")) {if (!mark) {formatDecimalString += numberCNN[Integer.parseInt(sigle)] + submoneyCN[pos % 4];} else {if (allhavenum) {formatDecimalString += "零";}formatDecimalString += numberCNN[Integer.parseInt(sigle)] + submoneyCN[pos % 4];mark = false;}havenum = true;allhavenum = true;} else {mark = true;}}pos--;}/**碰到小数点时的读法*/if (allhavenum) { //如:00.34就不能读为:元3角4分.变量allhavenum表示小数点左面的内容中是否有数字出现formatDecimalString += "元";} else {//如果小数点左面的部分都为0如:00.34应读为:零元3角4分formatDecimalString = "零元";}/**以下代码为读出小数点右面的部分 */if (money2.equals("00")) {formatDecimalString += "整";} else {/**读出角,如120.34读为:1佰2拾元零3角4分;123.04读为:1佰2拾3元零4分*/
//                if(money2.startsWith("0")||(allhavenum&&money1.endsWith("0"))){
//                    formatCN+="零";
//                }if (!money2.startsWith("0")) {formatDecimalString += numberCNN[Integer.parseInt(money2.substring(0, 1))] + "角";}//读出分,如:12.30读1拾2元3角零分formatDecimalString += numberCNN[Integer.parseInt(money2.substring(1))] + "分";}return formatDecimalString;}/*** 整数转换** @param integerString 整数字符串(例:123456789   壹亿贰仟叁佰肆拾伍万陆仟柒佰捌拾玖元整)* @return 转换后的大写金额*/private String integerConversion(String integerString) {//用来存放转换后的大写数字,因为是StringBuffer类型,所以顺便把没有转换//的数字倒序排列一下,省一个变量.StringBuffer ChineseCharI = new StringBuffer(integerString);//倒序的数字,便于同单位合并String rintString = ChineseCharI.reverse().toString();//清空一下ChineseCharI.delete(0, ChineseCharI.length());//单位索引int unitIndex = 0;//数字长度int intStringLen = integerString.length();//一位由字符转换的数字int intStringnumber = 0;//补0boolean addZero = false;boolean flagZero = false;for (int i = 0; i < intStringLen; i++) {//按单位长度循环索引unitIndex = i % UNIT.length;//异常处理if (!Character.isDigit(rintString.charAt(i))) {return "数字中含有非法字符";}//将字符转为数字,范围为10以内(不包括10,超出则返回-1)intStringnumber = Character.digit(rintString.charAt(i), 10);//如果当前位是0,开启补0继续循环直到不是0的位if (intStringnumber == 0) {addZero = true;if (i != 0 && i % 4 == 0) {if (addZero && ChineseCharI.length() != 0) {ChineseCharI.append(TEMPLATE[0]);addZero = false;}flagZero = true;ChineseCharI.append(UNIT[unitIndex]);}} else {//若当前位不是第一位且补0开启if (addZero && ChineseCharI.length() != 0 && !flagZero) {ChineseCharI.append(TEMPLATE[0]);}flagZero = false;//插入单位//个位数后面不需要单位if (i > 0) {ChineseCharI.append(UNIT[unitIndex]);}//插入大写数字ChineseCharI.append(TEMPLATE[intStringnumber]);//补0关闭addZero = false;}}//异常处理if (ChineseCharI.length() == 0) {return "零";}return ChineseCharI.reverse().toString() + "元整";}
}

在项目中的应用:

String convert = MoneyFormatUtil.getInstance().convert("1234567.89");
String convert1 = MoneyFormatUtil.getInstance().convert("1.34");
String convert2 = MoneyFormatUtil.getInstance().convert("100.34");
String convert3 = MoneyFormatUtil.getInstance().convert("34f5460.34");
String convert4 = MoneyFormatUtil.getInstance().convert("10000.34");
String convert5 = MoneyFormatUtil.getInstance().convert("100000.34f");
String convert6 = MoneyFormatUtil.getInstance().convert("1003430000.34");
String convert7 = MoneyFormatUtil.getInstance().convert("1101010101.34");
String convert8 = MoneyFormatUtil.getInstance().convert("1010101010.34"

---------------------------------------------------------------------------------------------------------------------------

早计划,早准备,早完成。 欢迎关注!交流!Star!

GitHub:https://github.com/wangyang0313

微信公众号:一个灵活的胖子MrWang

简书:https://www.jianshu.com/u/e5e733d79b96

工具篇——MoneyFormatUtil(用于将人民币小写金额转换成大写金额)相关推荐

  1. Java工具包:小写金额转换成大写金额

    源代码如下 package com.jian.stringUtil;/*** 工具类:小写金额转换成大写金额* * @author jianxuanbing* */ @SuppressWarnings ...

  2. 小写金额转换成大写金额的函数

    编写一个收费软件时要用到一个小写金额转换成大写金额的函数,我曾在网上找到一个用Powerbuilder写的函数,长达四五十行之巨,后来我自己用DELPHI写了一个函数,寥寥几行代码就搞定: funct ...

  3. PB中小写金额转换成大写金额(发票类型)

    PB中小写金额转换成大写金额 //================================================================= // 功能:小写金额转换成大写金额 ...

  4. 使用javabean把小写金额转换成大写金额

    public static void main(String[] args) {moneyConversion mc=new moneyConversion();String money=" ...

  5. 将小写金额转换成大写金额[存储过程版]

    CREATE FUNCTION FAtoC /* 金额阿拉伯数字转换为中文的自定义函数 */ ( @ChangeMoney Money ) RETURNS VarChar(100) AS BEGIN ...

  6. 阿拉伯数字小写金额转换成中文大写金C额程序说明

    阿拉伯数字小写金额转换成中文大写金额C程序说明 1.问题的提出 寒假帮同学交缴话费时,不经意间看到收据上同时有小写金额和大写金额,想想各种各样的票据诸如缴费收据.银行业务回单.商场销售凭证.专用发票等 ...

  7. 小写数字转大写_不得不说的Excel小技巧:设置单元格格式将小写金额转换成大写...

    大家好,我是小秋,近期一段时间比较忙,没有在今日头条上更新原创文章了.希望朋友们多多见谅,下面与大家分享一个Excel实用小技巧:如何设置单元格格式将小写金额转换成大写? 1.应用场景 在报销单.收据 ...

  8. win7计算机名改成大写,图文解读win7系统excel数字小写金额转换成汉字大写金额的措施...

    有很多网友在使用电脑的过程总难免会遇到win7系统excel数字小写金额转换成汉字大写金额的情况.针对win7系统excel数字小写金额转换成汉字大写金额的问题,我给大家整理总结了详细的解决步骤.近日 ...

  9. 将小写金额转换成中文大写

    FUNCTION ZCONV_AMOUNT_MB. *"------------------------------------------------------------------- ...

最新文章

  1. 在CentOS 6.6 64bit上基于源码安装全功能的vim 7.4实录
  2. C++知识点21——使用C++标准库(再谈string——string的搜索和数值转化)
  3. 利用Mycat中间件实现RDS MySQL的分库分表及读写分离功能
  4. 新手程序员如何让他快速成长?一名老程序员,谈谈对程序员的培养
  5. css设置鼠标滑过背景变色;鼠标滑过背景变色
  6. 点击空链接,页面不跳到页头
  7. perl中替换文本一例
  8. eclipse中查怎样看某个方法调用了谁
  9. 学习测试环境部署,先从学会虚拟机安装系统开始
  10. 翻译:机器学习 数据科学家 top 10 十大算法
  11. Windows内核编程(二)-第一个内核程序
  12. 怎么改mnist数据的标签_详解 MNIST 数据集
  13. 学习笔记:弱监督学习-valse青年会议
  14. MySQL高级 知识点汇总
  15. 2022N1叉车司机题库及在线模拟考试
  16. u盘文件变成快捷方式怎么恢复,恢复U盘文件的五种方法
  17. 怎么用python启动谷歌浏览器_Selenium 基于python 安装以及配置谷歌浏览器启动
  18. vscode键位错乱
  19. vi/vim中复制粘贴命令
  20. 三十、非谓语动词_作状语

热门文章

  1. scratch零基础
  2. Yii:zii.widgets.CMenu使用方法
  3. java word 添加水印图片_Java添加Word文本水印和图片水印
  4. 垃圾佬收的thinkpad T480
  5. 网络、如何通信、TCP/IP协议
  6. 今天是2019年最后一天,全球金融危机,离我们已经过去十年了
  7. 华科出身,师从贾佳亚,从鹅厂到创业,90后如何登上胡润U30?
  8. 虚拟中3DMax2018打开报错
  9. JavaWeb实现生成二维码
  10. Service Mesh的未来将与Knative和Apahce Whisk等技术和谐共存——采访RedHat的Istio产品经理...