教你怎么用Java完成人民幣大寫轉(zhuǎn)化
一、前言
人民幣大寫金額的正確寫法:
整數(shù)部分:零、壹、貳、叁、肆、伍、陸、柒、捌、玖
小數(shù)部分:角、分、厘
數(shù)位部分:拾、佰、仟、萬、億、元
二、注意
阿拉伯數(shù)字小寫金額數(shù)字中有 “0” 時,中文大寫應按照漢語語言規(guī)律、金額數(shù)字構(gòu)成和防止涂改的要求進行書寫。舉例如下:
1、阿拉伯數(shù)字中間有 “0” 時,中文大寫要寫“零”字,如¥1409.50應寫成人民幣壹仟肆佰零玖元伍角。
2、阿拉伯數(shù)字中間連續(xù)有幾個 “0” 時、中文大寫金額中間可以只寫一個“零”字,如¥6007.14應寫成人民幣陸仟零柒元壹角肆分。
3、阿拉伯金額數(shù)字萬位和元位是 “0” ,或者數(shù)字中間連續(xù)有幾個 “0” ,萬位、元位也是 “0” 但千位、角位不是 “0” 時,中文大寫金額中可以只寫一個零字,也可以不寫“零”字,
如¥1680.32應寫成人民幣壹仟陸佰捌拾元零叁角貳分,或者寫成人民幣壹仟陸佰捌拾元叁角貳分。又如¥107000.53應寫成人民幣壹拾萬柒仟元零伍角叁分,或者寫成人民幣壹拾萬零柒仟元伍角叁分。
4、阿拉伯金額數(shù)字角位是 “0” 而分位不是 “0” 時,中文大寫金額“元”后面應寫“零”字,如¥16409.02應寫成人民幣壹萬陸仟肆佰零玖元零貳分,又如¥325.04應寫成人民幣叁佰貳拾伍元零肆分。
三、思路分析
- 初始化人民幣大寫金額,其中數(shù)位的順序是有要求的。
- 對傳入的字符串進行校驗(非空、特殊字符)
- 判斷字符串的長度是否超過了轉(zhuǎn)換范圍
- 判斷是否存在負數(shù),對負號進行替換
- 分離整數(shù)部分和小數(shù)部分
- 判斷整數(shù)部分是否已經(jīng)達到萬
這里使用到了一個StringUtils類和單元測,junit,需要導入依賴
<dependency> <groupId>commons-lang</groupId> <artifactId>commons-lang</artifactId> <version>2.6</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>test</scope> </dependency> </dependencies>
四、完整代碼
public class ConvertUpMoney { //整數(shù)部分的人民幣大寫 private static final String[] NUMBERS = {"零", "壹", "貳", "叁", "肆", "伍", "陸", "柒", "捌", "玖"}; //數(shù)位部分 private static final String[] IUNIT = {"元", "拾", "佰", "仟", "萬", "拾", "佰", "仟", "億", "拾", "佰", "仟", "萬", "拾", "佰", "仟"}; //小數(shù)部分的人民幣大寫 private static final String[] DUNIT = {"角", "分", "厘"}; //轉(zhuǎn)成中文的大寫金額 public static String toChinese(String str) { //判斷輸入的金額字符串是否符合要求 if (StringUtils.isBlank(str) || !str.matches("(-)?[\\d]*(.)?[\\d]*")) { System.out.println("抱歉,請輸入數(shù)字!"); return str; } //判斷輸入的金額字符串 if ("0".equals(str) || "0.00".equals(str) || "0.0".equals(str)) { return "零元"; } //判斷是否存在負號"-" boolean flag = false; if (str.startsWith("-")) { flag = true; str = str.replaceAll("-", ""); } //如果輸入字符串中包含逗號,替換為 "." str = str.replaceAll(",", "."); String integerStr;//整數(shù)部分數(shù)字 String decimalStr;//小數(shù)部分數(shù)字 //分離整數(shù)部分和小數(shù)部分 if (str.indexOf(".") > 0) {//整數(shù)部分和小數(shù)部分 integerStr = str.substring(0, str.indexOf(".")); decimalStr = str.substring(str.indexOf(".") + 1); } else if (str.indexOf(".") == 0) {//只存在小數(shù)部分 .34 integerStr = ""; decimalStr = str.substring(1); } else { //只存在整數(shù)部分 34 integerStr = str; decimalStr = ""; } //整數(shù)部分超出計算能力,直接返回 if (integerStr.length() > IUNIT.length) { System.out.println(str + ":超出計算能力"); return str; } //整數(shù)部分存入數(shù)組 目的是為了可以動態(tài)的在字符串數(shù)組中取對應的值 int[] integers = toIntArray(integerStr); //判斷整數(shù)部分是否存在輸入012的情況 if (integers.length > 1 && integers[0] == 0) { System.out.println("抱歉,請輸入數(shù)字!"); if (flag) { str = "-" + str; } return str; } boolean isWan = isWanUnits(integerStr);//設置萬單位 //小數(shù)部分數(shù)字存入數(shù)組 int[] decimals = toIntArray(decimalStr); String result = getChineseInteger(integers, isWan) + getChineseDecimal(decimals);//返回最終的大寫金額 if (flag) { return "負" + result;//如果是負數(shù),加上"負" } else { return result; } } //將字符串轉(zhuǎn)為int數(shù)組 private static int[] toIntArray(String number) { //初始化一維數(shù)組長度 int[] array = new int[number.length()]; //循環(huán)遍歷賦值 for (int i = 0; i < number.length(); i++) { array[i] = Integer.parseInt(number.substring(i, i + 1)); } return array; } //將整數(shù)部分轉(zhuǎn)為大寫的金額 public static String getChineseInteger(int[] integers, boolean isWan) { StringBuffer chineseInteger = new StringBuffer(""); int length = integers.length; // 對于輸入的字符串為 "0." 存入數(shù)組后為 0 if (length == 1 && integers[0] == 0) { return ""; } for (int i = 0; i < length; i++) { String key = "";//0325464646464 if (integers[i] == 0) { if ((length - i) == 13)//萬(億) key = IUNIT[4]; else if ((length - i) == 9) {//億 key = IUNIT[8]; } else if ((length - i) == 5 && isWan) {//萬 key = IUNIT[4]; } else if ((length - i) == 1) {//元 key = IUNIT[0]; } if ((length - i) > 1 && integers[i + 1] != 0) { key += NUMBERS[0]; } } chineseInteger.append(integers[i] == 0 ? key : (NUMBERS[integers[i]] + IUNIT[length - i - 1])); } return chineseInteger.toString(); } //將小數(shù)部分轉(zhuǎn)為大寫的金額 private static String getChineseDecimal(int[] decimals) { //角 分 厘 038 壹分捌厘 StringBuffer chineseDecimal = new StringBuffer(""); for (int i = 0; i < decimals.length; i++) { if (i == 3) { break; } chineseDecimal.append(decimals[i] == 0 ? "" : (NUMBERS[decimals[i]] + DUNIT[i])); } return chineseDecimal.toString(); } //判斷當前整數(shù)部分是否已經(jīng)是達到【萬】 private static boolean isWanUnits(String integerStr) { int length = integerStr.length(); if (length > 4) { String subInteger = ""; if (length > 8) { subInteger = integerStr.substring(length - 8, length - 4); } else { subInteger = integerStr.substring(0, length - 4); } return Integer.parseInt(subInteger) > 0; } else { return false; } }
五、代碼測試
- 阿拉伯數(shù)字中包含 "0"的測試
- 特殊情況的測試(特殊字符、負數(shù)、超過人民幣數(shù)值范圍)。
@Test public void test() { String number = "1409.50"; String afterStr = ConvertUpMoney.toChinese(number); System.out.println(number + ": " + afterStr);//壹仟肆佰零玖元伍角 } @Test public void test2() { String number = "6007.14"; String afterStr = ConvertUpMoney.toChinese(number); System.out.println(number + ": " + afterStr);//陸仟零柒元壹角肆分 } @Test public void test3() { String number = "1680.32"; String afterStr = ConvertUpMoney.toChinese(number); System.out.println(number + ": " + afterStr);//壹仟陸佰捌拾元叁角貳分 } @Test public void test4() { String number = "107000.53"; String afterStr = ConvertUpMoney.toChinese(number); System.out.println(number + ": " + afterStr);//壹拾萬零柒仟元伍角叁分 } @Test public void test5() { String number = "16409.02"; String afterStr = ConvertUpMoney.toChinese(number); System.out.println(number + ": " + afterStr);//壹萬陸仟肆佰零玖元零貳分 } @Test public void test6() { String number = "325.04"; String afterStr = ConvertUpMoney.toChinese(number); System.out.println(number + ": " + afterStr);//叁佰貳拾伍元零肆分 } @Test public void test7() { String number = "-0325.04"; String afterStr = ConvertUpMoney.toChinese(number);//抱歉,請輸入數(shù)字! System.out.println(number + ": " + afterStr); } @Test public void test8() { String number = "325#sdr"; String afterStr = ConvertUpMoney.toChinese(number);//抱歉,請輸入數(shù)字! System.out.println(number + ": " + afterStr);//325#sdr: 325#sdr } @Test public void test9() { String number = "-34327987"; String afterStr = ConvertUpMoney.toChinese(number);//-34327987: 負叁仟肆佰叁拾貳萬柒仟玖佰捌拾柒元 System.out.println(number + ": " + afterStr); } @Test public void test10() { String number = "78934029675923532"; System.out.println("長度 :" + number.length());//長度 :17 String afterStr = ConvertUpMoney.toChinese(number);//78934029675923532:超出計算能力 System.out.println(number + ": " + afterStr); }
圖解轉(zhuǎn)換的過程:
整數(shù)部分轉(zhuǎn)化人民幣大寫方法簡寫
小數(shù)部分轉(zhuǎn)換人民幣大寫方法簡寫
轉(zhuǎn)換過程:
轉(zhuǎn)換結(jié)果:
貳拾叁億貳仟柒佰捌拾玖萬叁仟肆佰壹拾玖元
到此這篇關(guān)于教你怎么用Java完成人民幣大寫轉(zhuǎn)化的文章就介紹到這了,更多相關(guān)Java人民幣大寫轉(zhuǎn)化內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Maven報錯之導入Junit包來實現(xiàn)@Test注解問題
這篇文章主要介紹了Maven報錯之導入Junit包來實現(xiàn)@Test注解問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-11-11JAVA 多態(tài)操作----父類與子類轉(zhuǎn)換問題實例分析
這篇文章主要介紹了JAVA 多態(tài)操作----父類與子類轉(zhuǎn)換問題,結(jié)合實例形式分析了JAVA 多態(tài)操作中父類與子類轉(zhuǎn)換問題相關(guān)原理、操作技巧與注意事項,需要的朋友可以參考下2020-05-05Spring Boot Logging Level設置為off時的Bug
這篇文章主要介紹了Spring Boot Logging Level設置為off時的Bug,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-09-09深入了解Java核心類庫--Date,Calendar,DateFormat類
這篇文章主要為大家詳細介紹了javaDate,Calendar,DateFormat類定義與使用的相關(guān)資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能給你帶來幫助2021-07-07Spring關(guān)閉Tomcat Servlet容器時內(nèi)存泄漏問題解決方案
這篇文章主要介紹了Spring關(guān)閉Tomcat Servlet容器時內(nèi)存泄漏問題解決方案,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2019-10-10windows下java -jar 后臺運行以及殺死后臺進程的操作
這篇文章主要介紹了windows下java -jar 后臺運行以及殺死后臺進程的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-12-12SpringBoot報錯Invalid?bound?statement?(not?found)問題排查和解決方案
這篇文章主要介紹了SpringBoot報錯Invalid?bound?statement?(not?found)問題排查和解決方案,文中通過圖文結(jié)合的方式講解的非常詳細,對大家的學習或工作有一定的幫助,需要的朋友可以參考下2024-03-03