+ -
当前位置:首页 → 问答吧 → 【评论】评 小写金额转换大写金额的代码

【评论】评 小写金额转换大写金额的代码

时间:2006-06-20

来源:互联网


  1. <?
  2.  
  3. class ChineseNumber 
  4. var $basical=array(0=>"零","一","二","三","四","五","六","七","八","九"); 
  5. //var $basical=array(0=>"零","壹","贰","叁","肆","伍","陆","柒","捌","玖"); 
  6. var $advanced=array(1=>"十","百","千"); 
  7. //var $advanced=array(1=>"拾","佰","仟"); 
  8. var $top=array(1=>"万","亿"); 
  9.  
  10. var $level; // 以4位为一级 
  11.  
  12. // 先实现万一下的数的转换 
  13. function ParseNumber($number) 
  14. if ($number>999999999999) // 只能处理到千亿。 
  15. return "数字太大,无法处理。抱歉!"; 
  16. if ($number==0) 
  17. return "零"; 
  18.  
  19. for($this->level=0;$number>0.0001;$this->level++,$number=floor($number / 10000)) 
  20. // 对于中文来说,应该是4位为一组。 
  21. // 四个变量分别对应 个、十、百、千 位。 
  22. $n1=substr($number,-1,1); 
  23. if($number>9) 
  24. $n2=substr($number,-2,1); 
  25. else 
  26. $n2=0; 
  27. if($number>99) 
  28. $n3=substr($number,-3,1); 
  29. else 
  30. $n3=0; 
  31. if($number>999) 
  32. $n4=substr($number,-4,1); 
  33. else 
  34. $n4=0; 
  35.  
  36. if($n4) 
  37. $parsed[$this->level].=$this->basical[$n4].$this->advanced[3]; 
  38. else 
  39. if(($number/10000)>=1) // 千位为0,数值大于9999的情况 
  40. $parsed[$this->level].="零"; 
  41. if($n3) 
  42. $parsed[$this->level].=$this->basical[$n3].$this->advanced[2]; 
  43. else 
  44. if(!ereg("零$",$parsed[$this->level]) && ($number / 1000)>=1) // 不出现连续两个“零”的情况 
  45. $parsed[$this->level].="零"; 
  46. if($n2) 
  47. $parsed[$this->level].=$this->basical[$n2].$this->advanced[1]; 
  48. else 
  49. if(!ereg("零$",$parsed[$this->level]) && ($number / 100)>=1) // 不出现连续两个“零”的情况 
  50. $parsed[$this->level].="零"; 
  51. if($n1) 
  52. $parsed[$this->level].=$this->basical[$n1]; 
  53.  
  54. if($parsed[$this->level]!="零") 
  55. if(ereg("零$",$parsed[$this->level])) 
  56. $parsed[$this->level]=substr($parsed[$this->level],0,strlen($parsed[$this->level])- 
  57. 2); 
  58. if($this->level>0) 
  59. $result=$parsed[$this->level].$this->top[$this->level].$result; 
  60. else 
  61. $result=$parsed[$this->level].$result; 
  62. //for($this->level-=1;$this->level>=0;$this->level--) 
  63. //{ 
  64. // $result.=$parsed[$this->level].$this->top[$this->level]; 
  65. //} 
  66.  
  67. //if(ereg("零$",$result)) 
  68. // $result=substr($result,0,strlen($result)-2); 
  69.  
  70. return $result; 
  71.  
  72. }; 
  73.  
  74.  
  75.  
  76.  
  77.  
  78. //////////////////////// TEST //////////
  79.  
  80. $num = '100000000005.03200586';
  81.  
  82. $c=new ChineseNumber(); // echo $c->ParseNumber(100000000005); 
  83.  
  84. $num_1 = preg_replace("'\..*$'","",$num);
  85. $num_2 = preg_replace("'^.*\.'","",$num);
  86.  
  87. $new_num = $c->ParseNumber($num_1); 
  88.  
  89. $new_num .= fix($num_2);
  90.  
  91. echo $new_num;
  92.  
  93. //////////////////////
  94.  
  95.  
  96.  
  97. function fix($v)
  98. {
  99. if( !isset($v) or "1".$v==1 )return;
  100. $bas=array("零","一","二","三","四","五","六","七","八","九"); 
  101. $len = strlen($v);
  102. $c = Array();
  103. while (--$len>-1)
  104. {
  105. $c[$len] = $bas{ $v{$len} };
  106. }
  107. ksort($c); 
  108. $v = join("",$c);
  109.  
  110.  
  111. return "点".$v;
  112. }
  113. ?>
JavaScript版 代码:-------------------------------------------------------------------------------- function to_rmb(currencyDigits) { // Constants: var MAXIMUM_NUMBER = 99999999999.99; // Predefine the radix characters and currency symbols for output: var CN_ZERO = "零"; var CN_ONE = "壹"; var CN_TWO = "贰"; var CN_THREE = "叁"; var CN_FOUR = "肆"; var CN_FIVE = "伍"; var CN_SIX = "陆"; var CN_SEVEN = "柒"; var CN_EIGHT = "捌"; var CN_NINE = "玖"; var CN_TEN = "拾"; var CN_HUNDRED = "佰"; var CN_THOUSAND = "仟"; var CN_TEN_THOUSAND = "万"; var CN_HUNDRED_MILLION = "亿"; var CN_SYMBOL = "人民币"; //var CN_SYMBOL = ""; var CN_DOLLAR = "元"; var CN_TEN_CENT = "角"; var CN_CENT = "分"; var CN_INTEGER = "整"; // Variables: var integral; // Represent integral part of digit number. var decimal; // Represent decimal part of digit number. var outputCharacters; // The output result. var parts; var digits, radices, bigRadices, decimals; var zeroCount; var i, p, d; var quotient, modulus; // Validate input string: currencyDigits = currencyDigits.toString(); if (currencyDigits == "") { alert("Empty input!"); return ""; } if (currencyDigits.match(/[^,.\d]/) != null) { alert("Invalid characters in the input string!"); return ""; } if ((currencyDigits).match(/^((\d{1,3}(,\d{3})*(.((\d{3},)*\d{1,3}))?)|(\d+(.\d+)?))$/) == null) { alert("Illegal format of digit number!"); return ""; } // Normalize the format of input digits: currencyDigits = currencyDigits.replace(/,/g, ""); // Remove comma delimiters. currencyDigits = currencyDigits.replace(/^0+/, ""); // Trim zeros at the beginning. // Assert the number is not greater than the maximum number. if (Number(currencyDigits) > MAXIMUM_NUMBER) { alert("Too large a number to convert!"); return ""; } // Process the coversion from currency digits to characters: // Separate integral and decimal parts before processing coversion: parts = currencyDigits.split("."); if (parts.length > 1) { integral = parts[0]; decimal = parts[1]; // Cut down redundant decimal digits that are after the second. decimal = decimal.substr(0, 2); } else { integral = parts[0]; decimal = ""; } // Prepare the characters corresponding to the digits: digits = new Array(CN_ZERO, CN_ONE, CN_TWO, CN_THREE, CN_FOUR, CN_FIVE, CN_SIX, CN_SEVEN, CN_EIGHT, CN_NINE); radices = new Array("", CN_TEN, CN_HUNDRED, CN_THOUSAND); bigRadices = new Array("", CN_TEN_THOUSAND, CN_HUNDRED_MILLION); decimals = new Array(CN_TEN_CENT, CN_CENT); // Start processing: outputCharacters = ""; // Process integral part if it is larger than 0: if (Number(integral) > 0) { zeroCount = 0; for (i = 0; i < integral.length; i++) { p = integral.length - i - 1; d = integral.substr(i, 1); quotient = p / 4; modulus = p % 4; if (d == "0") { zeroCount++; } else { if (zeroCount > 0) { outputCharacters += digits[0]; } zeroCount = 0; outputCharacters += digits[Number(d)] + radices[modulus]; } if (modulus == 0 && zeroCount < 4) { outputCharacters += bigRadices[quotient]; } } outputCharacters += CN_DOLLAR; } // Process decimal part if there is: if (decimal != "") { for (i = 0; i < decimal.length; i++) { d = decimal.substr(i, 1); if (d != "0") { outputCharacters += digits[Number(d)] + decimals[i]; } } } // Confirm and return the final output string: if (outputCharacters == "") { outputCharacters = CN_ZERO + CN_DOLLAR; } if (decimal == "") { //outputCharacters += CN_INTEGER; } if(outputCharacters=="零元") { outputCharacters=""; }else{ outputCharacters = CN_SYMBOL + outputCharacters + CN_INTEGER ; } return outputCharacters 

作者: PHPCHINA_CMS   发布时间: 2006-06-19

写的好

作者: visor   发布时间: 2006-06-19

虽然目前没遇到这个需求,还是收藏一下。

作者: PHPChina   发布时间: 2006-06-20

很不错哦,支持一下

作者: fnet   发布时间: 2006-06-20

支持原创,收下.

作者: Per   发布时间: 2006-06-20

支持一下,不错不错!

作者: forest   发布时间: 2006-06-20

可以用正则么?

作者: 七月十五   发布时间: 2006-06-25

财务电算化一定会用到这个,如打支票

[ 本帖最后由 hiler 于 2006-7-25 15:36 编辑 ]

作者: hiler   发布时间: 2006-07-25