`
bardo
  • 浏览: 378901 次
  • 性别: Icon_minigender_1
  • 来自: 上海
博客专栏
D1407912-ab64-3e76-ae37-b31aa4afa398
浅述PHP设计模式
浏览量:11820
9d6df9f7-91da-3787-a37c-0e826525dd5d
Zend Framewor...
浏览量:10128
85b628bd-a2ed-3de2-a4b1-0d34985ae8b6
PHP的IDE(集成开发环...
浏览量:9516
社区版块
存档分类
最新评论

人民币金额数字转中文大写程序多种编程语言汇总2011版

阅读更多

        这里目前给大家提供的是PHP,JSP(JAVA),ASP(VB6),JAVASCRIPT,VC++,Python,ActionScript3.0, VB.Net,C#  等语言的版本.

        网上搜索一下:你要的编程语言名称,再加上“人民币 数字 金额 转大写 汉字”,结果就会出来异常多的结果。所以,这种代码已相当烂了,到处都有。什么语言的都有。到处都有的代码,你为什么要重造轮子?没办法呀,我实在不能用那些无法维护的代码。尽管我的代码写得不算是最好的,但总要有一个象样的代码,我才安心!!
        很多人都在讲程序高手。其实高手就在于相当简单的基本功上。比如,你的for循环用得如何?你的if用得怎样。当然,早年用VB的人,if用得肯定好。因为,VB没有continue,你不得不反向思维,写好if。
        其实高手还有另一个关键点,那就是程序如何写。所有高手都擅长预处理数据,从而使得程序不会跟着数据跑。在这一前提下,任何一个问题,众多高手的写出来的代码流程均是相似的。而普通程序员则会千差万别。
        比如现在网上的人民币金额转大写程序,任何语言,你都不能找到一个满意的版本。也有人甚至说,这个算法,绝对不可能在30行以内完成(指PHP)。
        好久不写其它编程语言的代码了,接下来,会用到这样的程序。所以,作为一个伪高手,技术不是怎样的我,写出一个版本,PHP代码竟然只有21行。所以,决定分享给大家。觉得给初学者指一个路,看看if, for该当如何使用。(从PHP说,这个代码中如果if用不好,则会多出几个continue和至少一个break。另外,如果不注意使用数学方法,与预定义变量的配置,还会多出好几个if,当然,这并不算优秀的代码,仅供参考!!)
        其实,如果你仔细看一下代码,你就会发现,经过数据预处理后,将算法中有if全部集中起来了,并且能将其嵌入到循环中了。由此可见,先将数据处理成程序方便处理的格式,程序中就会少掉大量的代码。预处理数据后,程序不会跟着数据走。这一点在我公开课《数据处理算法设计要点》(链接中的网址是首发网址,百度文库未经许可,属于抄袭。当然,这个盗版人稍有一点人性,不象《PHP程序员必须掌握的PHP面向对象的特有的特性》盗版人,抹去了所有原作者去出处信息!!)中已经讲过。有心人可以在网上搜索到。所以,不多讲了。

        另外有一点,我们可以看出,PHP的代码行数是最少的。用好了PHP的人都了解,远比JAVA精简多了。比如,本函数中的数据预处理,PHP因为拥有sprintf,因而仅需一行代码。但JAVA却绕了相当大的弯子。从这一点来讲,PHP是造就优秀程序员的语言。而JAVA则是让傻瓜使用的语言。VB就更不用说了,完全是面对门外汉的。(个人看法,不用当真。当真你就输了!)

        其次,很多版本的,真正按汉语习惯,或者说真正按数字读法完全正确的写出的并不多。比如,302000,应当是叁拾万贰仟。但却有叁拾万零贰仟的版本。而300200应当是叁拾万零贰佰,却也有叁拾万贰佰的版本。所以,写代码的人,首先对汉语数字正确的读法都不清楚。
        这个函数是支持16位整数的。但是对于万亿,仍用的是万,因为,无法用兆,兆在当今是10的6次方,不再是12次方了。如果你不习惯,直接将第一个万改成万亿即可。
        要注意的是,32位机中,大数字会溢出,对于PHP,直接传入字串形式的测试。
        当然,目前还缺象C++,  Ruby的版本。如果有有兴趣完成,别忘了发给我,我会加进来,当然,程序中一定是暑你的大名了。

        网上代码,搜索出来的是什么样子?看一看好心人保存下来的我在2002年完成的代码大家可能就了解了。虽然,函数使用,流程处理的功夫上已不低,但还没有懂得,如何进行预处理。程序是完全跟着数据走的。那时,在大家看来是最好的VB代码了。可现在我看,仍然是很差的代码,因为,同下面现在写的代码比一下,行数更少。程序逻辑更加清析。2002年的代码的网址如下:

        http://topic.csdn.net/t/20020802/11/918115.html
        以下是各编程语言的代码。(注:Python代码于2011年4月17日最后修改)
        版权声明:
Copyright (c) 2010 Bardo QI

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

 

Php代码 
//人民币金额转大写程序 PHP版   
//CopyRight Bardo QI   
  
function numToCny($num){   
    $capUnit=array('万','亿','万','圆','');   
    $capDigit=array(2=>array('角','分',''), 4=>array('仟','佰','拾',''));   
    $capNum=array('零','壹','贰','叁','肆','伍','陆','柒','捌','玖');   
    if ((strpos(strval($num),'.')>16)||(!is_numeric($num)))   
        return '';   
    $num = sprintf("%019.2f",$num);   
    $CurChr=array('','');   
    for ($i=0,$ret='',$j=0;$i<5;$i++,$j=$i*4+floor($i/4)){   
        $nodeNum=substr($num,$j,4);   
        for($k=0,$subret='',$len=strlen($nodeNum);(($k<$len)&&(intval(substr($nodeNum,$k))!=0));$k++){   
            $CurChr[$k%2] = $capNum[$nodeNum{$k}].(($nodeNum{$k}==0)?'':$capDigit[$len][$k]);   
            if (!(($CurChr[0]==$CurChr[1]) && ($CurChr[$k%2]==$capNum[0])))   
                if(!(($CurChr[$k%2] == $capNum[0]) && ($subret=='') && ($ret=='')))   
                    $subret .= $CurChr[$k%2];   
        }   
        $subChr = $subret.(($subret=='')?'':$capUnit[$i]);   
        if(!(($subChr == $capNum[0]) && ($ret=='')))   
            $ret .= $subChr;   
    }   
    $ret=($ret=="")?$capNum[0].$capUnit[3]:$ret;       
    return $ret;   
}  

 

//人民币金额转大写程序 JavaScript版   
//CopyRight Bardo QI   
  
function numToCny(num){   
    var capUnit = ['万','亿','万','圆',''];   
    var capDigit = { 2:['角','分',''], 4:['仟','佰','拾','']};   
    var capNum=['零','壹','贰','叁','肆','伍','陆','柒','捌','玖'];   
    if (((num.toString()).indexOf('.') > 16)||(isNaN(num)))    
        return '';   
    num = ((Math.round(num*100)).toString()).split('.');
 num = (num[0]).substring(0, (num[0]).length-2)+'.'+ (num[0]).substring((num[0]).length-2,(num[0]).length);
    num =((Math.pow(10,19-num.length)).toString()).substring(1)+num;   
    var i,ret,j,nodeNum,k,subret,len,subChr,CurChr=[];   
    for (i=0,ret='';i<5;i++,j=i*4+Math.floor(i/4)){   
        nodeNum=num.substring(j,j+4);   
        for(k=0,subret='',len=nodeNum.length;((k<len) && (parseInt(nodeNum.substring(k),10)!=0));k++){   
            CurChr[k%2] = capNum[nodeNum.charAt(k)]+((nodeNum.charAt(k)==0)?'':capDigit[len][k]);   
            if (!((CurChr[0]==CurChr[1]) && (CurChr[0]==capNum[0])))   
                if(!((CurChr[k%2] == capNum[0]) && (subret=='') && (ret=='')))   
                    subret += CurChr[k%2];   
        }   
        subChr = subret + ((subret=='')?'':capUnit[i]);   
        if(!((subChr == capNum[0]) && (ret=='')))   
            ret += subChr;   
    }   
    ret=(ret=='')? capNum[0]+capUnit[3]: ret;     
    return ret;   
} 

 

'人民币金额转大写程序 Asp、 Vb6版   
'CopyRight Bardo QI   
  
Function numToCny(num)   
    capUnit = Array("万", "亿", "万", "圆", "")   
    capDigit = Array(Array(), Array(), Array("角", "分", ""), Array(), Array("仟", "佰", "拾", ""))   
    capNum = Array("零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖")   
    If (((InStr(1, num, ".") > 16) Or (Not IsNumeric(num)))) Then   
        numToCny = ""  
        Exit Function   
    End If   
    num = FormatNumber(num, 2, , , 0)   
    num = Mid(CStr(10 ^ (19 - Len(num))), 2) + num   
    CurChr = Array("", "")   
    ret = ""  
    For i = 0 To 4  
        j = i * 4 + Int(i / 4) + 1  
        nodeNum = Mid(num, j, 4)   
        slen = Len(nodeNum)   
        subret = ""  
        For k = 1 To slen   
            If Int(Mid(nodeNum, k)) = 0 Then   
                Exit For   
            End If   
            CurChr(k Mod 2) = capNum(Int(Mid(nodeNum, k, 1))) + IIf(Int(Mid(nodeNum, k, 1)) = 0, "", capDigit(slen)(k - 1))   
            If (Not ((CurChr(0) = CurChr(1)) And (CurChr(0) = capNum(0)))) Then   
                If (Not ((CurChr(k Mod 2) = capNum(0)) And (subret = "") And (ret = ""))) Then   
                    subret = subret + CurChr(k Mod 2)   
                End If   
            End If   
        Next   
        subChr = subret + IIf((subret = ""), "", capUnit(i))   
        If (Not ((subChr = capNum(0)) And (ret = ""))) Then   
            ret = ret + subChr   
        End If   
    Next   
    ret=Iif((ret=""), capNum(0)+capUnit(3), ret)    
    numToCny = ret   
End Function  

 

 

//人民币金额转大写程序 jsp, Java版
//CopyRight Bardo QI
//警告,因为未装JAVA编译器,所以,这一代码未经测试!
import java.util.ArrayList;
import java.util.Math.*;
import java.lang.*;
String numToCny(String num){
    String capUnit[] ={"万","亿","万","圆",""};
    String capDigit[][] = { {""},{""},{"角","分",""},{""},{"仟","佰","拾",""}};
    String capNum[]={"零","壹","贰","叁","肆","伍","陆","柒","捌","玖"};

    if (num.indexOf(".") > 16)
        return "ERROR";
    double dnum=Double.parseDouble(num);
    dnum = Math.round(dnum*100)/100;
    if (Double.isNaN(dnum))
        return "ERROR";
    String snum = Double.toString(dnum);
    double pnum = Math.pow(10,19-snum.length());
    String psnum = Double.toString(pnum);
    snum = psnum.substring(1)+snum;
    String ret,nodeNum,subret,subChr;
    ArrayList CurChr = new ArrayList(2);
    int i,j,k,len;
    for (i=0,ret="";i<5;i++,j=i*4+(int)Math.floor(i/4)){
        nodeNum=snum.substring(j,j+4);
        for(k=0,subret="",len=nodeNum.length();((k<len) && (Integer.parseInt(nodeNum.substring(k))!=0));k++){
            CurChr.set(k%2,capNum[Integer.parseInt(nodeNum.substring(k,k+1))]+((nodeNum.substring(k,k+1).equals("0"))?"":capDigit[len][k]));
            if (!((CurChr.get(0)==CurChr.get(1)) && (CurChr.get(0)==capNum[0])))
                if(!((CurChr.get(k%2) == capNum[0]) && (subret.equals(""))  && (ret.equals(""))))
                    subret += CurChr.get(k%2);
        }
        subChr = subret + ((subret.equals(""))?"":capUnit[i]);
        if(!((subChr == capNum[0]) && (ret.equals(""))))
            ret += subChr;
    }
    ret=(ret.equals(""))? capNum[0]+capUnit[3]: ret;
    return ret;
}

 

 

//人民币金额转大写程序VC++版   
//CopyRight Bardo QI   
  
CString numtoCny(double Num)   
{   
    char* capUnit[]={"万","亿","万","圆",""};   
    char* capDigit[5][4]={{""},{""},{"角","分",""},{""},{"仟","佰","拾",""}};   
    char* capNum[]={"零","壹","贰","叁","肆","伍","陆","柒","捌","玖"};   
    CString num,ret="",nodeNum="",subret,subChr,thisChr,lastChr,ch;   
    num.Format("%019.2f",Num);   
    if(num.Find(".")>16)   
        return ret;   
    int i,j,k,len,chn;   
    for (i=0;i<5;i++,j=i*4+int(i/4)){   
        nodeNum= num.Mid(j,4);   
        subret="";   
        lastChr="";   
        for(k=0,len=nodeNum.GetLength();((k<len)&&(atoi((LPCTSTR)nodeNum.Mid(k,4-k))!=0));k++){   
            ch= nodeNum[k];   
            chn=atoi((LPCTSTR)ch);   
            thisChr = capNum[chn] ;   
            thisChr += (chn==0) ? "" : capDigit[len][k];   
            if (!((thisChr==lastChr) && (thisChr==capNum[0])))   
                if(!((thisChr == capNum[0]) && (subret=="") && (ret=="")))   
                    subret += thisChr;   
            lastChr=thisChr;   
        }   
        subChr = subret;   
        subChr += (subret=="")?"":capUnit[i];   
        if(!((subChr == capNum[0]) && (ret=="")))   
            ret += subChr;   
    }   
    (ret=="")?ret.Format("%s%s",capNum[0],capUnit[3]):ret;    
    return ret;   
}  

 

#人民币金额转大写程序Python版本      
#Copyright: zinges at foxmail.com       
#blog: http://zingers.iteye.com     
#感谢zinges提供了Python的版本     
import math   
def numtoCny(num):   
    capUnit = ['万','亿','万','圆','']   
    capDigit = { 2:['角','分',''], 4:['仟','佰','拾','']}   
    capNum=['零','壹','贰','叁','肆','伍','陆','柒','捌','玖']   
    snum = str('%019.02f') % num   
    if snum.index('.')>16:   
        return ''  
    ret,nodeNum,subret,subChr='','','',''  
    CurChr=['','']   
    for i in range(5):   
        j=int(i*4+math.floor(i/4))   
        subret=''  
        nodeNum=snum[j:j+4]   
        lens=len(nodeNum)   
        for k in range(lens):   
            if int(nodeNum[k:])==0:   
                continue  
            CurChr[k%2] = capNum[int(nodeNum[k:k+1])]   
            if nodeNum[k:k+1] != '0':   
                CurChr[k%2] += capDigit[lens][k]   
            if  not ((CurChr[0]==CurChr[1]) and (CurChr[0]==capNum[0])):   
                if not((CurChr[k%2] == capNum[0]) and (subret=='') and (ret=='')):   
                    subret += CurChr[k%2]   
        subChr = [subret,subret+capUnit[i]][subret!='']   
        if not ((subChr == capNum[0]) and (ret=='')):   
            ret += subChr   
    return [ret,capNum[0]+capUnit[3]][ret=='']  

 

//人民币金额转大写程序 ActionScript 3.0版   
//CopyRight Bardo QI   
  
public function numToCny(num:String):String{   
    var capUnit:Array =['万','亿','万','圆',''];   
    var capDigit:Array = [[],[], ['角','分',''],[], ['仟','佰','拾','']];   
    var capNum:Array=['零','壹','贰','叁','肆','伍','陆','柒','捌','玖'];   
    if ((num.indexOf('.') > 16)||(isNaN(parseFloat(num))))    
        return '';   
    var dnum:Number = Math.round(parseFloat(num)*100)/100;    
    num = dnum.toString();   
    var inum:Number = Math.pow(10,19-num.length);    
    var pnum:String = inum.toString();   
    num = pnum.substring(1)+num;   
    var i:Number,ret:String,j:Number,nodeNum:String,k:Number,subret:String,len:Number,subChr:String,CurChr:Array=['',''];   
    for (i=0,ret='';i<5;i++,j=i*4+Math.floor(i/4)){   
        nodeNum=num.substring(j,j+4);   
        for(k=0,subret='',len=nodeNum.length;((k<len) && (parseInt(nodeNum.substring(k))!=0));k++){   
            CurChr[k%2] = capNum[parseInt(nodeNum.charAt(k))]+((nodeNum.charAt(k)=='0')?'':capDigit[len][k]);   
            if (!((CurChr[0]==CurChr[1]) && (CurChr[0]==capNum[0])))   
                if(!((CurChr[k%2] == capNum[0]) && (subret=='') && (ret=='')))   
                    subret += CurChr[k%2];   
        }   
        subChr = subret + ((subret=='')?'':capUnit[i]);   
        if(!((subChr == capNum[0]) && (ret=='')))   
            ret += subChr;   
    }   
    ret=(ret=='')? capNum[0]+capUnit[3]: ret;     
    return ret;   
}  

 

'人民币金额转大写程序 VB.Net版   
    'CopyRight Bardo QI   
  
    Function numToCny(ByVal num)   
        Dim capUnit() As String = {"万", "亿", "万", "圆", ""}   
        Dim capDigit(,) As String = {{"", "", "", ""}, {"", "", "", ""}, {"角", "分", "", ""}, {"", "", "", ""}, {"仟", "佰", "拾", ""}}   
        Dim capNum() As String = {"零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖"}   
        If (((InStr(1, num, ".") > 16) Or (Not IsNumeric(num)))) Then   
            numToCny = ""  
            Exit Function   
        End If   
        num = FormatNumber(num, 2, , , 0)   
        num = Mid(CStr(10 ^ (19 - Len(num))), 2) + num   
        Dim CurChr() = {"", ""}, nodeNum As String, subret As String, subChr As String, slen As Integer, i As Integer, j As Integer, k As Integer   
        Dim ret As String = ""  
        For i = 0 To 4  
            j = i * 4 + Int(i / 4) + 1  
            nodeNum = Mid(num, j, 4)   
            slen = Len(nodeNum)   
            subret = ""  
            For k = 1 To slen   
                If Int(Mid(nodeNum, k)) = 0 Then   
                    Exit For   
                End If   
                CurChr(k Mod 2) = capNum(Int(Mid(nodeNum, k, 1))) + IIf(Int(Mid(nodeNum, k, 1)) = 0, "", capDigit(slen, k - 1))   
                If (Not ((CurChr(0) = CurChr(1)) And (CurChr(0) = capNum(0)))) Then   
                    If (Not ((CurChr(k Mod 2) = capNum(0)) And (subret = "") And (ret = ""))) Then   
                        subret = subret + CurChr(k Mod 2)   
                    End If   
                End If   
            Next   
            subChr = subret + IIf((subret = ""), "", capUnit(i))   
            If (Not ((subChr = capNum(0)) And (ret = ""))) Then   
                ret = ret + subChr   
            End If   
        Next   
        numToCny = IIf((ret = ""), capNum(0) + capUnit(3), ret)   
    End Function  

  

        //人民币金额转大写程序C#版
        //CopyRight Bardo QI
        string numtoCny(decimal Num){
	        string[] capUnit = {"万","亿","万","圆",""};
            string[,] capDigit = { { "", "", "", "" }, { "", "", "", "" }, { "角", "分", "", "" }, { "", "", "", "" }, { "仟", "佰", "拾", "" } };   
	        string[] capNum = {"零","壹","贰","叁","肆","伍","陆","柒","捌","玖"};
            string num, ret = "", nodeNum = "", subret, subChr;
            string[] thisChr={"",""};
            num = String.Format("{0:0000000000000000.00}",Num);
            if(num.IndexOf(".")>16)
	            return ret;
            int i,j,k,len,ch;
            for (i=0,j=0;i<5;i++,j=i*4 + int.Parse(Math.Floor((double)i/4).ToString()) ){
                len = (j < 17) ? 4 : 2;
                nodeNum = num.Substring(j, len);
	            subret="";
                for (k = 0; ((k < len) && (int.Parse(nodeNum.Substring(k, len - k)) != 0)); k++){
                    ch = int.Parse(nodeNum.Substring(k, 1));
                    thisChr[i%2] = capNum[ch];
                    thisChr[i % 2] += (ch == 0) ? "" : capDigit[len,k];
                    if (!((thisChr[0] == thisChr[1]) && (thisChr[i % 2] == capNum[0])))
                        if (!((thisChr[i % 2] == capNum[0]) && (subret == "") && (ret == "")))
                            subret += thisChr[i % 2];
                }
                subChr = subret;
	            subChr += (subret=="")?"":capUnit[i];
	            if(!((subChr == capNum[0]) && (ret=="")))
    	            ret += subChr;
            }
            ret=(ret=="")? capNum[0]+capUnit[3]:ret;
            return ret;
        }
    }

 

 

版权声明:本文是作者版权文章,未经作者以及javaeye的许可不得转载!特别声明:禁止百度文库恶意转载的剽窃行径!!

更新提示:Java版的代码己经过TextPad编译通过。

9
2
分享到:
评论
21 楼 周仁明 2014-05-06  
xin911 写道
周仁明 写道
js的借用了,谢谢!java的版本必然是不对的问题很多。

JS的有错误。
0元的时候,会出现undefined角。1分的时候也有错误,undefined角1分。

自己加了判断了
20 楼 xin911 2014-04-23  
周仁明 写道
js的借用了,谢谢!java的版本必然是不对的问题很多。

JS的有错误。
0元的时候,会出现undefined角。1分的时候也有错误,undefined角1分。
19 楼 周仁明 2014-03-06  
js的借用了,谢谢!java的版本必然是不对的问题很多。
18 楼 Sunny_kaka 2013-04-30  
js的正在使用,感谢分享
17 楼 bardo 2012-12-02  
zhangshangfeng 写道
我是个纯粹的java菜鸟,太尴尬了,java部分的代码很是看不懂,还没注释。难道,高手也好,伪高手也罢,写出来的东西就是跟专家一样,就是为了让一般人或者菜鸟看不懂的吗?看到最后那3目,我崩溃了!我觉得我还是先搞点基础的看看吧,是不是我的基础还没学好。

你的建议不错:按你要求,我重写了,
http://bardo.iteye.com/blog/1739615
请您指正!
16 楼 zhangshangfeng 2012-07-17  
我是个纯粹的java菜鸟,太尴尬了,java部分的代码很是看不懂,还没注释。难道,高手也好,伪高手也罢,写出来的东西就是跟专家一样,就是为了让一般人或者菜鸟看不懂的吗?看到最后那3目,我崩溃了!我觉得我还是先搞点基础的看看吧,是不是我的基础还没学好。
15 楼 chenliang1234576 2012-07-03  
有才,有才。。。
14 楼 modiliany 2012-04-08  
关注的是您的算法, java中还要注意的是,数值太多, 转换成字符串时, 会变成科学计数法,导致抛出异常。
13 楼 yhn1990 2011-09-04  
java版的肯定不对啦...
ret=(ret=="")? capNum[0]+capUnit[3]:ret;  

String 不能直接等号判断的 
"".eq ret
12 楼 yhn1990 2011-09-04  
java版的肯定是不对啦
11 楼 jamcode 2011-08-31  
bardo 写道
jamcode 写道
楼主杯具了,楼主不会写Python代码

http://www.jamcode.org/

是吧,这可是完全测试通过的程序,请问您,该怎样写Python??


嗯,哈哈, 无聊也想写一个Python版时,再看了看中文数字读法,发现杯具了
唉,我的半调子代码,
from operator import add
from itertools import cycle,groupby
units=["拾","佰","仟","万","拾","佰","仟","亿"]
nums=["零","壹","贰","叁","肆","伍","陆","柒","捌","玖"]
splitUnit=["万","亿"]
def cny(numStr):
  a=zip(numStr[::-1][1:],cycle(units))
  a=reduce(add,[list(v) if i!='0' else reduce(tozero,list(v),[]) for i,v in groupby(a,lambda t:t[0])])
  return "".join(map(lambda t:"%s%s"%(t[0] and nums[int(t[0])],t[1]),a[::-1]+[(numStr[-1],'')]))
def tozero(acc,t):
  if t[1] in splitUnit:
    acc.append(('',t[1]))
  elif len(acc)==0:
    acc.append(('0',''))
  return acc


然后,唉,中文货币我还真不知道怎么读,真纠结啊

一=1x10^0
十=1x10^1
百=1x10^2
千=1x10^3
万=1x10^4
亿=1x10^8
兆=1x10^12
京=1x10^16
垓=1x10^20
秭=1x10^24
穰=1x10^28
沟=1x10^32
涧=1x10^36
正=1x10^40
载=1x10^44
极=1x10^48


据说下面的是新标准

千以上的数级规定为: 兆(10^6) 吉(10^9) 太(10^12) 拍(10^15) 艾(10^18) 

10 楼 bardo 2011-08-30  
jamcode 写道
楼主杯具了,楼主不会写Python代码

http://www.jamcode.org/

是吧,这可是完全测试通过的程序,请问您,该怎样写Python??
9 楼 jamcode 2011-08-24  
楼主杯具了,楼主不会写Python代码

http://www.jamcode.org/
8 楼 bardo 2011-08-15  
if(i!=我){} 写道
123  =  贰角叁分

123.01  = 壹佰贰拾叁圆零壹分

123.1  =  壹拾贰圆undefined角壹分

123456  =  壹佰贰拾叁圆伍角陆分

120006080.11  =  壹亿贰仟万陆仟圆壹角壹分

全错!


非常感谢你找出JS版本中的这两个BUG。前者是JS数字格式的问题,它会默认去掉小数点后面的尾数的0。如果全是0,则小数点也去掉了。
最后一个错,则是因为parseInt少传了一个参数,对于8,返回的是0!
均已更正,谢谢
7 楼 if(i!=我){} 2011-08-11  
123  =  贰角叁分

123.01  = 壹佰贰拾叁圆零壹分

123.1  =  壹拾贰圆undefined角壹分

123456  =  壹佰贰拾叁圆伍角陆分

120006080.11  =  壹亿贰仟万陆仟圆壹角壹分

全错!
6 楼 if(i!=我){} 2011-08-11  
各种Dug……
5 楼 bardo 2011-06-04  
shouzhang1_2 写道
楼主!请问一下1234567890123456.123,的结果会是多少?我只验证了js版本的,
贰仟叁佰肆拾伍亿陆仟柒佰捌拾玖万零壹佰贰拾叁圆伍角陆分

程序没有问题的,问题是你的机器,32位机上,怎么能运行64位的数字呢?
Math.round(num*100)/100 这一步就溢出了吧?
4 楼 shouzhang1_2 2011-06-03  
楼主!请问一下1234567890123456.123,的结果会是多少?我只验证了js版本的,
贰仟叁佰肆拾伍亿陆仟柒佰捌拾玖万零壹佰贰拾叁圆伍角陆分
3 楼 jie523314 2011-05-20  
java 代码里面好多写法不对
2 楼 bardo 2011-05-17  
gongrunlian 写道
java 里面能String function numToCny(double num){     这样么

感谢提醒,已更改。

相关推荐

    Java人民币金额数字转换成大写

    在 Java 中,将人民币金额数字转换成大写需要使用 HashMap 来存储中文数字和人民币金额的对应关系。例如,数字 1 对应中文数字 "壹",数字 2 对应中文数字 "贰",以此类推。 在 SimpleMoneyFormat 类中,我们首先...

    人民币数字转换成汉字大写

    人民币数字转换成汉字大写 android Java 运行效率

    水晶报表数字金额转中文大写

    水晶报表数字金额转中文大写,用于水晶报表中将数字金额转换为中文大写的金额

    mysql函数,将数字金额转成人民币大写

    在MySQL数据库中,有时我们需要将数字金额转换成人民币的大写形式,这在财务报表或会计系统中非常常见。为了实现这一需求,我们可以自定义一个函数或者利用现有的字符串处理函数。以下是一个关于如何在MySQL中实现这...

    oracle 数字金额转为汉字大写

    在Oracle数据库环境中,有时我们需要将数字金额转换成汉字大写形式,这在财务报表或理财程序中尤为常见,因为汉字大写是财务领域的一种标准表示方式,可以避免因数字混淆而引发的错误。本篇文章将深入探讨如何在...

    金额阿拉伯数字转换中文大写(全)

    在IT领域,尤其是在财务软件开发或数据处理中,经常需要将阿拉伯数字金额转换为中文大写,以便在财务报表、发票或合同中清晰准确地表示金额。这是因为中文大写数字在金融交易中能减少因书写错误导致的混淆,增强财务...

    java实现数字转换人民币中文大写工具

    Java 实现数字转换人民币中文大写工具是指使用 Java 语言将数字转换为人民币中文大写格式的工具。该工具具有很高的实用价值,特别是在人事业务系统开发中,经常需要将数字转换为大写,以便于报表打印和日常业务处理...

    易语言数字转换汉字大写

    易语言作为一款中国本土开发的、以中文编程为特色的编程语言,提供了方便的方式来实现这个功能。本文将详细讲解如何利用易语言来实现数字转换为汉字大写的操作。 首先,我们需要理解易语言的基本语法和数据类型。...

    将数字金额转换为中文大写金额

    将数字金额转换为中文大写金额将数字金额转换为中文大写金额将数字金额转换为中文大写金额

    JS将数字转换为大写汉字人民币

    JS将数字转换为大写汉字人民币

    Android中数字转中文,金额转大写

    本文将深入探讨如何在Android环境中实现这一功能,包括数字转中文以及数字金额转大写,并且会涉及到口语化的转换。 首先,数字转中文主要是将阿拉伯数字(如1、2、3等)转换成中文数字(如一、二、三等)。在Java或...

    人民币小写金额转大写金额(java版)

    ### 人民币小写金额转大写金额(Java版) #### 概述 本文将详细介绍一个Java程序,该程序用于将小写的人民币金额转换为大写形式。此转换主要用于财务、会计和其他正式场合,在这些场合中,大写金额是标准且必须的...

    python金额数字转大写代码

    将金额数字转化为大写,格式规范标准。① 当没有零头时自动加xxxx元整 ② 小数能够精确到角、分、厘 ③ 能够处理1亿一下金额数字 ④ 使用方法:numToBig(金额),返回大写字符串

    c语言小程序(人民币小写金额转换成大写金额)

    在C语言编程中,开发一个小程序来将人民币的小写金额转换为大写金额是一项常见的任务,尤其在财务软件或银行系统中。这个程序的核心在于理解人民币金额的表示规则,并将其与C语言的数据处理和字符串操作相结合。下面...

    数字转换成金额大写

    总的来说,数字转中文大写金额在Delphi中是一个实用的功能,需要对Delphi语言有良好的掌握,同时也需要熟悉财务领域的规则。通过学习和实践,不仅可以提升编程技巧,还能加深对财务规范的理解。

    人民币大写金额转数字源码

    本文将详细讲解如何实现“人民币大写金额转数字”的算法,主要基于C#编程语言。 首先,我们需要了解人民币大写金额的基本规则。人民币大写金额由“零”、“壹”、“贰”、“叁”、“肆”、“伍”、“陆”、“柒”、...

    数字转汉字大写

    在IT行业中,尤其是在财务软件开发或者数据...总的来说,数字转汉字大写是一项实用的编程技巧,它结合了编程语言的基本操作、条件判断、字符串处理以及对财务规则的理解,对于提升软件的用户体验和安全性具有重要意义。

    SQL数字转金额大写函数

    sqlserver数字转金额大写,输入数字返回汉字大写

    C语言成序设计__实现人民币小写金额与大写金额的转换

    C语言实现人民币小写金额与大写金额的转换 C语言是一种广泛使用的编程语言,具有强大的功能和灵活性。本文中,我们将使用C语言实现人民币小写金额与大写金额的转换。 在中国,人民币的小写金额与大写金额的转换是...

    数字金钱转换成中文大写

    在日常的财务、会计工作中,数字金额的书写通常要求使用中文大写,以避免数字书写错误导致的误解或欺诈。中文大写的数字形式是正式文件和财务报表的标准格式,能够提高金额表述的清晰度和安全性。本文将详细介绍如何...

Global site tag (gtag.js) - Google Analytics