(转)金额转中文大写
生活随笔
收集整理的這篇文章主要介紹了
(转)金额转中文大写
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
public class RMB {//返回轉換好的大寫形式public static String numberToRMB(String money) {return cleanZero(splitNum(roundString(money)));}// 將小寫金額轉換成大寫金額private static String splitNum(String s) {// 如果傳入的是空串則繼續返回空串if ("".equals(s) || s == null) {return "";}// 以小數點為界分割這個字符串int index = s.indexOf(".");// 截取并轉換這個數的整數部分String intOnly = s.substring(0, index);String part1 = numFormat(1, intOnly);// 截取并轉換這個數的小數部分String smallOnly = s.substring(index + 1);String part2 = numFormat(2, smallOnly);// 把轉換好了的整數部分和小數部分重新拼湊一個新的字符串return part1 + part2;}/*** 把傳入的數轉換為中文金額大寫形式* @param flag* int 標志位,1 表示轉換整數部分,0 表示轉換小數部分* @param s* String 要轉換的字符串* @return 轉換好的帶單位的中文金額大寫形式*/private static String numFormat(int flag, String s) {int sLength = s.length();// 貨幣大寫形式String bigLetter[] = { "零", "壹", "貳", "叁", "肆", "伍", "陸", "柒", "捌", "玖" };// 貨幣單位String unit[] = { "元", "拾", "佰", "仟", "萬",// 拾萬位到仟萬位"拾", "佰", "仟",// 億位到萬億位"億", "拾", "佰", "仟", "萬" };String small[] = { "分", "角" };// 用來存放轉換后的新字符串String newS = "";// 逐位替換為中文大寫形式for (int i = 0; i < sLength; i++) {if (flag == 1) {// 轉換整數部分為中文大寫形式(帶單位)newS = newS + bigLetter[s.charAt(i) - 48]+ unit[sLength - i - 1];} else if (flag == 2) {// 轉換小數部分(帶單位)newS = newS + bigLetter[s.charAt(i) - 48]+ small[sLength - i - 1];}}return newS;}/*** 對傳入的數進行四舍五入操作* * @param sString* 從命令行輸入的那個數* @return 四舍五入后的新值*/private static String roundString(String s) {// 如果傳入的是空串則繼續返回空串if ("".equals(s)) {return "";}// 將這個數轉換成 double 類型,并對其進行四舍五入操作double d = Double.parseDouble(s);// 此操作作用在小數點后兩位上d = (d * 100 + 0.5) / 100;// 將 d 進行格式化s = new java.text.DecimalFormat("##0.000").format(d);// 以小數點為界分割這個字符串int index = s.indexOf(".");// 這個數的整數部分String intOnly = s.substring(0, index);// 規定數值的最大長度只能到萬億單位,否則返回 "0"if (intOnly.length() > 13) {return "";}// 這個數的小數部分String smallOnly = s.substring(index + 1);// 如果小數部分大于兩位,只截取小數點后兩位if (smallOnly.length() > 2) {String roundSmall = smallOnly.substring(0, 2);// 把整數部分和新截取的小數部分重新拼湊這個字符串s = intOnly + "." + roundSmall;}return s;}/*** 把已經轉換好的中文金額大寫形式加以改進,清理這個字 符串里面多余的零,讓這個字符串變得更加可觀 注:傳入的這個數應該是經過 splitNum()* 方法進行處理,這個字 符串應該已經是用中文金額大寫形式表示的* * @param s* String 已經轉換好的字符串* @return 改進后的字符串*/private static String cleanZero(String s) {// 如果傳入的是空串則繼續返回空串if ("".equals(s)) {return "";}// 如果用戶開始輸入了很多 0 去掉字符串前面多余的'零',使其看上去更符合習慣while (s.charAt(0) == '零') {// 將字符串中的 "零" 和它對應的單位去掉s = s.substring(2);// 如果用戶當初輸入的時候只輸入了 0,則只返回一個 "零"if (s.length() == 0) {return "零";}}// 字符串中存在多個'零'在一起的時候只讀出一個'零',并省略多余的單位/* 由于本人對算法的研究太菜了,只能用4個正則表達式去轉換了,各位大蝦別介意哈... */String regex1[] = { "零仟", "零佰", "零拾" };String regex2[] = { "零億", "零萬", "零元" };String regex3[] = { "億", "萬", "元" };String regex4[] = { "零角", "零分" };// 第一輪轉換把 "零仟", 零佰","零拾"等字符串替換成一個"零"for (int i = 0; i < 3; i++) {s = s.replaceAll(regex1[i], "零");}// 第二輪轉換考慮 "零億","零萬","零元"等情況// "億","萬","元"這些單位有些情況是不能省的,需要保留下來for (int i = 0; i < 3; i++) {// 當第一輪轉換過后有可能有很多個零疊在一起// 要把很多個重復的零變成一個零s = s.replaceAll("零零零", "零");s = s.replaceAll("零零", "零");s = s.replaceAll(regex2[i], regex3[i]);}// 第三輪轉換把"零角","零分"字符串省略for (int i = 0; i < 2; i++) {s = s.replaceAll(regex4[i], "");}// 當"萬"到"億"之間全部是"零"的時候,忽略"億萬"單位,只保留一個"億"s = s.replaceAll("億萬", "億");return s;} }
?
轉載于:https://www.cnblogs.com/yshyee/p/4109730.html
總結
以上是生活随笔為你收集整理的(转)金额转中文大写的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JVM系列(之ClassLoader)
- 下一篇: c++ Qt向PHP接口POST文件流