編寫一個程式,將浮點數轉換成人民幣讀法字串
package crazy.lee.chapter04;
import java.util.Arrays;
/**
*
* @author Windy46
*
*/
public class Question05 {
private String[] hanArr = {"零" , "壹" , "貳" , "叄" , "肆" ,
"伍" , "陸" , "柒" , "捌" , "玖"};
private String[] unitArr = {"十" , "百" , "千","萬","十","百","千","億","十"};
private String[] doubleArr = {"分" , "角"};
/**
* 把一個浮點數分解成整數部分和小數部分字串
* @param num 需要被分解的浮點數
* @return 分解出來的整數部分和小數部分。第一個陣列元素是整數部分,第二個陣列元素是小數部分。
*/
private String[] divide(double num)
{
// 將一個浮點數強制型別轉換為long,即得到它的整數部分
long zheng = (long)num;
// 浮點數減去整數部分,得到小數部分,小數部分乘以100後再取整得到2位小數
long xiao = Math.round((num - zheng) * 100);
// 下面用了2種方法把整數轉換為字串
return new String[]{zheng + "", String.valueOf(xiao)};
}
/**
* 把一個四位的數字字串變成漢字字串
* @param numStr 需要被轉換的四位的數字字串
* @return 四位的數字字串被轉換成的漢字字串。
*/
private String toHanStr(String numStr)
{
String result = "";
int numLen = numStr.length();
// 依次遍歷數字字串的每一位數字
for (int i = 0 ; i < numLen ; i++ )
{
// 把char型數字轉換成的int型數字,因為它們的ASCII碼值恰好相差48
// 因此把char型數字減去48得到int型數字,例如'4'被轉換成4。
int num = numStr.charAt(i) - 48;
// 如果不是最後一位數字,而且數字不是零,則需要新增單位(千、百、十)
if ( i != numLen - 1 & num != 0)
{
//按照中文讀法10讀成十,所以壹要省略,要新增單位但不用新增數字
if(result.lastIndexOf("壹")==result.length()-1&unitArr[numLen - 2 - i]=="十"){
result +=unitArr[numLen - 2 - i];
continue;
}
result += hanArr[num] + unitArr[numLen - 2 - i];
}
//我們中文讀法都是以4個位來讀的,如果當前位數為零,但是一個萬位,則需要新增萬單位
else if (num == 0 & i<numLen - 2&&unitArr[numLen - 2 - i]=="萬")//190200 1000000
{
//如果這個萬位的前一位是零,要把零去掉,因為沒有零萬的讀法
if(result.endsWith("零"))
result=result.substring(0, result.length()-1);
result +=unitArr[numLen - 2 - i];
}
//當前最後一位為零,當前數字為零,直接到下一個迴圈
else if(result.lastIndexOf("零")==result.length()-1&num==0){
continue;
}
// 否則不要新增單位
else
{
result += hanArr[num];
}
}
if(result.lastIndexOf("零")==result.length()-1) {
result=result.substring(0, result.length()-1);
}
return result;
}
private String toDoubleStr(String numStr)
{
String result = "";
int numLen =2;
// 依次遍歷數字字串的每一位數字
for (int i = 0 ; i < numLen ; i++ )
{
// 把char型數字轉換成的int型數字,因為它們的ASCII碼值恰好相差48
// 因此把char型數字減去48得到int型數字,例如'4'被轉換成4。
int num = numStr.charAt(i) - 48;
// 如果不是最後一位數字,而且數字不是零,則需要新增單位(角、分)
if ( i != numLen - 1 & num != 0)
{
result += hanArr[num] + doubleArr[numLen-1-i];
}
//當前最後一位為零,當前數字為零,直接到下一個迴圈
else if(result.lastIndexOf("零")==result.length()-1&num==0){
continue;
}
//是最後一位數字,而且數字不是零
else if( i == numLen - 1 & num != 0){
result += hanArr[num] + doubleArr[numLen-1-i];
}
// 否則不要新增單位
else
{
result += hanArr[num];
}
}
if(result.lastIndexOf("零")==result.length()-1) {
result=result.substring(0, result.length()-1);
}
return result;
}
public String printlnHan(Double num) {
String[] str=this.divide(num);
String result="";
result=toHanStr(str[0])+toDoubleStr(str[1]);
return result;
}
public static void main(String[] args)
{
Question05 nr = new Question05();
// 測試把一個浮點數分解成整數部分和小數部分
System.out.println(Arrays.toString(nr.divide(236711125.123)));
System.out.println(nr.printlnHan(236711125.123));
// 測試把一個四位的數字字串變成漢字字串
System.out.println(nr.toHanStr("1900200"));
System.out.println(nr.toHanStr("18010"));
System.out.println(nr.toHanStr("1000001"));
System.out.println(nr.toDoubleStr("033"));
}
}
吐槽:
程式碼比較混亂,還沒有重構,裡面的if語句也很多,有必要需要改進
但是邏輯思維什麼的真的想了好久,是值得深究的一個功能
而且現在測出來暫時沒有錯誤(應該是十億範圍內),不代表之後可能不會有,需要再搞清一下邏輯
結果: