將浮點數轉換成人民幣讀法字串(整數部分在12位以內)
阿新 • • 發佈:2019-02-01
import java.util.Arrays;
import java.util.Scanner;
public class Num2Rmb
{
private String[] hanArr= {"零" , "壹" , "貳" , "叄" , "肆" ,
"伍" , "陸" , "柒" , "捌" , "玖"};
private String[] unitArr = {"拾", "佰", "仟","角","分"};
/**
* 把一個浮點數分解成整數部分和小數部分字串
* @param num 需要被分解的浮點數
* @return 分解出來的整數部分和小數部分構成的陣列。第一個陣列元素是整數部分,第二個陣列元素是小數部分。
*/
private static String[] divide(double num)
{
//將一個浮點數強制型別轉換為long,即得到它的整數部分。
long zheng = (long)num;
//浮點數減去整數部分,得到小數部分,小數部分乘以100後再取整得到2位小數。
//Math類的round方法,返回與引數最接近(經四捨五入後)的整數。
String xiaoStr;
if (xiao < 10 ){
xiaoStr = 0 + "" + xiao ;
}else{
//String類的valueOf(int i)方法,返回整數引數的字串表示式。
xiaoStr = String.valueOf(xiao);
}
//下面用了2種方法把整數轉換為字串。
//return一個numString陣列。
String [] numString = {zheng +"",xiaoStr};
return numString;
}
/**
* 把一個12位以內的數字字串變成漢字字串
* @param numStr 需要被轉換的數字字串陣列
* @return 數字字串被轉換成的漢字字串。
*/
private String toHanStr(String[] numStr)
{
int strLen = numStr[0].length(); //獲得整數部分的字串的位數
if(strLen > 12){ //如果字串大於12位,就返回一個匿名的字串
return "您輸入的浮點數,其整數部分的位數超過了限定的12位,請重新輸入";
}else{
int yu = strLen % 4;
//partNum表示該數字字串可劃分成的節數(每4位為一節)。
//如餘數等於0,則將strLen/4賦值給partNum;否則將strLen/4 + 1賦值給partNum。
int partNum = yu == 0 ? strLen/4 : strLen/4 + 1;
//firstPartLen表示第一節的長度
int firstPartLen = strLen - (partNum - 1)*4;
String resultFirst = "";
String resultSecond = "";
String resultThird = "";
String resultFourth = "";
//依次遍歷數字字串的每一節
for (int i = 0 ; i < partNum ; i ++ )
{
//轉換第一節
if (i == 0)
{
//通過呼叫String類的substring方法來返回子串 [beginIndex, endIndex),
//即:包括起始索引,不包括結束索引。
String firstPart = numStr[0].substring(0, firstPartLen);
//依次遍歷第一節中的每一位數字
for (int j = 0 ; j < firstPartLen ; j ++ )
{
//String類的charAt(int index),返回指定索引處的字串值。
//把char型數字轉換成的int型數字,因為它們的ASCII碼值恰好相差48;
//因此把char型數字減去48得到int型數字,例如'4'被轉換成4。
int num = firstPart.charAt(j) - 48;
//如果不是最後一位數字,而且數字不是零,則需要新增單位(十、百、千)
if (j != firstPartLen-1 && num != 0)
{
resultFirst += hanArr[num] + unitArr[firstPartLen - 2 - j];
}
//如果是最後一位數字,而且數字不是零,則不要新增單位
else if (j == firstPartLen - 1 && num != 0)
{
resultFirst += hanArr[num];
}
//如果這一節的中間兩個數字為0, 且第一位和最後一位數字不為0, 則需要讀出一個零
else if (j == 2 && num == 0 && firstPart.charAt(1) - 48 == 0
&& firstPart.charAt(0) - 48 != 0
&& firstPart.charAt(firstPartLen - 1) - 48 != 0)
{
resultFirst += hanArr[num];
}
//如果第三位為零,且第二位不為零,第四位不為零,則需要讀一個零
else if(j == 2 && num == 0 && firstPart.charAt(1) - 48 != 0
&& firstPart.charAt(firstPartLen - 1) - 48 != 0){
resultFirst += hanArr[num];
}
//如果第二位為零,且第一位和第三位不為零,則需要讀一個零
else if(j == 1 && num == 0 && firstPart.charAt(0) - 48 != 0
&& firstPart.charAt(2) - 48 != 0){
resultFirst += hanArr[num];
}
//剩下的就是hanArr和unitArr都不需要讀出來的情況
}
}
//轉換第二節
else if (i == 1)
{
//通過呼叫String類的substring方法來返回子串 [beginIndex, endIndex),
//即:包括起始索引,不包括結束索引。
String secondPart = numStr[0].substring(firstPartLen, (firstPartLen + 4));
//第二節的長度
int secPartLen = secondPart.length();
//依次遍歷第二節的每一位數字
for (int k = 0 ; k < secPartLen ; k ++ )
{
//String類的charAt(int index),返回指定索引處的字串值。(類似於陣列)。
//把char型數字轉換成的int型數字,因為它們的ASCII碼值恰好相差48;
//因此把char型數字減去48得到int型數字,例如'4'被轉換成4。
int num = secondPart.charAt(k) - 48;
//如果不是最後一位數字,而且數字不是零,則需要新增單位(十、百、千)
if (k != secPartLen-1 && num != 0)
{
resultSecond += hanArr[num] + unitArr[secPartLen - 2 - k];
}
//如果是最後一位數字,而且數字不是零,則不要新增單位
else if (k == secPartLen - 1 && num != 0)
{
resultSecond += hanArr[num];
}
//如果這一節的中間兩個數字為0, 且第一位和最後一位數字不為0, 則需要讀出一個零
else if (k == 2 && num == 0 && secondPart.charAt(1) - 48 == 0
&& secondPart.charAt(secPartLen - 1) - 48 != 0)
{
resultSecond += hanArr[num];
}
//如果第三位為零,且第二位不為零,第四位不為零,則需要讀一個零
else if(k == 2 && num == 0 && secondPart.charAt(1) - 48 != 0
&& secondPart.charAt(secPartLen - 1) - 48 != 0){
resultSecond += hanArr[num];
}
//如果第二位為零,且第一位和第三位不為零,則需要讀一個零
else if(k == 1 && num == 0 && secondPart.charAt(0) - 48 != 0
&& secondPart.charAt(2) - 48 != 0){
resultSecond += hanArr[num];
}
//如果第一位為0,第二位為零,第三位不為零,則需讀一個零
else if(k == 0 && num == 0 && secondPart.charAt(1) - 48 == 0
&& secondPart.charAt(2) - 48 != 0){
resultSecond += hanArr[num];
}
//如果第一位為零,第二位不為零則需讀一個零
else if(k == 0 && num == 0 && secondPart.charAt(1) - 48 != 0){
resultSecond += hanArr[num];
}
}
//如果四位數字全是0, 且第二節不是最後一節, 則只需讀出一個零。
//Integer類的parseInt(String s)方法:將整數字符串引數解析成一個帶符號的十進位制整數。
if (Integer.parseInt(secondPart) == 0 && partNum == 3)
{
resultSecond = hanArr[0];
}
}
//轉換第三節
else if (i == 2)
{
String thirdPart = numStr[0].substring((firstPartLen + 4), strLen);
int thirdPartLen = thirdPart.length();
for (i = 0 ; i < thirdPartLen ; i ++ )
{
int num = thirdPart.charAt(i) - 48;
//如果不是這一節的最後一位且數字不為0,則需要加單位
if (i != thirdPartLen-1 && num != 0)
{
resultThird += hanArr[num] + unitArr[thirdPartLen - 2 - i];
}
//如果是這一節的最後一位且數字不為0,則不需要加單位
else if (i == thirdPartLen - 1 && num != 0)
{
resultThird += hanArr[num];
}
//如果這一節中間兩個為0,且第一位和最後一位不為0,則需要讀一個零
else if (i == 2 && num == 0 && thirdPart.charAt(1) - 48 == 0
&& thirdPart.charAt(0) - 48 != 0
&& thirdPart.charAt(thirdPartLen - 1) - 48 != 0)
{
resultThird += hanArr[num];
}
//如果第三位為零,且第二位不為零,第四位不為零,則需要讀一個零
else if(i == 2 && num == 0 && thirdPart.charAt(1) - 48 != 0
&& thirdPart.charAt(thirdPartLen - 1) - 48 != 0){
resultThird += hanArr[num];
}
//如果第二位為零,且第一位和第三位不為零,則需要讀一個零
else if(i == 1 && num == 0 && thirdPart.charAt(0) - 48 != 0
&& thirdPart.charAt(2) - 48 != 0){
resultThird += hanArr[num];
}
//如果第一位為0,第二位為零,第三位不為零,則需讀一個零
else if(i == 0 && num == 0 && thirdPart.charAt(1) - 48 == 0
&& thirdPart.charAt(2) - 48 != 0){
resultThird += hanArr[num];
}
//如果第一位為零,第二位不為零則需讀一個零
else if(i == 0 && num == 0 && thirdPart.charAt(1) - 48 != 0){
resultThird += hanArr[num];
}
}
}
}
//遍歷小數部分
for(int i = 0;i < numStr[1].length();i++){
int num = numStr[1].charAt(i) - 48;
//如果數字不為零,則需要加單位
if(num != 0){
resultFourth += hanArr[num] + unitArr[i + 3 ];
}
//如果小數部分第一位為零,第二位不為零,則需要讀一個零
else if (i == 0 && num == 0 && numStr[1].charAt(1) - 48 !=0 ){
resultFourth += hanArr[num];
}
}
String result = "";
if (partNum == 1)
{
//如果數字僅為0
if (resultFirst == "")
{
result = hanArr[0] + "元" + resultFourth ;
}
else
{
result = resultFirst + "元" + resultFourth ;
}
}
else if (partNum == 2)
{
//如果第二節全為0
if (Integer.parseInt(numStr[0].substring(firstPartLen, (firstPartLen + 4))) == 0)
{
result = resultFirst+"萬元" + resultFourth ;
}
else
{
result = resultFirst + "萬" + resultSecond+ "元" + resultFourth ;
}
}
else if (partNum == 3)
{
result = resultFirst + "億" + resultSecond + "萬" +resultThird+ "元" + resultFourth;
//如果第二節和第三節均全為0
if (Integer.parseInt(numStr[0].substring(firstPartLen, (firstPartLen + 4))) == 0
&& Integer.parseInt(numStr[0].substring((firstPartLen + 4), strLen)) == 0)
{
result = resultFirst + "億元" + resultFourth ;
}
//如果第二節全為0且第三節不為0
else if (Integer.parseInt(numStr[0].substring(firstPartLen, (firstPartLen + 4))) == 0
&& Integer.parseInt(numStr[0].substring((firstPartLen + 4), strLen)) != 0){
result = resultFirst + "億" + resultThird + "元" + resultFourth;
}
}
return result;
}
}
public static void main(String[] args)
{
//等號左邊的Num2Rmb是nr的變數型別,右邊的Num2Rmb是構造器名
Num2Rmb nr = new Num2Rmb();
//通過Scanner類來實現互動式輸入與輸出
Scanner input = new Scanner(System.in);
//提示使用者輸入想要讀成人民幣的浮點數
System.out.println("請輸入要讀成人民幣的浮點數:");
//請輸入的浮點數儲存在變數num裡面,儲存為浮點數
double num = input.nextDouble();
//測試把一個浮點數num分解成整數部分和小數部分
System.out.println(Arrays.toString(Num2Rmb.divide(num)));
//將divide方法返回來的字元陣列,儲存在字元陣列numStr裡
String [] numStr = divide(num);
//輸出最終的人民幣讀法
System.out.println(nr.toHanStr(numStr));
//關閉input
input.close();
}
}
import java.util.Scanner;
public class Num2Rmb
{
private String[] hanArr= {"零" , "壹" , "貳" , "叄" , "肆" ,
"伍" , "陸" , "柒" , "捌" , "玖"};
private String[] unitArr = {"拾", "佰", "仟","角","分"};
/**
* 把一個浮點數分解成整數部分和小數部分字串
* @param num 需要被分解的浮點數
* @return 分解出來的整數部分和小數部分構成的陣列。第一個陣列元素是整數部分,第二個陣列元素是小數部分。
*/
private static String[] divide(double num)
{
//將一個浮點數強制型別轉換為long,即得到它的整數部分。
long zheng = (long)num;
//浮點數減去整數部分,得到小數部分,小數部分乘以100後再取整得到2位小數。
//Math類的round方法,返回與引數最接近(經四捨五入後)的整數。
long xiao = Math.round((num - zheng) * 100);
if (xiao < 10 ){
xiaoStr = 0 + "" + xiao ;
}else{
//String類的valueOf(int i)方法,返回整數引數的字串表示式。
xiaoStr = String.valueOf(xiao);
}
//下面用了2種方法把整數轉換為字串。
//return一個numString陣列。
String [] numString = {zheng +"",xiaoStr};
return numString;
}
/**
* 把一個12位以內的數字字串變成漢字字串
* @param numStr 需要被轉換的數字字串陣列
* @return 數字字串被轉換成的漢字字串。
*/
private String toHanStr(String[] numStr)
{
int strLen = numStr[0].length(); //獲得整數部分的字串的位數
if(strLen > 12){ //如果字串大於12位,就返回一個匿名的字串
return "您輸入的浮點數,其整數部分的位數超過了限定的12位,請重新輸入";
}else{
int yu = strLen % 4;
//partNum表示該數字字串可劃分成的節數(每4位為一節)。
//如餘數等於0,則將strLen/4賦值給partNum;否則將strLen/4 + 1賦值給partNum。
int partNum = yu == 0 ? strLen/4 : strLen/4 + 1;
//firstPartLen表示第一節的長度
int firstPartLen = strLen - (partNum - 1)*4;
String resultFirst = "";
String resultSecond = "";
String resultThird = "";
String resultFourth = "";
//依次遍歷數字字串的每一節
for (int i = 0 ; i < partNum ; i ++ )
{
//轉換第一節
if (i == 0)
{
//通過呼叫String類的substring方法來返回子串 [beginIndex, endIndex),
//即:包括起始索引,不包括結束索引。
String firstPart = numStr[0].substring(0, firstPartLen);
//依次遍歷第一節中的每一位數字
for (int j = 0 ; j < firstPartLen ; j ++ )
{
//String類的charAt(int index),返回指定索引處的字串值。
//把char型數字轉換成的int型數字,因為它們的ASCII碼值恰好相差48;
//因此把char型數字減去48得到int型數字,例如'4'被轉換成4。
int num = firstPart.charAt(j) - 48;
//如果不是最後一位數字,而且數字不是零,則需要新增單位(十、百、千)
if (j != firstPartLen-1 && num != 0)
{
resultFirst += hanArr[num] + unitArr[firstPartLen - 2 - j];
}
//如果是最後一位數字,而且數字不是零,則不要新增單位
else if (j == firstPartLen - 1 && num != 0)
{
resultFirst += hanArr[num];
}
//如果這一節的中間兩個數字為0, 且第一位和最後一位數字不為0, 則需要讀出一個零
else if (j == 2 && num == 0 && firstPart.charAt(1) - 48 == 0
&& firstPart.charAt(0) - 48 != 0
&& firstPart.charAt(firstPartLen - 1) - 48 != 0)
{
resultFirst += hanArr[num];
}
//如果第三位為零,且第二位不為零,第四位不為零,則需要讀一個零
else if(j == 2 && num == 0 && firstPart.charAt(1) - 48 != 0
&& firstPart.charAt(firstPartLen - 1) - 48 != 0){
resultFirst += hanArr[num];
}
//如果第二位為零,且第一位和第三位不為零,則需要讀一個零
else if(j == 1 && num == 0 && firstPart.charAt(0) - 48 != 0
&& firstPart.charAt(2) - 48 != 0){
resultFirst += hanArr[num];
}
//剩下的就是hanArr和unitArr都不需要讀出來的情況
}
}
//轉換第二節
else if (i == 1)
{
//通過呼叫String類的substring方法來返回子串 [beginIndex, endIndex),
//即:包括起始索引,不包括結束索引。
String secondPart = numStr[0].substring(firstPartLen, (firstPartLen + 4));
//第二節的長度
int secPartLen = secondPart.length();
//依次遍歷第二節的每一位數字
for (int k = 0 ; k < secPartLen ; k ++ )
{
//String類的charAt(int index),返回指定索引處的字串值。(類似於陣列)。
//把char型數字轉換成的int型數字,因為它們的ASCII碼值恰好相差48;
//因此把char型數字減去48得到int型數字,例如'4'被轉換成4。
int num = secondPart.charAt(k) - 48;
//如果不是最後一位數字,而且數字不是零,則需要新增單位(十、百、千)
if (k != secPartLen-1 && num != 0)
{
resultSecond += hanArr[num] + unitArr[secPartLen - 2 - k];
}
//如果是最後一位數字,而且數字不是零,則不要新增單位
else if (k == secPartLen - 1 && num != 0)
{
resultSecond += hanArr[num];
}
//如果這一節的中間兩個數字為0, 且第一位和最後一位數字不為0, 則需要讀出一個零
else if (k == 2 && num == 0 && secondPart.charAt(1) - 48 == 0
&& secondPart.charAt(secPartLen - 1) - 48 != 0)
{
resultSecond += hanArr[num];
}
//如果第三位為零,且第二位不為零,第四位不為零,則需要讀一個零
else if(k == 2 && num == 0 && secondPart.charAt(1) - 48 != 0
&& secondPart.charAt(secPartLen - 1) - 48 != 0){
resultSecond += hanArr[num];
}
//如果第二位為零,且第一位和第三位不為零,則需要讀一個零
else if(k == 1 && num == 0 && secondPart.charAt(0) - 48 != 0
&& secondPart.charAt(2) - 48 != 0){
resultSecond += hanArr[num];
}
//如果第一位為0,第二位為零,第三位不為零,則需讀一個零
else if(k == 0 && num == 0 && secondPart.charAt(1) - 48 == 0
&& secondPart.charAt(2) - 48 != 0){
resultSecond += hanArr[num];
}
//如果第一位為零,第二位不為零則需讀一個零
else if(k == 0 && num == 0 && secondPart.charAt(1) - 48 != 0){
resultSecond += hanArr[num];
}
}
//如果四位數字全是0, 且第二節不是最後一節, 則只需讀出一個零。
//Integer類的parseInt(String s)方法:將整數字符串引數解析成一個帶符號的十進位制整數。
if (Integer.parseInt(secondPart) == 0 && partNum == 3)
{
resultSecond = hanArr[0];
}
}
//轉換第三節
else if (i == 2)
{
String thirdPart = numStr[0].substring((firstPartLen + 4), strLen);
int thirdPartLen = thirdPart.length();
for (i = 0 ; i < thirdPartLen ; i ++ )
{
int num = thirdPart.charAt(i) - 48;
//如果不是這一節的最後一位且數字不為0,則需要加單位
if (i != thirdPartLen-1 && num != 0)
{
resultThird += hanArr[num] + unitArr[thirdPartLen - 2 - i];
}
//如果是這一節的最後一位且數字不為0,則不需要加單位
else if (i == thirdPartLen - 1 && num != 0)
{
resultThird += hanArr[num];
}
//如果這一節中間兩個為0,且第一位和最後一位不為0,則需要讀一個零
else if (i == 2 && num == 0 && thirdPart.charAt(1) - 48 == 0
&& thirdPart.charAt(0) - 48 != 0
&& thirdPart.charAt(thirdPartLen - 1) - 48 != 0)
{
resultThird += hanArr[num];
}
//如果第三位為零,且第二位不為零,第四位不為零,則需要讀一個零
else if(i == 2 && num == 0 && thirdPart.charAt(1) - 48 != 0
&& thirdPart.charAt(thirdPartLen - 1) - 48 != 0){
resultThird += hanArr[num];
}
//如果第二位為零,且第一位和第三位不為零,則需要讀一個零
else if(i == 1 && num == 0 && thirdPart.charAt(0) - 48 != 0
&& thirdPart.charAt(2) - 48 != 0){
resultThird += hanArr[num];
}
//如果第一位為0,第二位為零,第三位不為零,則需讀一個零
else if(i == 0 && num == 0 && thirdPart.charAt(1) - 48 == 0
&& thirdPart.charAt(2) - 48 != 0){
resultThird += hanArr[num];
}
//如果第一位為零,第二位不為零則需讀一個零
else if(i == 0 && num == 0 && thirdPart.charAt(1) - 48 != 0){
resultThird += hanArr[num];
}
}
}
}
//遍歷小數部分
for(int i = 0;i < numStr[1].length();i++){
int num = numStr[1].charAt(i) - 48;
//如果數字不為零,則需要加單位
if(num != 0){
resultFourth += hanArr[num] + unitArr[i + 3 ];
}
//如果小數部分第一位為零,第二位不為零,則需要讀一個零
else if (i == 0 && num == 0 && numStr[1].charAt(1) - 48 !=0 ){
resultFourth += hanArr[num];
}
}
String result = "";
if (partNum == 1)
{
//如果數字僅為0
if (resultFirst == "")
{
result = hanArr[0] + "元" + resultFourth ;
}
else
{
result = resultFirst + "元" + resultFourth ;
}
}
else if (partNum == 2)
{
//如果第二節全為0
if (Integer.parseInt(numStr[0].substring(firstPartLen, (firstPartLen + 4))) == 0)
{
result = resultFirst+"萬元" + resultFourth ;
}
else
{
result = resultFirst + "萬" + resultSecond+ "元" + resultFourth ;
}
}
else if (partNum == 3)
{
result = resultFirst + "億" + resultSecond + "萬" +resultThird+ "元" + resultFourth;
//如果第二節和第三節均全為0
if (Integer.parseInt(numStr[0].substring(firstPartLen, (firstPartLen + 4))) == 0
&& Integer.parseInt(numStr[0].substring((firstPartLen + 4), strLen)) == 0)
{
result = resultFirst + "億元" + resultFourth ;
}
//如果第二節全為0且第三節不為0
else if (Integer.parseInt(numStr[0].substring(firstPartLen, (firstPartLen + 4))) == 0
&& Integer.parseInt(numStr[0].substring((firstPartLen + 4), strLen)) != 0){
result = resultFirst + "億" + resultThird + "元" + resultFourth;
}
}
return result;
}
}
public static void main(String[] args)
{
//等號左邊的Num2Rmb是nr的變數型別,右邊的Num2Rmb是構造器名
Num2Rmb nr = new Num2Rmb();
//通過Scanner類來實現互動式輸入與輸出
Scanner input = new Scanner(System.in);
//提示使用者輸入想要讀成人民幣的浮點數
System.out.println("請輸入要讀成人民幣的浮點數:");
//請輸入的浮點數儲存在變數num裡面,儲存為浮點數
double num = input.nextDouble();
//測試把一個浮點數num分解成整數部分和小數部分
System.out.println(Arrays.toString(Num2Rmb.divide(num)));
//將divide方法返回來的字元陣列,儲存在字元陣列numStr裡
String [] numStr = divide(num);
//輸出最終的人民幣讀法
System.out.println(nr.toHanStr(numStr));
//關閉input
input.close();
}
}