誰能将下列:货币数字英文大写转换函数 从PHP转成JS?
货币数字英文大写转换函数
曙光 日期:2002-11-21 14:23:50
#使用方法
<?php
$num=1220.21;
echo fmoney($num);//结果:1,220.21
echo umoney($num);
//结果:ONE THOUSAND AND TWO HUNDRED TWENTY DOLLARS AND TWENTY-ONE CENTS ONLY
echo umoney($num,"rmb");
//结果:ONE THOUSAND AND TWO HUNDRED TWENTY YUAN AND TWENTY-ONE FEN ONLY
?>
<?php
//define
$numTable[0]="ZERO ";
$numTable[1]="ONE ";
$numTable[2]="TWO ";
$numTable[3]="THREE ";
$numTable[4]="FOUR ";
$numTable[5]="FIVE ";
$numTable[6]="SIX ";
$numTable[7]="SEVEN ";
$numTable[8]="EIGHT ";
$numTable[9]="NINE ";
$numTable[10]="TEN ";
$numTable[11]="ELEVEN ";
$numTable[12]="TWELVE ";
$numTable[13]="THIRTEEN ";
$numTable[14]="FOURTEEN ";
$numTable[15]="FIFTEEN ";
$numTable[16]="SIXTEEN ";
$numTable[17]="SEVENTEEN ";
$numTable[18]="EIGHTEEN ";
$numTable[19]="NINETEEN ";
$numTable[20]="TWENTY ";
$numTable[30]="THIRTY ";
$numTable[40]="FORTY ";
$numTable[50]="FIFTY ";
$numTable[60]="SIXTY ";
$numTable[70]="SEVENTY ";
$numTable[80]="EIGHTY ";
$numTable[90]="NINETY ";
$commaTable[0]="HUNDRED ";
$commaTable[1]="THOUSAND ";
$commaTable[2]="MILLION ";
$commaTable[3]="MILLIARD ";
$commaTable[4]="BILLION ";
$commaTable[5]="????? ";
//单位
$moneyType["usd"]="DOLLARS ";
$moneyType["usd_1"]="CENTS ONLY";
$moneyType["rmb"]="YUAN ";
$moneyType["rmb_1"]="FEN ONLY";
//格式化货币
function fmoney($num) {
$num=0+$num;
$num = sprintf("%.02f",$num);
if(strlen($num) <= 6) return $num;
//从最后开始算起,每3个数它加一个","
for($i=strlen($num)-1,$k=1, $j=100; $i >= 0; $i--,$k++) {
$one_num = substr($num,$i,1);
if($one_num ==".") {
$numArray[$j--] = $one_num;
$k=0;
continue;
}
if($k%3==0 and $i!=0) {
//如果正好只剩下3个数字,则不加','
$numArray[$j--] = $one_num;
$numArray[$j--] = ",";
$k=0;
} else {
$numArray[$j--]=$one_num;
}
}
ksort($numArray);
return join("",$numArray);
}
function umoney($num,$type="usd") {
global $numTable,$commaTable,$moneyType;
if($type=="") $type="usd";
$fnum = fmoney($num);
$numArray = explode(",",$fnum);
$resultArray = array();
$k=0;
$cc=count($numArray);
for($i = 0; $i < count($numArray); $i++) {
$num_str = $numArray[$i];
//echo "<br>";
//小数位的处理400.21
if(eregi("\.",$num_str)) {
$dotArray = explode(".",$num_str);
if($dotArray[1] != 0) {
$resultArray[$k++]=format3num($dotArray[0]+0);
$resultArray[$k++]=$moneyType[strtolower($type)];
$resultArray[$k++]="AND ";
$resultArray[$k++]=format3num($dotArray[1]+0);
$resultArray[$k++]=$moneyType[strtolower($type)."_1"];
} else {
$resultArray[$k++]=format3num($dotArray[0]+0);
$resultArray[$k++]=$moneyType[strtolower($type)];
}
} else {
//非小数位的处理
if(($num_str+0)!=0) {
$resultArray[$k++]=format3num($num_str+0);
$resultArray[$k++]=$commaTable[--$cc];
//判断:除小数外其余若不为零则加and
for($j=$i; $j <= $cc; $j++) {
//echo "<br>";
//echo $numArray[$j];
if($numArray[$j] !=0) {
$resultArray[$k++]="AND ";
break;
}
}
}
}
}
return join("",$resultArray);
}
function format3num($num) {
global $numTable,$commaTable;
$numlen = strlen($num);
for($i = 0,$j = 0;$i < $numlen; $i++) {
$bitenum[$j++] = substr($num,$i,1);
}
if($num==0) return "";
if($numlen == 1) return $numTable[$num];
if($numlen == 2) {
if($num <= 20) return $numTable[$num];
//第一位不可能零
if($bitenum[1]==0) {
return $numTable[$num];
} else {
return trim($numTable[$bitenum[0]*10])."-".$numTable[$bitenum[1]];
}
}
//第一个不可能为零
if($numlen == 3) {
if($bitenum[1]==0 && $bitenum[2]==0) {
//100
return $numTable[$bitenum[0]].$commaTable[0];
} elseif($bitenum[1]==0) {
//102
return $numTable[$bitenum[0]].$commaTable[0].$numTable[$bitenum[2]];
} elseif ($bitenum[2]==0) {
//120
return $numTable[$bitenum[0]].$commaTable[0].$numTable[$bitenum[1]*10];
} else {
//123
return $numTable[$bitenum[0]].$commaTable[0].trim($numTable[$bitenum[1]*10])."-".$numTable[$bitenum[2]];
}
}
return $num;
}
?>
问题点数:100、回复次数:3Top
1 楼CXZ9(小笨笨)回复于 2003-01-07 10:46:02 得分 0
要不把这个Delphi的转成JS的
//不能转小数,好象有最大值限制,因是很久前写的,没仔细看了
procedure TForm1.BitBtn1Click(Sender: TObject);
begin
Edit1.Text:=NumberBig(Edit1.Text);
end;
function TForm1.NumberBig(Num: String): String;
Var
i:Integer;
StrTemp1,StrTemp2,Str:String;
NumTemp1:Integer;
//每位数字
DoubZero,wanzero,ThreeZero:Boolean;
//判断十,个位是否同时为零
OneB:Boolean; //判断第二位是否为1
unitStr:TStringList; //单位字符
begin
unitStr:=TStringList.Create;
unitStr.Add('HUNDRED');
unitStr.Add('THOUSAND');
unitStr.Add('MILLION');
StrTemp1:=Num;
For i:=1 To Length(StrTemp1) Do
Str:=StrTemp1[i]+Str;
StrTemp1:= Str ;
Str:='';
For i:=1 to Length(StrTemp1) Do
Begin
NumTemp1:=StrToInt(StrTemp1[i]);
If OneB=True Then
Begin
OneB:=False;
Continue;
End;
If ((i=1) or (i=4) OR (i=7)) and (StrTemp1[i+1]='1') Then
Begin
Case NumTemp1 Of
0:StrTemp2:=' TEN ';
1:StrTemp2:=' ELEVEN ';
2:StrTemp2:=' TWELVE ';
3:StrTemp2:=' THIRTEEN ';
4:StrTemp2:=' FOURTEEN ';
5:StrTemp2:=' FIFTEEN ';
6:StrTemp2:=' SIXTEEN ';
7:StrTemp2:=' SEVENTEEN ';
8:StrTemp2:=' EIGHTEEN ';
9:StrTemp2:=' NINETEEN ';
End;
OneB:=True;
End
Else If (i=2) or (i=5) OR (i=8) Then
Case NumTemp1 Of
0:StrTemp2:='';
1:StrTemp2:=' TEN ';
2:StrTemp2:=' TWENTY ';
3:StrTemp2:=' THIRTY ';
4:StrTemp2:=' FORTY ';
5:StrTemp2:=' FIFTY ';
6:StrTemp2:=' SIXTY ';
7:StrTemp2:=' SEVENTY ';
8:StrTemp2:=' EIGHTY ';
9:StrTemp2:=' NINETY ';
End
Else
Case NumTemp1 Of
0:StrTemp2:='';
1:StrTemp2:='ONE';
2:StrTemp2:='TWO';
3:StrTemp2:='THREE';
4:StrTemp2:='FOUR';
5:StrTemp2:='FIVE';
6:StrTemp2:='SIX';
7:StrTemp2:='SEVEN';
8:StrTemp2:='EIGHT';
9:StrTemp2:='NINE';
End ;
If StrTemp2='' Then //当前位是否为零
wanzero:=True;
If i=3 Then
Begin
If wanzero=False Then
Begin
If DoubZero=True Then
StrTemp2:=StrTemp2+' '+unitStr.Strings[0]+' AND '
Else
StrTemp2:=StrTemp2+' '+unitStr.Strings[0];
End
Else
Begin
If DoubZero=True Then
StrTemp2:=StrTemp2+' AND ';
End;
End
Else If (i=4) and (wanzero=False) Then
StrTemp2:=StrTemp2+' '+unitStr.Strings[1]+' '
Else If (i=5) and (wanzero=False) and (ThreeZero=False) Then
StrTemp2:=StrTemp2+' '+unitStr.Strings[1]+' '
Else If (i=6) and (wanzero=False) Then
Begin
If ThreeZero=False Then
StrTemp2:=StrTemp2+' '+unitStr.Strings[0]+' '+unitStr.Strings[1]+' '
Else
StrTemp2:=StrTemp2+' '+unitStr.Strings[0]+' ';
End
Else If i=7 Then
StrTemp2:=StrTemp2+' '+unitStr.Strings[2]+' '
Else If (i=9) and (wanzero=False) Then
StrTemp2:=StrTemp2+' '+unitStr.Strings[0];
If StrTemp2<>'' Then //某位之前的数是否都为零
DoubZero:=True;
If (i>3) and (StrTemp2<>'') Then //4,5,6位是否同时为零
ThreeZero:=True;
wanzero:=False;
Str:=StrTemp2+Str;
END;
unitStr.Free;
Result:=Str;
end;
Top
2 楼qiushuiwuhen(秋水无恨)回复于 2003-01-07 11:28:39 得分 100
<script>
var arr1=new Array(""," thousand"," million"," billion")
var arr2=new Array("zero","ten","twenty","thirty","forty","fifty","sixty","seventy","eighty","ninety")
var arr3=new Array("zero","one","two","three","four","five","six","sever","eight","nine");
var arr4=new Array("ten","eleven","twelve","thirteen","fourteen","fifteen","sixteen","seventeen","eighteen","nineteen");
function Translate(num){
var len=num.length,i,j=0,strRet="";
var cols=Math.ceil(len/3);
var first=len-cols*3
var strRet=""
for(i=first;i<len;i+=3){
++j;
if(i>=0)
num3=num.substring(i,i+3)
else
num3=num.substring(0,first+3)
strEng=English(num3)
if(strEng!=""){
if(strRet!="") strRet+=","
strRet+=English(num3)+arr1[cols-j]
}
}
return strRet
}
function English(num){
strRet=""
if((num.length==3)&&(num.substr(0,3)!="000")){
if((num.substr(0,1)!="0")){
strRet+=arr3[num.substr(0,1)]+" hundred"
if(num.substr(1,2)!="00")strRet+=" and "
}
num=num.substring(1);
}
if((num.length==2)){
if((num.substr(0,1)=="0")){
num=num.substring(1)
}
else if((num.substr(0,1)=="1")){
strRet+=arr4[num.substr(1,2)]
}
else{
strRet+=arr2[num.substr(0,1)]
if(num.substr(1,1)!="0")strRet+="-"
num=num.substring(1)
}
}
if((num.length==1)&&(num.substr(0,1)!="0")){
strRet+=arr3[num.substr(0,1)]
}
return strRet;
}
function qswh(num,type){
var tmp=num.toString().split(".");
if(tmp.length==1)return Translate(tmp[0]);
if(type=="rmb")return Translate(tmp[0])+" YUAN "+Translate(tmp[1])+" FEN";
return Translate(tmp[0])+" dollars "+Translate(tmp[1])+" cents";
}
</script>
<input id=number value=1220.21>
<input type=button value=Translate onclick='alert(qswh(document.all.number.value,"rmb"))'>
<input type=button value=Translate onclick=alert(qswh(document.all.number.value))>
Top
3 楼CXZ9(小笨笨)回复于 2003-05-23 08:43:05 得分 0
111Top




