人民币大小写转换算法
1.先把你的金额转换成Chat String类型;
2.把Chat Strin类型的金额变量已小数点为界分成两个部分;
3.分别用两个转换函数对小数点左右部分进行转换
AnsiString ChineseNumber(AnsiString num) \
{
num.Delete(num.Length()-2,1);//删除小数点
num.Insert(num.StringOfChar('0',8-num.Length()),1);
AnsiString retval="",CNum=";零壹贰叁肆伍陆柒捌玖",CUnit=";拾万仟佰拾元角分";
for(int p,i=1;i<9;i++)
{
p=num.SubString(i,1).ToInt();
retval+=CNum.SubString(p*2+1,2)+CUnit.SubString(i*2-1,2);
}
return retval;
例2
1.先把你的金额转换成Chat String类型;
2.把Chat Strin类型的金额变量已小数点为界分成两个部分;
3.分别用两个转换函数对小数点左右部分进行转换
AnsiString ChineseNumber(AnsiString num)
{
num.Delete(num.Length()-2,1);//删除小数点
num.Insert(num.StringOfChar('0',8-num.Length()),1);
AnsiString retval="",CNum=";零壹贰叁肆伍陆柒捌玖",CUnit=";拾万仟佰拾元
角分";
for(int p,i=1;i<9;i++)
{
p=num.SubString(i,1).ToInt();
retval+=CNum.SubString(p*2+1,2)+CUnit.SubString(i*2-1,2);
}
return retval;
例3 金额大小写转换
FUNCTION UPPERRMB
PARAMETER RMB
PRIVATE UNIT, NUMBER, I, RETVAR
UNIT = ';分角圆拾佰仟万拾佰仟亿拾佰仟万拾佰仟'
NUMBER = ';零壹贰叁肆伍陆柒捌玖'
RMB = INT(RMB*100+0.5)
RETVAR = ''
DO WHILE RMB>0
RETVAR = SUBSTR(NUMBER,2*(MOD(RMB,10))+1,2)+LEFT(UNIT,2)+RETVAR
RMB = INT(RMB/10)
UNIT = SUBSTR(UNIT,3)
ENDDO
RETVAR = STRTRAN(RETVAR,';零仟',';零')
RETVAR = STRTRAN(RETVAR,';零佰',';零')
RETVAR = STRTRAN(RETVAR,';零拾',';零')
RETVAR = STRTRAN(RETVAR,';零角',';零')
DO WHILE ';零零'$RETVAR
RETVAR = STRTRAN(RETVAR,';零零',';零')
ENDDO
RETVAR = STRTRAN(RETVAR,';零亿',';亿')
RETVAR = STRTRAN(RETVAR,';零万',';万')
RETVAR = STRTRAN(RETVAR,';亿万',';亿零')
RETVAR = STRTRAN(RETVAR,';零零',';零')
RETVAR = STRTRAN(RETVAR,';零圆',';圆')
RETVAR = STRTRAN(RETVAR,';零分',';整')
RETVAR = IIF(LEN(RETVAR)=0,';零圆整',RETVAR)
RETURN RETVAR
例4
//改编 inRm inrm@263 function NumToChar( n:Real):
wideString; //可以到万亿,并可随便扩大
const cNum:WideString=‘零壹贰叁肆伍陆柒捌玖-万仟佰拾亿仟佰拾万仟佰拾元角分‘;
cCha:array[0..1, 0..11]of string = (( ‘零仟‘,‘零佰‘,‘零拾‘,‘零零零‘,‘零零‘, ‘零亿‘,‘零万‘,‘零元‘,‘亿万‘,‘零角‘,‘零分‘
,‘零整‘), ( ‘零‘,‘零‘,‘零‘,‘零‘,‘零‘,‘亿‘,‘万‘,‘元‘,‘亿‘,‘零‘,‘整‘,‘整‘));
var i :Integer;
sNum :WideString; begin result := ‘‘; sNum := FormatFloat(‘0‘,n*100); for i := 1 to Length(sNum) do result := result + cNum[ord(sNum[i])-47] + cNum[26-Length(s
Num)+i];
for i:= 0 to 11 do //去掉多余的零
result := StringReplace(result, cCha[0,i], cCha[1,i], [rfReplaceAll]);
end;
例5. JAVA算法
package amountchange;
import java.math.BigDecimal;
CORBA.TRANSIENT;
public class AmountChange2RMB {
private static String bigLetter[] = { ";零", ";壹", ";贰", ";叁", ";肆", ";伍", ";陆",
";柒", ";捌", ";玖" }; private static String unit[] = { ";元", ";拾", ";佰", ";仟", ";万", ";拾", ";佰", ";仟", ";亿", ";拾", ";佰", ";仟", ";万" };
private static String unitSmall[] = { ";分", ";角" };
public static void main(String[] args) {
String[] testStrs = { "1234567888888.100"/* 大十进制数 */,
"1001"/* 没有小数,且含相邻的两个零 */, "101005.1"/*零在单位所处的位置*/, "1010"/*零在元位*/ };
System.out.println(new BigDecimal(testStrs[2]).toString());
System.out.println(trans(testStrs[2]));
}
public static String trans(String str) {
BigDecimal dec = check2BigDecimal(str);
if (dec == null)
return null;
str = PlainString();
String[] sArr = str.split("\\.");
String intOnly = sArr[0];
String smallOnly = "";
if (sArr.length == 2)
smallOnly = sArr[1];
if (smallOnly.length() > 2) {
smallOnly = smallOnly.substring(0, 2);
}
return transInt(intOnly) + transSmall(smallOnly);
}
public static String transInt(String str) {
if ("0".equals(str))
return "";
StringBuffer newS = new StringBuffer();
char[] cArr = CharArray();
for (int i = 0; i < cArr.length; i++) {
String u = unit[cArr.length - i - 1];
int position = ";元万亿".indexOf(u);
// 遇到零,特殊处理
if (cArr[i] == '0') {
/
/ 如果零在特殊位置上:比如个位,万位,亿位
if (position >= 0) {
// 如果零在个位:需要加上单位“元”
if (position == 0) {
newS.append(unit[cArr.length - i - 1]);
continue;
} else {// 如果零不在个位
// 零不在个位,且这个位后,紧跟着一个零:只需要加上单位
if (i < cArr.length - 1 && cArr[i + 1] == '0') {
newS.append(unit[cArr.length - i - 1]);
continue;
}
else {// 零不在个
位,且这个位后,没有紧跟着一个零:需要加上单位和大写数字(注意次序:单位在前,大写数字在后)
newS.append(unit[cArr.length - i - 1]);
newS.append(bigLetter[cArr[i] - 48]);
continue;
}
}
}
else {// 零不在特殊位置上
// 零不在特殊位置上,且这个位后,紧跟着一个零:忽略这个零
if (i < cArr.length - 1 && cArr[i + 1] == '0') { continue; }
// 零不在特殊位置上,且这个位后,没有紧跟着一个零:需要加上大写数字
newS.append(bigLetter[cArr[i] - 48]);
continue; }
}
// 不是零,常规处理
newS.append(bigLetter[cArr[i] - 48]);
newS.append(unit[cArr.length - i - 1]);
}
String();
}
public static String transSmall(String str) {
//因为最多精确到分,所有str的长度最多位2
if (str == null || "".equals(str))
return "";
char[] cArr = CharArray();
if (str.indexOf("0") == -1) {//不含有零,常规处理
StringBuffer newS = new StringBuffer();
for (int i = 0; i < cArr.length; i++) {
newS.append(bigLetter[cArr[i] - 48]);
newS.append(unitSmall[cArr.length - i - 1]);
}
String();
}
else {//含有零,分情况考虑
if (cArr[0] == '0' && cArr[cArr.length == 2 ? 1 : 0] == '0')
//两个都为零
return "";
if (cArr[0] == '0' && cArr.length == 2 && cArr[1] != '0')
//角位为零,分位不为零
return bigLetter[0] + bigLetter[cArr[1] - 48] + unitSmall[0];
if (cArr[0] != '0' && cArr.length == 2 && cArr[1] == '0')
//分位为零,角位不为零
return bigLetter[cArr[0] - 48] + unitSmall[1];
}
return "";
}
public static BigDecimal check2BigDecimal(String str) {
try {
double f = Double.valueOf(str);// 0.0 0.1 -5 ""
if (f < 0)
System.out.println(";输入数据小于0,请检查!");
return new BigDecimal(f);
}
catch (NumberFormatException e) {
e.printStackTrace();
}
return null;
}
}
public class NumToChinese {
public static String NumberToChinese(String input){
String s1=";零壹贰叁肆伍陆柒捌玖";
String s4=";分角整元拾佰仟万拾佰仟亿拾佰仟";
String temp="";
String result="";
if (input==null) return ";输入的字串不是数字串只能包括以下字符('0'~'9','.'),输入字串最大只能精确到仟亿,小数点只能两位!";
im();
float f;
try{
f=Float.parseFloat(temp);
}catch(Exception e){
return ";输入的字串不是数字串只能包括以下字符('0'~'9
','.'),输入字串最大只能精确到仟亿,小数点只能两位!";
}
int len=0;
if(temp.indexOf(".")==-1) len=temp.length();
else len=temp.indexOf(
".");
if(len>s4.length()-3) return(";输入字串最大只能精确到仟亿,小数点只能两位!");
int n1=0;
String num="";
String unit="";
for(int i=0;i<temp.length();i++){
if(i>len+2){break;}
if(i==len) {continue;}
n1=Integer.parseInt(String.valueOf(temp.charAt(i)));
num=s1.substring(n1,n1+1);
n1=len-i+2;
unit=s4.substring(n1,n1+1);
at(num).concat(unit);
}
if((len==temp.length())||(len==temp.length()-1)) at(";整");
if(len==temp.length()-2) at(";零分");
return result;
}
}
例6 JAVA算法
public class NumToChinese {
public static String NumberToChinese(String input){
String s1=";零壹贰叁肆伍陆柒捌玖";
String s4=";分角整元拾佰仟万拾佰仟亿拾佰仟";
String temp="";
String result="";
if (input==null) return ";输入的字串不是数字串只能包括以下字符('0'~'9','.'),输入字串最大只能精确到仟亿,小数点只能两位!";
im();
float f;
try{
f=Float.parseFloat(temp);
}catch(Exception e){
return ";输入的字串不是数字串只能包括以下字符('0'~'9','.'),输入字串最大只能精确到仟亿,小数点只能两位!";
}
int len=0;
if(temp.indexOf(".")==-1) len=temp.length();
else len=temp.indexOf(".");
if(len>s4.length()-3) return(";输入字串最大只能精确到仟亿,小数点只能两位!");
int n1=0;
String num="";
String unit="";
for(int i=0;i<temp.length();i++){
if(i>len+2){break;}
if(i==len) {continue;}
n1=Integer.parseInt(String.valueOf(temp.charAt(i)));
num=s1.substring(n1,n1+1);
n1=len-i+2;
unit=s4.substring(n1,n1+1);
at(num).concat(unit);
}
if((len==temp.length())||(len==temp.length()-1)) at(";整");
if(len==temp.length()-2) at(";零分");
return result;
}
}
例7
import DecimalFormat;
public class helloworld {
public static void main(String[] args) {
// TODO 自动生成方法存根
double inputvalue = 1234567890123.312030;
if(inputvalue == 0) {
System.out.print( ";零 ");
return;
}
String stringvalue,sintvalue,sdecvalue;
DecimalFormat ss = new DecimalFormat( "0.00 ");
stringvalue = ss.format(inputvalue);
int decbit;
decbit = stringvalue.indexOf( ". ");
if(decbit == 0){
sintvalue = stringvalue;
sdecvalue =
" ";
}
else{
sintvalue = stringvalue.substring(0,decbit);
sdecvalue = stringvalue.substring(decbit + 1);
}
String chesenumunit[] = { " ", ";壹 ", ";贰 ", ";叁 ", ";肆 ", ";伍 ", ";陆 ", ";柒 ", ";捌 ", ";玖 "};
helloworld hwtochn = new helloworld();
//处理整数
String schar,sreversed,schnintvalue= " ",schndecvalue= " ";
int ibit;
StringBuffer s=new StringBuffer(sintvalue);
sreversed = s.reverse().toString();
for(int i= 0;i <sreversed.length();i++)
{
schar = sreversed.substring(i, i+1);
ibit = Integer.parseInt(schar);
schnintvalue = chesenumunit[ibit] + hwtochn.GetUnit(i) +schnintvalue;
}
//清除多余的单位
String slist = ";拾佰仟万亿 ";
for(int i= schnintvalue.length()-1;i> =0;i--)
{
schar = schnintvalue.substring(i, i+1);
if(slist.indexOf(schar)> =0)
{
for(int j = i-1;j> =0;j--)
{
String shighchar;
shighchar = schnintvalue.substring(j, j+1);
if(slist.indexOf(shighchar) <0)
{
break;
}
else if(slist.indexOf(shighchar,slist.indexOf(schar)+1)> =0)
{
schnintvalue = schnintvalue.substring(0,i)+schnintvalue.substring(i+1);
break;
} } } }
schnintvalue = schnintvalue + ";圆 ";
//处理小数
ibit = Integer.parseInt(sdecvalue.substring(0,1));
if (ibit > 0)
schndecvalue = chesenumunit[ibit] + ";角 ";
ibit = Integer.parseInt(sdecvalue.substring(1,2));
if (ibit > 0)
schndecvalue = schndecvalue + chesenumunit[ibit] + ";分 ";
String schnnum;
schnnum = schnintvalue + schndecvalue+ ";整 ";
System.out.print(stringvalue+schnnum);
}
public String GetUnit(int num) {
//取单位 非零数字按位数取单位
int level;
level = num%4;
switch(level) {
case 0: if(num == 0) return " ";
bigdecimal转换为integerelse if(num%8 == 0)
return ";亿 ";
else return ";万 ";
case 1: return ";拾 ";
case 2: return ";佰 ";
case 3: return ";仟 ";
default: return " ";
} } }
例8 jsp页面调用applet实现人民币的大小写转换
实现方法一
applet实现页面是rmb.jsp,此页面是通过applet来实现人民币小写转换成大写的。此页面有三个变量需要在载入classes的时候进行初始化:
<applet type="applet" id="myApplet" codebase = "." name="TestApplet"
align="middle" code="b.Applicate.Rmb.class"
width="560" height="25">
<param name="RGB_Back" value="241|247|251">
&
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论