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

人民币金额数字转中文大写程序多种编程语言汇总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){     这样么

感谢提醒,已更改。

相关推荐

    excel中161个VBA_自定义函数(超级实用)

    将金额数字转成中文大写 此函数将数字金额转换为中文大写形式,例如将“12345.67”转换为“壹万贰仟叁佰肆拾伍元陆角柒分”。在财务报告和正式文件中,这种转换是必须的。 #### 8. 计算某种税金 类似于个人所得...

    EXCEL集成工具箱V8.0完整增强版(精简)

    【数字转英文】 将选中区域(默认)或已使用区域存储格的金额数字转换成英文格式显示的表达字符串,为三资企业制作客户外汇付款通知书的理想工具。 【文本转EXCEL】 将文本文件按指定的分隔符号分隔一次性导入到...

    EXCEL集成工具箱V6.0

    【数字转英文】 将选中区域(默认)或已使用区域存储格的金额数字转换成英文格式显示的表达字符串,为三资企业制作客户外汇付款通知书的理想工具。 【文本转EXCEL】 将文本文件按指定的分隔符号分隔一次性导入到...

    .NET5仓储管理系统:集成EFCore、Redis缓存、RabbitMQ等技术实现企业级应用

    内容概要:本文详细介绍了基于.NET5开发的一个仓储管理系统,涵盖了多个关键技术的应用。首先,在数据访问方面,使用了EF Core进行ORM操作,并引入了全局逻辑删除和多租户过滤等功能。其次,权限管理部分采用Policy机制实现动态按钮权限控制,权限数据存储于Redis中,确保高效响应。再次,消息队列方面,通过RabbitMQ实现库存变动后的异步通知,保障库存数据的一致性和可靠性。此外,系统还支持多租户模式,能够根据不同租户的需求灵活切换数据库连接。前端则选择了LayUI作为主要框架,配合WebSocket实现库存变化的实时推送。部署环节涉及Ocelot网关、Consul服务注册以及Docker容器化部署,确保系统的高可用性和扩展性。 适合人群:具有一定.NET开发经验的研发人员和技术爱好者。 使用场景及目标:适用于希望深入了解.NET5企业级应用开发的技术人员,尤其是对仓储管理系统感兴趣的人群。通过学习本文,读者可以掌握如何将多种现代技术集成到一个完整的解决方案中,从而提高开发效率和系统性能。 其他说明:文中提供了大量实际代码片段,帮助读者更好地理解和实践相关技术。同时,作者分享了许

    中国联通自智网络技术白皮书-云光和云网专线场景的技术特征与应用

    内容概要:本文档是中国联通发布的关于自智网络技术白皮书,详细介绍了云光和云网专线场景下的自智网络技术。主要内容涵盖行业洞察、中国联通专线自智网络概述、云光和云网专线自智网络的技术特征、分级标准及其关键技术,以及专线自智网络的分级测评和认证体系。文中强调了自智网络在提升网络智能化、自动化方面的关键作用,特别是在云光和云网专线场景的应用,旨在为行业客户提供高品质的专线服务,促进网络向融合化、智能化、绿色化发展。 适合人群:适用于通信行业的技术人员、研究人员、管理人员,尤其是关注自智网络技术及其应用的专业人士。 使用场景及目标:①帮助行业客户理解自智网络技术在云光和云网专线场景中的应用;②为运营商提供技术参考,提升网络智能化水平;③促进产业链上下游协同发展,推动自智网络的商业化应用。 其他说明:本文档不仅提供了详细的理论和技术解析,还结合了中国联通的实际案例,展示了自智网络在实际应用中的成效和发展前景。

    三菱Q系列PLC在液晶电视导光板加工中的应用:QD75MH总线伺服与自动化控制系统详解

    内容概要:本文详细介绍了三菱Q系列PLC在液晶电视导光板加工中的应用案例。主要内容涵盖Q系列PLC的使用、QD75MH定位模块和SSNET总线伺服的应用、伺服控制、触摸屏程序设计以及温控器的使用。文中不仅提供了详细的硬件配置和软件编程实例,还深入解析了各个组件的工作原理及其协同工作的机制。此外,文章还分享了一些实际操作中的经验和常见问题解决方案,如伺服控制中的加减速曲线优化、温控器的Modbus通讯调试、以及总线通讯中的丢包问题处理等。 适合人群:从事工业自动化领域的工程师和技术人员,尤其是对三菱Q系列PLC和伺服控制系统感兴趣的读者。 使用场景及目标:适用于液晶电视导光板加工生产线的设计、安装、调试和维护。目标是帮助技术人员理解和掌握三菱Q系列PLC及相关组件的应用,提升系统的稳定性和精度。 其他说明:文章通过具体的代码示例和实际操作经验,展示了如何利用三菱Q系列PLC实现高效、稳定的工业自动化控制。对于希望深入了解工业自动化控制技术和三菱PLC编程的读者来说,是一份非常有价值的参考资料。

    (源码)基于Go语言的用户积分系统 PointSystem.zip

    # 基于Go语言的用户积分系统 PointSystem ## 项目简介 本项目是一个基于Go语言的用户积分系统,旨在实现常见的用户积分功能,包括积分的获取、扣除和查询等。该系统适用于各种需要用户积分的场景,如购物网站、社区论坛等。 ## 项目的主要特性和功能 1. 用户积分管理系统能够记录用户的积分变化,包括增加积分和减少积分。 2. 积分查询用户可以查询自己的总积分。 3. 积分明细查询用户可以查询自己的积分变化明细,包括积分增加和扣除的记录。 4. 日志记录系统能够记录操作日志,方便问题追踪和审计。 ## 安装使用步骤 1. 确保已安装Go语言环境,并设置好环境变量。 2. 下载项目的源代码文件,解压到本地目录。 3. 在项目根目录下,找到并打开文件 confconf.go,根据实际需求修改数据库连接配置信息(mysqlHost、mysqlUsername、mysqlPassword、mysqlDb 和 LogPath)。

    (源码)基于Arduino的SIMONTRONI游戏.zip

    # 基于Arduino的SIMONTRONI游戏 ## 项目简介 SIMONTRONI是一个基于Arduino的交互式记忆游戏。玩家需要记住并重复由LED灯显示的随机序列。随着游戏的进行,序列的长度会逐渐增加,挑战玩家的记忆能力。该项目还包括一个音量调节功能,通过旋钮调节游戏音量。 ## 项目的主要特性和功能 1. 记忆挑战玩家需要记住并重复LED灯显示的序列。 2. 多级游戏随着游戏的进行,序列的长度会逐渐增加,增加游戏的难度。 3. 音量调节通过旋钮调节游戏音量,满足不同玩家的需求。 4. 硬件交互使用Arduino Uno、LED灯、按钮和电阻等硬件组件,实现游戏的物理交互。 ## 安装使用步骤 1. 准备硬件 1个Arduino Uno 4个LED灯 4个按钮 1个蜂鸣器 1个5k电位器 若干电阻(220和330) 1个面包板和若干导线 2. 下载代码

    sqlite-devel-3.26.0-15.el8.x64-86.rpm.tar.gz

    1、文件说明: Centos8操作系统sqlite-devel-3.26.0-15.el8.rpm以及相关依赖,全打包为一个tar.gz压缩包 2、安装指令: #Step1、解压 tar -zxvf sqlite-devel-3.26.0-15.el8.tar.gz #Step2、进入解压后的目录,执行安装 sudo rpm -ivh *.rpm

    (源码)基于Python的迷宫探索强化学习项目.zip

    # 基于Python的迷宫探索强化学习项目 ## 项目简介 本项目是一个基于强化学习算法的迷宫探索任务。它使用Python编程语言和多种强化学习算法(如QLearning、Sarsa、Sarsa Lambda等)来训练智能体,使其在随机变化的迷宫环境中找到最短路径到达目标点。 ## 项目的主要特性和功能 1. 迷宫环境模拟项目使用CSV文件定义迷宫地图,模拟二维迷宫环境,包括障碍物、悬崖和终点等。 2. 强化学习算法实现实现了QLearning、Sarsa、Sarsa Lambda等强化学习算法,用于智能体的决策过程。 3. 奖励函数设计设计了多种奖励函数,包括距离奖励、危险区域惩罚、防止终点区域“守株待兔”现象和重复路径惩罚等,以引导智能体更好地探索迷宫。 4. 经验回放策略采用了经验回放策略,以提高数据利用效率并稳定学习过程。 5. 可视化界面提供了基于pygame库的可视化界面,用于展示迷宫的布局、智能体的移动和奖励曲线等。

    JAVA画图形学(论文+源代码).zip

    Java项目课程设计,包含源码+数据库+论文

    (源码)基于Vue框架的商家管理系统.zip

    # 基于Vue框架的商家管理系统 ## 项目简介 本项目是一个基于Vue框架开发的前端项目,主要实现了商家展示、搜索、购物车管理、用户评价等功能。通过本项目的学习和实践,可以深入理解Vue框架的核心思想和相关技术要点,包括组件化开发、异步数据处理、动态数据展示等。 ## 项目的主要特性和功能 1. 异步数据处理通过Vuex管理应用状态,实现前后端数据交互和异步数据处理。包括登录注册功能、商家信息的展示和搜索功能等。 2. 组件化开发项目采用组件化开发模式,将页面拆分成多个独立组件,提高代码复用性和可维护性。 3. 动态数据展示利用Vue的响应式机制,实现动态数据展示,包括轮播图、商家列表等。 4. 交互体验优化通过使用betterscroll插件实现页面的滑动效果,提升用户体验。同时,使用vuelazyload插件实现图片懒加载,优化页面加载速度。 ## 安装使用步骤 2. 安装依赖在项目根目录下运行npm install命令,安装项目所需依赖。

    基于Modbus协议的TeslaModbusSCADA安卓组态软件:实现工业与农业物联网控制

    内容概要:本文介绍了TeslaModbusSCADA安卓组态软件的功能特点及其应用场景。该软件通过Wi-Fi和Modbus协议实现了对工业生产设备和农业设施的数据采集与控制。其主要优点包括全中文界面、简易组态、丰富的控件库、无数据点限制以及良好的通信稳定性。文中详细展示了如何快速搭建监控界面,并通过多个实例说明了其在实际项目中的应用效果。 适用人群:适用于工农业生产、物联网控制领域的工程师和技术爱好者,尤其是希望简化数据采集和设备控制流程的用户。 使用场景及目标:①用于构建工业生产线上设备的状态监测与控制系统;②应用于农业大棚、养殖厂等场所的环境参数监控;③提供灵活易用的界面设计工具,降低开发门槛,提高工作效率。 其他说明:尽管存在一些局限性(如暂时不支持OPC UA协议),但未来版本计划增加更多功能,进一步拓展其应用范围。

    JAVA编写的socket服务,可以实现以多种方式的通信 接收socket客户端服务端发送的信息,发送给socket 服务端客户的顶端信息

    JAVA编写的socket服务,可以实现以多种方式的通信 接收socket客户端服务端发送的信息,发送给socket 服务端客户的顶端信息

    Docker最佳实战教程.zip

    docker

    深度探索:国产AI大模型DeepSeek的技术水平及其应用前景

    内容概要:本文详细探讨了国产AI大模型DeepSeek的技术水平及其在全球范围内的影响力。首先介绍了DeepSeek的技术背景与核心优势,强调其在自然语言处理、计算机视觉、强化学习和多模态融合等方面的表现。其次,解析了DeepSeek的核心技术,包括自然语言处理、计算机视觉、强化学习和多模态融合的具体应用。接着,阐述了DeepSeek的架构设计与性能优化措施,展示了其在电商、医疗、教育等多个领域的实际应用案例。最后,展望了DeepSeek的未来发展趋势,如多模态融合、实时视频分析、三维视觉与增强现实、模型轻量化、联邦学习以及AI伦理与可持续发展。 适合人群:对人工智能技术感兴趣的科研人员、工程师、产品经理和技术爱好者。 使用场景及目标:适用于希望深入了解国产AI大模型技术水平及其应用前景的人士,目标是掌握DeepSeek的技术特点、应用场景和发展方向。 其他说明:本文不仅介绍了DeepSeek的技术优势,还通过具体案例展示了其在不同行业中的实际应用效果,有助于读者全面了解DeepSeek的潜力和价值。

    (源码)基于 Vue 3 + Vite 和 TensorFlow 的视力测试图形识别游戏系统.zip

    # 基于 Vue 3 + Vite 和 TensorFlow 的视力测试图形识别游戏系统 ## 项目简介 本项目是一个集图像识别与游戏化视力测试为一体的系统。借助 Vue 3 + Vite 搭建项目框架,运用 TensorFlow 完成图像识别功能,同时利用 PIXI 框架绘制 2D 游戏界面。用户在游戏过程中,通过对特定字母图像的识别来进行视力测试。 ## 项目的主要特性和功能 1. 前端框架采用 Vue 3 + Vite 搭建,具备高效的模块打包和快速的服务器启动能力,确保开发和使用的流畅性。 2. 图像识别借助 TensorFlow 的算法模型,实现精确的图像识别功能,为游戏的准确性提供保障。 3. 游戏绘制使用 PIXI 2D canvas 框架绘制游戏界面,包含多个界面布局,如开始界面、介绍界面和主界面,且对界面元素进行了封装,方便维护和复用。

    (源码)基于Vue框架的后台管理模板.zip

    # 基于Vue框架的后台管理模板 ## 项目简介 本项目是一个基于Vue框架的后台管理模板,精简版是从优秀的vuepureadmin项目中提炼出的主体功能,更适合实际项目开发。该项目拥有高效的代码结构、丰富的功能组件和友好的用户体验设计。通过全局引入elementplus,打包后的文件大小仍然低于2.3MB,并且通过brotli压缩和cdn替换本地库模式,打包大小可进一步降低到低于350KB。项目还提供了官方快速开发文档,方便开发者快速上手和使用。 ## 项目的主要特性和功能 1. 环境要求项目需要node版本不小于16,pnpm版本不小于6。为优化npm包管理工具的兼容性,该项目推荐使用pnpm作为包管理工具。 2. Vue版本项目推荐使用Vue3.3 Composition API进行组件开发,更加符合现代前端开发趋势。

    (源码)基于Python的微信智能聊天机器人.zip

    # 基于Python的微信智能聊天机器人 ## 项目简介 本项目是一个基于Python的微信智能聊天机器人,旨在通过ChatGPT的强大对话和信息整合能力,将微信打造成一个智能机器人。它支持多端部署,包括个人微信、微信公众号和企业微信应用,能够进行智能对话、语音识别、图片生成等多种功能,并且支持丰富的插件扩展。 ## 主要特性和功能 多端部署支持个人微信、微信公众号和企业微信应用等多种部署方式。 智能对话支持私聊及群聊的消息智能回复,支持多轮会话上下文记忆,支持GPT3、GPT3.5、GPT4模型。 语音识别可识别语音消息,通过文字或语音回复,支持Azure、Baidu、Google、OpenAI等多种语音模型。 图片生成支持图片生成和图生图(如照片修复),可选择DellE、Stable Diffusion、Replicate模型。 丰富插件支持个性化插件扩展,已实现多角色切换、文字冒险、敏感词过滤、聊天记录总结等插件。

    基于PHP+MySQL的B/S架构图书馆管理系统设计与实现

    内容概要:本文详细介绍了基于B/S架构,采用PHP、CSS、JavaScript和MySQL技术栈构建的图书馆管理系统。首先阐述了系统的架构和技术亮点,如B/S架构的优势、PHP的灵活性、CSS的美化能力以及JavaScript的交互性和MySQL的数据管理功能。接着具体展示了系统的功能模块,包括用户注册登录、管理员权限管理、图书管理、借还书操作等。文中还特别强调了安全性措施,如验证码机制、会话管理和密码哈希等。最后给出了项目的搭建方法和一些优化建议,如使用phpstudy和navicat工具,以及数据库性能优化等。 适合人群:具有一定编程基础的技术爱好者、Web开发者、图书馆管理人员。 使用场景及目标:适用于希望快速搭建并部署图书馆管理系统的个人或机构,旨在提高图书馆管理效率,同时提供一个完整的Web开发案例供学习和参考。 其他说明:文中提供的代码片段和搭建指南有助于理解和实践,同时也指出了一些潜在的安全隐患和改进方向,如避免SQL注入、使用预处理语句等。

Global site tag (gtag.js) - Google Analytics