您好,登錄后才能下訂單哦!
這篇“Java怎么實現人民幣大寫轉化功能”文章的知識點大部分人都不太理解,所以小編給大家總結了以下內容,內容詳細,步驟清晰,具有一定的借鑒價值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來看看這篇“Java怎么實現人民幣大寫轉化功能”文章吧。
人民幣大寫金額的正確寫法:
整數部分:零、壹、貳、叁、肆、伍、陸、柒、捌、玖
小數部分:角、分、厘
數位部分:拾、佰、仟、萬、億、元
阿拉伯數字小寫金額數字中有 “0” 時,中文大寫應按照漢語語言規律、金額數字構成和防止涂改的要求進行書寫。舉例如下:
1、阿拉伯數字中間有 “0” 時,中文大寫要寫“零”字,如¥1409.50應寫成人民幣壹仟肆佰零玖元伍角。
2、阿拉伯數字中間連續有幾個 “0” 時、中文大寫金額中間可以只寫一個“零”字,如¥6007.14應寫成人民幣陸仟零柒元壹角肆分。
3、阿拉伯金額數字萬位和元位是 “0” ,或者數字中間連續有幾個 “0” ,萬位、元位也是 “0” 但千位、角位不是 “0” 時,中文大寫金額中可以只寫一個零字,也可以不寫“零”字,
如¥1680.32應寫成人民幣壹仟陸佰捌拾元零叁角貳分,或者寫成人民幣壹仟陸佰捌拾元叁角貳分。又如¥107000.53應寫成人民幣壹拾萬柒仟元零伍角叁分,或者寫成人民幣壹拾萬零柒仟元伍角叁分。
4、阿拉伯金額數字角位是 “0” 而分位不是 “0” 時,中文大寫金額“元”后面應寫“零”字,如¥16409.02應寫成人民幣壹萬陸仟肆佰零玖元零貳分,又如¥325.04應寫成人民幣叁佰貳拾伍元零肆分。
初始化人民幣大寫金額,其中數位的順序是有要求的。
對傳入的字符串進行校驗(非空、特殊字符)
判斷字符串的長度是否超過了轉換范圍
判斷是否存在負數,對負號進行替換
分離整數部分和小數部分
判斷整數部分是否已經達到萬
這里使用到了一個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 {
//整數部分的人民幣大寫
private static final String[] NUMBERS = {"零", "壹", "貳", "叁", "肆", "伍", "陸", "柒", "捌", "玖"};
//數位部分
private static final String[] IUNIT = {"元", "拾", "佰", "仟", "萬", "拾", "佰", "仟", "億", "拾", "佰", "仟", "萬", "拾", "佰", "仟"};
//小數部分的人民幣大寫
private static final String[] DUNIT = {"角", "分", "厘"};
//轉成中文的大寫金額
public static String toChinese(String str) {
//判斷輸入的金額字符串是否符合要求
if (StringUtils.isBlank(str) || !str.matches("(-)?[\d]*(.)?[\d]*")) {
System.out.println("抱歉,請輸入數字!");
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;//整數部分數字
String decimalStr;//小數部分數字
//分離整數部分和小數部分
if (str.indexOf(".") > 0) {//整數部分和小數部分
integerStr = str.substring(0, str.indexOf("."));
decimalStr = str.substring(str.indexOf(".") + 1);
} else if (str.indexOf(".") == 0) {//只存在小數部分 .34
integerStr = "";
decimalStr = str.substring(1);
} else { //只存在整數部分 34
integerStr = str;
decimalStr = "";
}
//整數部分超出計算能力,直接返回
if (integerStr.length() > IUNIT.length) {
System.out.println(str + ":超出計算能力");
return str;
}
//整數部分存入數組 目的是為了可以動態的在字符串數組中取對應的值
int[] integers = toIntArray(integerStr);
//判斷整數部分是否存在輸入012的情況
if (integers.length > 1 && integers[0] == 0) {
System.out.println("抱歉,請輸入數字!");
if (flag) {
str = "-" + str;
}
return str;
}
boolean isWan = isWanUnits(integerStr);//設置萬單位
//小數部分數字存入數組
int[] decimals = toIntArray(decimalStr);
String result = getChineseInteger(integers, isWan) + getChineseDecimal(decimals);//返回最終的大寫金額
if (flag) {
return "負" + result;//如果是負數,加上"負"
} else {
return result;
}
}
//將字符串轉為int數組
private static int[] toIntArray(String number) {
//初始化一維數組長度
int[] array = new int[number.length()];
//循環遍歷賦值
for (int i = 0; i < number.length(); i++) {
array[i] = Integer.parseInt(number.substring(i, i + 1));
}
return array;
}
//將整數部分轉為大寫的金額
public static String getChineseInteger(int[] integers, boolean isWan) {
StringBuffer chineseInteger = new StringBuffer("");
int length = integers.length;
// 對于輸入的字符串為 "0." 存入數組后為 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();
}
//將小數部分轉為大寫的金額
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();
}
//判斷當前整數部分是否已經是達到【萬】
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;
}
}
阿拉伯數字中包含 "0"的測試
特殊情況的測試(特殊字符、負數、超過人民幣數值范圍)。
@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);//抱歉,請輸入數字!
System.out.println(number + ": " + afterStr);
}
@Test
public void test8() {
String number = "325#sdr";
String afterStr = ConvertUpMoney.toChinese(number);//抱歉,請輸入數字!
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);
}
以上就是關于“Java怎么實現人民幣大寫轉化功能”這篇文章的內容,相信大家都有了一定的了解,希望小編分享的內容對大家有幫助,若想了解更多相關的知識內容,請關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。