① 注釋java人民幣小寫轉換大寫的代碼
publicstatic String toRMB(double money) {
char[] s1 = {'零', '壹', '貳', '叄', '肆', '伍', '陸', '柒', '捌', '玖'};
char[] s4 = {'分', '角', '元', '拾', '佰', '仟', '萬', '拾', '佰', '仟', '億', '拾', '佰', '仟', '萬'};
//這兩句是為後面轉換做字典准備
String str = String.valueOf(Math.round(money * 100 + 0.00001));
//這是把參數money小數點後移2位,然後取整,即按照「分」為單位取整,再轉為字元串型
String result = "";
for (int i = 0; i <str.length(); i++) {
int n = str.charAt(str.length() - 1 - i) - '0';
result = s1[n] + "" + s4[i] + result;
}
//這一段是按照轉換出來的字元串按位取數字,再按照上面的字典將其逐位翻譯成漢字
//如「2011」就翻譯成「貳仟零佰壹拾壹元」,「98700432.10」就是「玖仟捌佰柒拾零萬零仟肆佰叄拾貳元壹角零分」——註:這里的人民幣大寫漢字,貌似有錯誤,請查閱相關資料更正
//以上的翻譯可以看出,和我們平時的認讀有差別,於是以下就是在將那些應該糾正的地方手動剔除以下。上述兩個例子最後得到的結果應該是「貳仟零壹拾壹元整」,「玖仟捌佰柒拾萬零肆佰叄拾貳元壹角整」
result = result.replaceAll("零仟", "零");
result = result.replaceAll("零佰", "零");
result = result.replaceAll("零拾", "零");
result = result.replaceAll("零億", "億");
result = result.replaceAll("零萬", "萬");
result = result.replaceAll("零元", "元");
result = result.replaceAll("零角", "零");
result = result.replaceAll("零分", "零");
result = result.replaceAll("零零", "零");
result = result.replaceAll("零億", "億");
result = result.replaceAll("零零", "零");
result = result.replaceAll("零萬", "萬");
result = result.replaceAll("零零", "零");
result = result.replaceAll("零元", "元");
result = result.replaceAll("億萬","億");
result = result.replaceAll("零$", "");
result = result.replaceAll("元$", "元整");
result = result.replaceAll("角$", "角整");
return result;
}
② java簡單題:一組金額數據,用人民幣大寫顯示出來
/**
*程序目的:
*從命令行接收一個數,並將其轉化為中文金額的大寫方式
*例如123.45-->壹佰貳拾叄元肆角伍分
*@authorgdb
*
*實在是不符合規范,程序裡面的演算法沒有讓人明白得很清楚的注釋,讀上去覺得有
*點難度,可讀性不強。而且很多程序還存在不少bug,隨便一測就測出來了。
*所以本人還是決定重新寫一下這個程序,並且盡量做到消除不必要的bug。這個程
*序我沒有用什麼很精妙的演算法,不過用了一些Java類庫中的類,像是正則表達式之類
*
*/
publicclassTrans2RMB{
/**
*測試程序的可行性
*@paramargs
*/
publicstaticvoidmain(String[]args){
System.out.println(" --------將數字轉換成中文金額的大寫形式------------ ");
Trans2RMBt2r=newTrans2RMB();
Strings=t2r.cleanZero(t2r.splitNum(t2r.roundString(t2r.getNum())));
//如果轉換過後是一個空串,則不輸出屏幕
if(!"".equals(s)){
System.out.println("轉換成中文後為:"+s);;
}
System.out.println(" ---------------------------------------------");
}
/**
*從命令行接收一個數,在其中調用checkNum()方法對其進行
*驗證,並返回相應的值
*@return如果輸入合法,返回輸入的這個數
*/
privateStringgetNum(){
Strings=null;
System.out.println("請輸入一個數字(精確到小數點後兩位):");
//從命令行輸入這個浮點數
java.util.Scannerscanner=newjava.util.Scanner(System.in);
s=scanner.next();
//關閉這個Scanner
scanner.close();
//判斷用戶輸入是否合法
//若合法,返回這個值;若非法返回"0"
if(this.checkNum(s)){
returns;
}else{
return"";
}
}
/**
*判斷用戶輸入的數據是否合法,用戶只能輸入大於零的數字,不能輸入其它字元
*@paramsString
*@return如果用戶輸入數據合法,返回true,否則返回false
*/
privatebooleancheckNum(Strings){
//如果用戶輸入的數里有非數字字元,則視為非法數據,返回false
try{
floatf=Float.valueOf(s);
//如果這個數小於零則視為非法數據,返回false
if(f<0){
System.out.println("非法數據,請檢查!");
returnfalse;
}else{
returntrue;
}
}catch(NumberFormatExceptione){
System.out.println("非法數據,請檢查!");
returnfalse;
}
}
/**
*把用戶輸入的數以小數點為界分割開來,並調用numFormat()方法
*進行相應的中文金額大寫形式的轉換
*註:傳入的這個數應該是經過roundString()方法進行了四捨五入操作的
*@paramsString
*@return轉換好的中文金額大寫形式的字元串
*/
privateStringsplitNum(Strings){
//如果傳入的是空串則繼續返回空串
if("".equals(s)){
return"";
}
//以小數點為界分割這個字元串
intindex=s.indexOf(".");
//截取並轉換這個數的整數部分
StringintOnly=s.substring(0,index);
Stringpart1=this.numFormat(1,intOnly);
//截取並轉換這個數的小數部分
StringsmallOnly=s.substring(index+1);
Stringpart2=this.numFormat(2,smallOnly);
//把轉換好了的整數部分和小數部分重新拼湊一個新的字元串
StringnewS=part1+part2;
returnnewS;
}
/**
*對傳入的數進行四捨五入操作
*@paramsString從命令行輸入的那個數
*@return四捨五入後的新值
*/
privateStringroundString(Strings){
//如果傳入的是空串則繼續返回空串
if("".equals(s)){
return"";
}
//將這個數轉換成double類型,並對其進行四捨五入操作
doubled=Double.parseDouble(s);
//此操作作用在小數點後兩位上
d=(d*100+0.5)/100;
//將d進行格式化
s=newjava.text.DecimalFormat("##0.000").format(d);
//以小數點為界分割這個字元串
intindex=s.indexOf(".");
//這個數的整數部分
StringintOnly=s.substring(0,index);
//規定數值的最大長度只能到萬億單位,否則返回"0"
if(intOnly.length()>13){
System.out.println("輸入數據過大!(整數部分最多13位!)");
return"";
}
//這個數的小數部分
StringsmallOnly=s.substring(index+1);
//如果小數部分大於兩位,只截取小數點後兩位
if(smallOnly.length()>2){
StringroundSmall=smallOnly.substring(0,2);
//把整數部分和新截取的小數部分重新拼湊這個字元串
s=intOnly+"."+roundSmall;
}
returns;
}
/**
*把傳入的數轉換為中文金額大寫形式
*@paramflagint標志位,1表示轉換整數部分,0表示轉換小數部分
*@paramsString要轉換的字元串
*@return轉換好的帶單位的中文金額大寫形式
*/
privateStringnumFormat(intflag,Strings){
intsLength=s.length();
//貨幣大寫形式
StringbigLetter[]={"零","壹","貳","叄","肆","伍","陸","柒","捌","玖"};
//貨幣單位
Stringunit[]={"元","拾","佰","仟","萬",
//拾萬位到仟萬位
"拾","佰","仟",
//億位到萬億位
"億","拾","佰","仟","萬"};
Stringsmall[]={"分","角"};
//用來存放轉換後的新字元串
StringnewS="";
//逐位替換為中文大寫形式
for(inti=0;i<sLength;i++){
if(flag==1){
//轉換整數部分為中文大寫形式(帶單位)
newS=newS+bigLetter[s.charAt(i)-48]+unit[sLength-i-1];
}elseif(flag==2){
//轉換小數部分(帶單位)
newS=newS+bigLetter[s.charAt(i)-48]+small[sLength-i-1];
}
}
returnnewS;
}
/**
*把已經轉換好的中文金額大寫形式加以改進,清理這個字
*符串裡面多餘的零,讓這個字元串變得更加可觀
*註:傳入的這個數應該是經過splitNum()方法進行處理,這個字
*符串應該已經是用中文金額大寫形式表示的
*@paramsString已經轉換好的字元串
*@return改進後的字元串
*/
privateStringcleanZero(Strings){
//如果傳入的是空串則繼續返回空串
if("".equals(s)){
return"";
}
//如果用戶開始輸入了很多0去掉字元串前面多餘的'零',使其看上去更符合習慣
while(s.charAt(0)=='零'){
//將字元串中的"零"和它對應的單位去掉
s=s.substring(2);
//如果用戶當初輸入的時候只輸入了0,則只返回一個"零"
if(s.length()==0){
return"零";
}
}
//字元串中存在多個'零'在一起的時候只讀出一個'零',並省略多餘的單位
/*由於本人對演算法的研究太菜了,只能用4個正則表達式去轉換了,各位大蝦別介意哈...*/
Stringregex1[]={"零仟","零佰","零拾"};
Stringregex2[]={"零億","零萬","零元"};
Stringregex3[]={"億","萬","元"};
Stringregex4[]={"零角","零分"};
//第一輪轉換把"零仟",零佰","零拾"等字元串替換成一個"零"
for(inti=0;i<3;i++){
s=s.replaceAll(regex1[i],"零");
}
//第二輪轉換考慮"零億","零萬","零元"等情況
//"億","萬","元"這些單位有些情況是不能省的,需要保留下來
for(inti=0;i<3;i++){
//當第一輪轉換過後有可能有很多個零疊在一起
//要把很多個重復的零變成一個零
s=s.replaceAll("零零零","零");
s=s.replaceAll("零零","零");
s=s.replaceAll(regex2[i],regex3[i]);
}
//第三輪轉換把"零角","零分"字元串省略
for(inti=0;i<2;i++){
s=s.replaceAll(regex4[i],"");
}
//當"萬"到"億"之間全部是"零"的時候,忽略"億萬"單位,只保留一個"億"
s=s.replaceAll("億萬","億");
returns;
}
}
③ 誰有簡化的方法用JAVA編寫一個把表示人民幣的阿拉伯數字轉化為大寫漢字的方法
public class RenMingBi {
/**
* @param args add by zxx ,Nov 29, 2008
*/
private static final char[] data = new char[]{
'零','壹','貳','叄','肆','伍','陸','柒','捌','玖'
};
private static final char[] units = new char[]{
'元','拾','佰','仟','萬','拾','佰','仟','億'
};
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println(
convert(135689123));
}
public static String convert(int money)
{
StringBuffer sbf = new StringBuffer();
int unit = 0;
while(money!=0)
{
sbf.insert(0,units[unit++]);
int number = money%10;
sbf.insert(0, data[number]);
money /= 10;
}
return sbf.toString();
}
}
④ 如何用Java編程實現人民幣大小寫轉換
public String GetBigMoney(double eSender)
{
double NewMoney;
int Index, len, flag;
String StrTemp = null;
char[] p;
String Number[]={"零","壹","貳","叄","肆","伍","陸","柒","捌","玖"};
String MonetaryUnit[] = {"萬","仟","佰","拾","億","仟","佰","拾","萬","仟","佰","拾","元","角","分"} ;
NewMoney = Math.abs(eSender);
System.out.println(NewMoney);
DecimalFormat deciformat;
deciformat=(DecimalFormat)DecimalFormat.getInstance();
deciformat.applyPattern("#######");
String m = java.lang.String.valueOf(deciformat.format(NewMoney * 100));
int i;
if((i = m.indexOf('.')) != -1)
m = m.substring(0, i);
p = new char[m.length()];
//p = new char[40];
m.getChars(0, m.length(), p, 0);
//len=m.length();
if (NewMoney > 100000000000.00) {
StrTemp = ""; // FloatAsComma( NewMoney, False );
return StrTemp;
}
if (NewMoney < 0.01) {
StrTemp = "零";
return StrTemp;
}
if (eSender<0) {
StrTemp = "負";
}
else {
StrTemp = "";
}
flag = 1;
len =p.length;
System.out.println("1111");
System.out.println(len);
for (Index=(15-len);Index<15;Index++)
{
if (p[Index - 15 + len]!='0')
{
StrTemp = StrTemp + Number[Integer.parseInt(String.valueOf(p[Index-15+len]))];
StrTemp = StrTemp + MonetaryUnit[Index];
}
else
{
if (Index == 5)
{
if ((p[Index - 14 + len]!= '0') || (p[Index-13+len] != '0'))
{
StrTemp = StrTemp + MonetaryUnit[Index + 3];
flag = 0;
}
}
else
{
if ((Index == 12) ||( (Index == 8) && (flag ==1)) || (Index == 4))
{
StrTemp = StrTemp + MonetaryUnit[Index];
}
if ((p[Index-15 + len] != '0') && (Index != 14))
{
StrTemp = StrTemp +Number[Integer.parseInt(String.valueOf(p[Index-15+len]))];
;
}
}
}
}
if (p[m.length()-1] == '0')
{
StrTemp = StrTemp + "整";
}
return StrTemp;
}
⑤ java:人民幣大小寫轉換:比如比輸入123456,要求輸出:拾貳萬叄仟肆佰伍拾柒,請不要用數組方法
public class MoneySmallToBig {
轉自CSDN的東東
/**
* 人民幣大小寫轉換
*/
//別說這里用數組,這里定義大寫的是必須的
public static String[] number = new String[]{"零","壹","貳","叄","肆","伍","陸","柒","捌","玖" };
public static String[] units = new String[]{"元","拾","佰","仟"};
public static void change(String smoney){
StringBuffer sb=new StringBuffer();
//小數點的位置
int index=smoney.indexOf(".");
//biggerstr用於存放存有數字和單位的字元
StringBuffer biggerstr=new StringBuffer();
//處理小數部分
biggerstr.append("分");
biggerstr.append(number[Integer.parseInt(smoney.charAt(index+2)+"")]);
biggerstr.append("角");
biggerstr.append(number[Integer.parseInt(smoney.charAt(index+1)+"")]);
//處理整數部分
for(int i=0;i<index;i++){
sb.append(number[Integer.parseInt(smoney.charAt(i)+"")]);
}
sb=sb.reverse();
String insertstr=sb.toString();
for(int i=0;i<insertstr.length();i++){
//插入單位
if(i==0){
biggerstr.append("元");
}
else if((i+4)%4==0 && i!=8){
biggerstr.append("萬");
}
else if(i%8==0){
biggerstr.append("億");
}
else
biggerstr.append(units[i%4]);
//插入數字
biggerstr.append(insertstr.charAt(i));
}
//instead_zero字元串用於存放清除零之後的
String instead_zero=biggerstr.reverse().toString();
instead_zero=instead_zero.replaceAll("零分", "零");
instead_zero=instead_zero.replaceAll("零角", "零");
instead_zero=instead_zero.replaceAll("零佰", "零");
instead_zero=instead_zero.replaceAll("零仟", "零");
instead_zero=instead_zero.replaceAll("零拾", "零");
//把相連的零去掉
instead_zero=instead_zero.replaceAll("[零]+","零");
instead_zero=instead_zero.replaceAll("零元", "元");
instead_zero=instead_zero.replaceAll("零萬", "萬");
instead_zero=instead_zero.replaceAll("零億", "億");
//把字元串中的最後一個零去掉
if(instead_zero.charAt(instead_zero.length()-1)=='零'){
instead_zero=instead_zero.substring(0, instead_zero.length()-1);
}
System.out.println(instead_zero);
}
public static void main(String[] args) {
String smoney="1020089090.89";
change(smoney);
}
}
⑥ java方式實現數字轉換成中文大寫
String mm[]=rmb.split("\\.");這里的小數點應該該是這樣的
⑦ 人民幣大寫怎麼寫
人民幣的大寫是:壹、貳、叄、肆、伍、陸、柒、捌、玖、拾、佰、仟、萬、億、元、角、分、零。
大寫數字是中國特有的數字書寫方式,利用與數字同音的漢字取代數字,以防止數目被塗改。 據考證,大寫數字最早是由武則天發明,後經朱元璋改進完善。
(7)java人民幣大寫擴展閱讀
計數的數目字用大寫,是自古一直沿用到現在,雖然解放後有些賬目逐漸改用阿拉伯數字,但是重要賬目;支票匯款;股票國債票據依舊使用大寫漢字數字。那麼,使用大寫數字是起源於何時呢?
《咬文嚼字》2004年第12期上刊登的侯嘉亮先生《大寫數字的來歷》一文是這樣說的:「為反貪樹廉,朱元璋還制定了懲治經濟犯罪的嚴格法令 並在財務管理上進行技術防範,實施了一些行之有效的措施。
把記載錢糧數字的漢字『一、二、三、四、五、六、七、 八、九、十、百、千』改為大寫,用『壹、貳、叄、肆、伍、陸、柒、捌、玖、拾、佰、仟』,就是其中重要的一條。」這就是說,用大寫數字記數,是起源於明太祖朱元璋。
上面的說法可靠嗎?據有關的資料記載,並非如此。大寫數字的使用,最遲也得再上溯近七百年,首倡者當推富有改革精神的唐代武則天。她是絕無僅有的敢於自創文字的女皇;她的名字武曌的「曌」字,就是明證。
據明末清初的著名學者、考據家顧炎武所著《金石文字記·岱嶽觀造像記》,可知《岱嶽觀造像記》是則天朝所樹立的石碑,上面有大寫數字。顧炎武考證說:「凡數字作壹、貳、叄、肆、伍、陸、柒、捌、玖等,皆武後所改及自製字。」
大寫數字在則天朝以後不僅使用在碑石上,也出現在詩文中。唐著名大詩人白居易的宋版《白氏長慶集》中《論行營狀請勒魏博等四道兵馬卻守本界事》有這樣的記述:「況其軍一月之費,計實錢貳拾漆捌萬貫。」其中「貳」「拾」「漆」「捌」都是大寫數字。顧炎武說這個「漆」字,本應作「桼」,多的三點是後人妄自加鑿的。「漆」後簡為「柒」,又省作「七」。
大約到了宋代,官府文書所用計數數字都得用大寫。宋代學者程大昌在其所著《演繁露·十數改用畫字》中寫道:「今官府文書凡計其數,皆取聲同而畫多者改用之。於是壹、貳、叄、肆之類,本皆非數,直是取同聲之字,藉以為用,貴點畫多不可改換為奸耳。」
上面所舉有關的記述,都充分證明,使用大寫數字記數,是在武則天當政的時期,距今已有1300多年了,它並非像侯先生所說的始於明代朱元璋時期。
⑧ 用java編譯金額的中文大寫轉換。
/**
* 金額小數轉換成中文大寫金額
* @author Neil Han
*
*/
public class ConvertMoneyToUppercase {
private static final String UNIT[] = { "萬", "千", "佰", "拾", "億", "千", "佰",
"拾", "萬", "千", "佰", "拾", "元", "角", "分" };
private static final String NUM[] = { "零", "壹", "貳", "叄", "肆", "伍", "陸",
"柒", "捌", "玖" };
private static final double MAX_VALUE = 9999999999999.99D;
/**
* 將金額小數轉換成中文大寫金額
* @param money
* @return result
*/
public static String convertMoney(double money) {
if (money < 0 || money > MAX_VALUE)
return "參數非法!";
long money1 = Math.round(money * 100); // 四捨五入到分
if (money1 == 0)
return "零元整";
String strMoney = String.valueOf(money1);
int numIndex = 0; // numIndex用於選擇金額數值
int unitIndex = UNIT.length - strMoney.length(); // unitIndex用於選擇金額單位
boolean isZero = false; // 用於判斷當前為是否為零
String result = "";
for (; numIndex < strMoney.length(); numIndex++, unitIndex++) {
char num = strMoney.charAt(numIndex);
if (num == '0') {
isZero = true;
if (UNIT[unitIndex] == "億" || UNIT[unitIndex] == "萬"
|| UNIT[unitIndex] == "元") { // 如果當前位是億、萬、元,且數值為零
result = result + UNIT[unitIndex]; //補單位億、萬、元
isZero = false;
}
}else {
if (isZero) {
result = result + "零";
isZero = false;
}
result = result + NUM[Integer.parseInt(String.valueOf(num))] + UNIT[unitIndex];
}
}
//不是角分結尾就加"整"字
if (!result.endsWith("角")&&!result.endsWith("分")) {
result = result + "整";
}
//例如沒有這行代碼,數值"400000001101.2",輸出就是"肆千億萬壹千壹佰零壹元貳角"
result = result.replaceAll("億萬", "億");
return result;
}
public static void main(String[] args) {
double value = Double.parseDouble("40330701101.2");
System.out.println("您輸入的金額(小寫)為:" + value);
System.out.println("您輸入的金額(大寫)為:" + convertMoney(value));
}
}
⑨ 用JAVA如何把小寫數字變成大寫
我以前用的人名幣大小寫轉換,你改改應該就可以了:
public class Test6 {
static final String zhnum_0 = "零壹貳叄肆伍陸柒捌玖";
static final String zhnum = "零一二三四五六七八九";
static final String[] zhnum1 = { "", "十", "百", "千" };
static final String[] zhnum1_0 = { "", "拾", "佰", "仟" };
static final String[] zhnum2 = { "", "萬", "億", "萬億", "億億" };
public Test6() {
}
private static String numberToZH4(String s, boolean fan) {
StringBuffer sb = new StringBuffer();
if (s.length() != 4)
return null;
for (int i = 0; i < 4; i++) {
char c1 = s.charAt(i);
if (c1 == '0' && i > 1 && s.charAt(i - 1) == '0')
continue;
if (c1 != '0' && i > 1 && s.charAt(i - 1) == '0')
sb.append('零');
if (c1 != '0') {
if (fan) {
sb.append(zhnum_0.charAt(c1 - 48));
sb.append(zhnum1_0[4 - i - 1]);
} else {
sb.append(zhnum.charAt(c1 - 48));
sb.append(zhnum1[4 - i - 1]);
}
}
}
return new String(sb);
}
public static String numberToZH(long n, boolean fan) {
StringBuffer sb = new StringBuffer();
String strN = "000" + n;
int strN_L = strN.length() / 4;
strN = strN.substring(strN.length() - strN_L * 4);
for (int i = 0; i < strN_L; i++) {
String s1 = strN.substring(i * 4, i * 4 + 4);
String s2 = numberToZH4(s1, fan);
sb.append(s2);
if (s2.length() != 0)
sb.append(zhnum2[strN_L - i - 1]);
}
String s = new String(sb);
if (s.length() != 0 && s.startsWith("零"))
s = s.substring(1);
return s;
}
public static String numberToZH(double d, boolean fan) {
return numberToZH("" + d, fan);
}
public static String numberToZH(String str, boolean fan) {
StringBuffer sb = new StringBuffer();
int dot = str.indexOf(".");
if (dot < 0)
dot = str.length();
String zhengshu = str.substring(0, dot);
sb.append(numberToZH(Long.parseLong(zhengshu), fan));
if (dot != str.length()) {
sb.append("點");
String xiaoshu = str.substring(dot + 1);
for (int i = 0; i < xiaoshu.length(); i++) {
if (fan) {
sb.append(zhnum_0.charAt(Integer.parseInt(xiaoshu
.substring(i, i + 1))));
} else {
sb.append(zhnum.charAt(Integer.parseInt(xiaoshu.substring(
i, i + 1))));
}
}
}
String s = new String(sb);
if (s.startsWith("零"))
s = s.substring(1);
if (s.startsWith("一十"))
s = s.substring(1);
while (s.endsWith("零")) {
s = s.substring(0, s.length() - 1);
}
if (s.endsWith("點"))
s = s.substring(0, s.length() - 1);
return s;
}
public static String numberToRMB(double rmb) {
String strRMB = "" + rmb;
DecimalFormat nf = new DecimalFormat("#.#");
nf.setMaximumFractionDigits(2);
strRMB = nf.format(rmb).toString();
strRMB = numberToZH(strRMB, true);
if (strRMB.indexOf("點") >= 0) {
strRMB = strRMB + "零";
strRMB = strRMB.replaceAll("點", "圓");
String s1 = strRMB.substring(0, strRMB.indexOf("圓") + 1);
String s2 = strRMB.substring(strRMB.indexOf("圓") + 1);
strRMB = s1 + s2.charAt(0) + "角" + s2.charAt(1) + "分整";
} else {
strRMB = strRMB + "圓整";
}
return "人民幣(大寫):" + strRMB;
}
public static void main(String[] args) {
System.out.println(numberToRMB(342345.96));
System.out.println(numberToRMB(123));
}
}
⑩ java來實現最高五位的人民幣轉換為大寫的一個小程序,用最基礎的方法
//這個可以直接插到jsp頁面中的。也可以自行調整為servlet。
//處理大寫問題
int value = Integer.parseInt(getParameter("inmoney"));//inmoney是別的頁面傳遞的參數。
char[] hunit={'拾','佰','仟'}; //段內位置表示
char[] vunit={'萬','億'}; //段名表示
char[] digit={'零','壹','貳','叄','肆','伍','陸','柒','捌','玖'}; //數字表示
// long midVal = (long)(value*100); ////存在精度問題,如0.9->0.8999...
BigDecimal midVal = new BigDecimal(Math.round(value)); //轉化成整形,替換上句
String valStr=String.valueOf(midVal); //轉化成字元串
String head=valStr.substring(0,valStr.length()); //取整數部分
// String rail=valStr.substring(valStr.length()-2); //取小數部分
String prefix=""; //整數部分轉化的結果
String suffix=""; //小數部分轉化的結果
//處理小數點後面的數
// if(rail.equals("00")){ //如果小數部分為0
// suffix="整";
//}else{
// suffix=digit[rail.charAt(0)-'0']+"角"+digit[rail.charAt(1)-'0']+"分"; //否則把角分轉化出來
//}
//處理小數點前面的數
char[] chDig=head.toCharArray(); //把整數部分轉化成字元數組
boolean preZero=false; //標志當前位的上一位是否為有效0位(如萬位的0對千位無效)
byte zeroSerNum = 0; //連續出現0的次數
for(int i=0;i<chDig.length;i++){ //循環處理每個數字
int idx=(chDig.length-i-1)%4; //取段內位置
int vidx=(chDig.length-i-1)/4; //取段位置
if(chDig[i]=='0'){ //如果當前字元是0
preZero=true;
zeroSerNum++; //連續0次數遞增
if(idx==0 && vidx >0 &&zeroSerNum < 4){
prefix += vunit[vidx-1];
preZero=false; //不管上一位是否為0,置為無效0位
}
}else{
zeroSerNum = 0; //連續0次數清零
if(preZero) { //上一位為有效0位
prefix+=digit[0]; //只有在這地方用到'零'
preZero=false;
}
prefix+=digit[chDig[i]-'0']; //轉化該數字表示
if(idx > 0) prefix += hunit[idx-1];
if(idx==0 && vidx>0){
prefix+=vunit[vidx-1]; //段結束位置應該加上段名如萬,億
}
}
}
if(prefix.length() > 0){
prefix +="圓整"; //如果整數部分存在,則有圓的字樣
}