分类: C/C++
2015-06-03 21:16:36
整数 /*个十百千万亿兆京垓秭穰沟涧正载极归僧那思猴格*/
小数 /*分厘毫丝忽微纤沙尘埃渺漠“模糊”“梭巡”“须臾”“瞬息”“弹指”“刹那”“六德”“虚空”“清净”“俺来也”“阿摩罗”“涅槃寂静”*/
话
之前这个翻译程序在nyoj上写过一个C语言版本的,今天又写了一遍,发现有两处数组越界访问了,在QT的版本改过来了。
关键点主要在多余的0如何在中文大写中消除,中文遵循只读出最后一个零。如果发现结束了还是零那么什么都不用输出了!
点击(此处)折叠或打开
-
const QString MainWindow::coreTranslateInteger(const QString &arabiaintegernumber)
-
{
-
QStringList cnintegetelement;
-
cnintegetelement<<"个"<<"万"<<"亿"<<"兆"<<"京"<<"垓"<<"秭"<<"穰"<<"沟"<<"涧"<<"正"<<"载"<<"极"<<"归"<<\
-
"僧"<<"那"<<"思"<<"猴"<<"格"; /*最大76位数,即千格*/
-
QStringList cnmultipleelement;
-
cnmultipleelement<<"拾"<<"佰"<<"仟";
-
QStringList cnnumber;
-
cnnumber<<"零"<<"壹"<<"贰"<<"叁"<<"肆"<<"伍"<<"陆"<<"柒"<<"捌"<<"玖";
-
QString cnintegerpart="";
-
-
/*Integer part Translation*/
-
int len=arabiaintegernumber.length();
-
int i=0;
-
while(i<len-1) { //之前写的是i
-
if(arabiaintegernumber[i]=='0' && arabiaintegernumber[i+1]!='0') {cnintegerpart+="零";}
-
else if(arabiaintegernumber[i]!='0') {cnintegerpart+=cnnumber[arabiaintegernumber[i].toLatin1()-'0'];}
-
else {;}
-
-
if((len-1-i)%4==1 && arabiaintegernumber[i]!='0') {cnintegerpart+="拾";}
-
else if((len-1-i)%4==2 && arabiaintegernumber[i]!='0') {cnintegerpart+="佰";}
-
else if((len-1-i)%4==3 && arabiaintegernumber[i]!='0') {cnintegerpart+="仟";}
-
else {;}
-
-
if((len-1-i)%4==0 && i>=3 && arabiaintegernumber[i]!='0' && arabiaintegernumber[i-1]!='0'\
-
&& arabiaintegernumber[i-2]!='0' && arabiaintegernumber[i-3]!='0') { //之前没有判断i>=3就直接执行了i-3
-
cnintegerpart+=cnintegetelement[(len-1-i)/4];
-
}
-
else if((len-1-i)%4==0 && i<3) {
-
cnintegerpart+=cnintegetelement[(len-1-i)/4];
-
}
-
else {
-
;
-
}
-
i++;
-
}
-
/*输出最后一个字符,以防止上一个循环中的i+1溢出和针对只有一个数字的情况(这时零还是要打印的)*/
-
if(arabiaintegernumber[i]!='0' && len>=1) {
-
cnintegerpart+=cnnumber[arabiaintegernumber[i].toLatin1()-'0'];
-
}
-
else if(arabiaintegernumber[i]=='0' && len==1) {
-
cnintegerpart+="零";
-
}
-
else {
-
;
-
}
-
-
return cnintegerpart;
-
}