使用java将人民币金额转换成大写并使用自定义标签显示到页面
程序员文章站
2022-04-25 21:50:23
...
1、定义一个class用来将人民币金额转换成大写,我这里叫ChangeNumMoney.java:
package com.test; public class ChangeNumMoney { /* public static void main(String[] args) { String money = changeNumMoneyToChinese("123456.1234"); System.out.println(money); } */ public static String changeNumMoneyToChinese(String money) { String[] cnNums = { "零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖" }; // 汉字的数字 String[] cnIntRadice = { "", "拾", "佰", "仟" }; // 基本单位 String[] cnIntUnits = { "", "万", "亿", "兆" }; // 对应整数部分扩展单位 String[] cnDecUnits = { "角", "分", "毫", "厘" }; // 对应小数部分单位 String cnInteger = "整"; // 整数金额时后面跟的字符 String cnIntLast = "元"; // 整型完以后的单位 double maxNum = 999999999999999.9999; // 最大处理的数字 String IntegerNum; // 金额整数部分 String DecimalNum; // 金额小数部分 String ChineseStr = ""; // 输出的中文金额字符串 String[] parts = null; // 分离金额后用的数组,预定义 // 1、是否为null if (money == null) { return "空字符串"; } // 2、是否为空字符串 money = money.trim();// 去除空格 if (money.length() == 0) { return "空字符串"; } //3、是否为钱的格式 String s="[^0][\\d]{1,15}[.]{0,1}[\\d]{0,4}";//大于0且整数部分不为0的 String s2="[0][.][\\d]{0,4}";//小于0的数 if(!(money.matches(s) || money.matches(s2))){//两个都不符合 return "格式错误,格式为:整数(最多15位)+.+小数(最多4位)"; } // 4、是否为0 double money2 = Double.valueOf(money); if (money2 == 0) { ChineseStr = cnNums[0] + cnIntLast + cnInteger; return ChineseStr; } //5、是否超出最大处理数字 if (money2>= maxNum) { return "超出最大处理数字"; } // 6、判断是否有小数点,确定小数部分和整数部分 if (money.indexOf(".") == -1) {// 没有小数点 IntegerNum = money;// 若没有小数部分,那么当前钱数就是整数部分,小数部分为空 DecimalNum = ""; } else { parts = money.split("\\.");// 进行截取 IntegerNum = parts[0];// 整数部分 DecimalNum = parts[1];//小数部分, } //7、整型部分 if (Integer.parseInt(IntegerNum, 10) > 0) { // 获取整型部分转换 int zeroCount = 0; char[] array = IntegerNum.toCharArray(); String n=""; int p=0,q=0,m=0; for (int i = 0; i < IntegerNum.length(); i++) { n = Character.toString(array[i]); p = IntegerNum.length() - i - 1; q = p / 4; m = p % 4; if (n.equals("0")) { zeroCount++; } else { if (zeroCount > 0) { ChineseStr += cnNums[0]; } zeroCount = 0; // 归零 // System.out.println(n+"\n"+cnNums[Integer.parseInt(n)]+"\n"+m+"\ncnIntRadice[m]"); ChineseStr += cnNums[Integer.parseInt(n)] + cnIntRadice[m]; } if (m == 0 && zeroCount < 4) { ChineseStr += cnIntUnits[q]; } } ChineseStr += cnIntLast; } //8、整理小数部分 if (DecimalNum.trim().length() > 0) { // 小数部分 String n=""; char[] array = DecimalNum.toCharArray(); for (int i = 0; i < DecimalNum.length(); i++) { n = Character.toString(array[i]); if (!n.equals("0")) { ChineseStr += cnNums[Integer.parseInt(n)] + cnDecUnits[i]; } } } //9、判断是否有整理结果,若没有则返回“零元整” if (ChineseStr.trim().length() == 0) { ChineseStr += cnNums[0] + cnIntLast + cnInteger; } else if (DecimalNum.trim().length() == 0) { ChineseStr += cnInteger; } return ChineseStr; } /** * 判断str1中包含str2的个数 *@param str1 * @param str2 * @return counter */ public static int countStr(String str1, String str2) { int counter=0; if (str1.indexOf(str2) == -1) { return 0; } while(str1.indexOf(str2)!=-1){ counter++; str1=str1.substring(str1.indexOf(str2)+str2.length()); } return counter; } }
2、在WebRoot/WEB-INF下新建一个tld文件,我这里叫money.tld,内容为:
<?xml version="1.0" encoding="UTF-8"?> <taglib xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd" version="2.0"> <tlib-version>1.0</tlib-version> <short-name>ChangeNumMoney</short-name> <function> <description>将数字格式的钱转换成大写人民币</description><!-- 对这个EL方法进行描述 --> <name>changeNumMoneyToChinese</name><!-- 调用El方法的名字 --> <function-class>com.test.ChangeNumMoney</function-class><!-- 所使用的类 --> <function-signature>String changeNumMoneyToChinese(java.lang.String)</function-signature> <example>${ChangeNumMoney:changeNumMoneyToChinese(str)}</example><!-- 举例 --> </function> </taglib>
3、新建一个jsp文件进行测试,我这里叫test.jsp:
头部引入标签:<%@taglib prefix="myTag" uri="/WEB-INF/money.tld" %>
显示到页面:
<body> 数字格式:23456.1234<br /><br /> 大写格式:<c:out value="${myTag:changeNumMoneyToChinese(123456.1234) }"></c:out> </body>
4、关于使用split的一些注意点:
①、如果用“.”作为分隔的话,必须是如下写法:String.split("\\."),这样才能正确的分隔开,不能用String.split(".");
②、如果用“|”作为分隔的话,必须是如下写法:String.split("\\|"),这样才能正确的分隔开,不能用String.split("|");
“.”和“|”都是转义字符,必须得加"\\";
③、如果在一个字符串中有多个分隔符,可以用“|”作为连字符,比如:“a=1 and b =2 or c=3”,把三个都分隔出来,可以用String.split("and|or");
上一篇: 自定义标签
下一篇: [NIO.2] 第三十篇 递归操作简述