2008-11-10 58 views

回答

34

我在网上found一些(2007/2008)的源代码,并因为它是版权,但我可以自由地使用它,但我想修改它,所以我在这里把它和再许可下,CC-百科:

<?php 
/** 
* English Number Converter - Collection of PHP functions to convert a number 
*       into English text. 
* 
* This exact code is licensed under CC-Wiki on Stackoverflow. 
* http://creativecommons.org/licenses/by-sa/3.0/ 
* 
* @link  http://stackoverflow.com/q/277569/367456 
* @question Is there an easy way to convert a number to a word in PHP? 
* 
* This file incorporates work covered by the following copyright and 
* permission notice: 
* 
* Copyright 2007-2008 Brenton Fletcher. http://bloople.net/num2text 
* You can use this freely and modify it however you want. 
*/ 

function convertNumber($number) 
{ 
    list($integer, $fraction) = explode(".", (string) $number); 

    $output = ""; 

    if ($integer{0} == "-") 
    { 
     $output = "negative "; 
     $integer = ltrim($integer, "-"); 
    } 
    else if ($integer{0} == "+") 
    { 
     $output = "positive "; 
     $integer = ltrim($integer, "+"); 
    } 

    if ($integer{0} == "0") 
    { 
     $output .= "zero"; 
    } 
    else 
    { 
     $integer = str_pad($integer, 36, "0", STR_PAD_LEFT); 
     $group = rtrim(chunk_split($integer, 3, " "), " "); 
     $groups = explode(" ", $group); 

     $groups2 = array(); 
     foreach ($groups as $g) 
     { 
      $groups2[] = convertThreeDigit($g{0}, $g{1}, $g{2}); 
     } 

     for ($z = 0; $z < count($groups2); $z++) 
     { 
      if ($groups2[$z] != "") 
      { 
       $output .= $groups2[$z] . convertGroup(11 - $z) . (
         $z < 11 
         && !array_search('', array_slice($groups2, $z + 1, -1)) 
         && $groups2[11] != '' 
         && $groups[11]{0} == '0' 
          ? " and " 
          : ", " 
        ); 
      } 
     } 

     $output = rtrim($output, ", "); 
    } 

    if ($fraction > 0) 
    { 
     $output .= " point"; 
     for ($i = 0; $i < strlen($fraction); $i++) 
     { 
      $output .= " " . convertDigit($fraction{$i}); 
     } 
    } 

    return $output; 
} 

function convertGroup($index) 
{ 
    switch ($index) 
    { 
     case 11: 
      return " decillion"; 
     case 10: 
      return " nonillion"; 
     case 9: 
      return " octillion"; 
     case 8: 
      return " septillion"; 
     case 7: 
      return " sextillion"; 
     case 6: 
      return " quintrillion"; 
     case 5: 
      return " quadrillion"; 
     case 4: 
      return " trillion"; 
     case 3: 
      return " billion"; 
     case 2: 
      return " million"; 
     case 1: 
      return " thousand"; 
     case 0: 
      return ""; 
    } 
} 

function convertThreeDigit($digit1, $digit2, $digit3) 
{ 
    $buffer = ""; 

    if ($digit1 == "0" && $digit2 == "0" && $digit3 == "0") 
    { 
     return ""; 
    } 

    if ($digit1 != "0") 
    { 
     $buffer .= convertDigit($digit1) . " hundred"; 
     if ($digit2 != "0" || $digit3 != "0") 
     { 
      $buffer .= " and "; 
     } 
    } 

    if ($digit2 != "0") 
    { 
     $buffer .= convertTwoDigit($digit2, $digit3); 
    } 
    else if ($digit3 != "0") 
    { 
     $buffer .= convertDigit($digit3); 
    } 

    return $buffer; 
} 

function convertTwoDigit($digit1, $digit2) 
{ 
    if ($digit2 == "0") 
    { 
     switch ($digit1) 
     { 
      case "1": 
       return "ten"; 
      case "2": 
       return "twenty"; 
      case "3": 
       return "thirty"; 
      case "4": 
       return "forty"; 
      case "5": 
       return "fifty"; 
      case "6": 
       return "sixty"; 
      case "7": 
       return "seventy"; 
      case "8": 
       return "eighty"; 
      case "9": 
       return "ninety"; 
     } 
    } else if ($digit1 == "1") 
    { 
     switch ($digit2) 
     { 
      case "1": 
       return "eleven"; 
      case "2": 
       return "twelve"; 
      case "3": 
       return "thirteen"; 
      case "4": 
       return "fourteen"; 
      case "5": 
       return "fifteen"; 
      case "6": 
       return "sixteen"; 
      case "7": 
       return "seventeen"; 
      case "8": 
       return "eighteen"; 
      case "9": 
       return "nineteen"; 
     } 
    } else 
    { 
     $temp = convertDigit($digit2); 
     switch ($digit1) 
     { 
      case "2": 
       return "twenty-$temp"; 
      case "3": 
       return "thirty-$temp"; 
      case "4": 
       return "forty-$temp"; 
      case "5": 
       return "fifty-$temp"; 
      case "6": 
       return "sixty-$temp"; 
      case "7": 
       return "seventy-$temp"; 
      case "8": 
       return "eighty-$temp"; 
      case "9": 
       return "ninety-$temp"; 
     } 
    } 
} 

function convertDigit($digit) 
{ 
    switch ($digit) 
    { 
     case "0": 
      return "zero"; 
     case "1": 
      return "one"; 
     case "2": 
      return "two"; 
     case "3": 
      return "three"; 
     case "4": 
      return "four"; 
     case "5": 
      return "five"; 
     case "6": 
      return "six"; 
     case "7": 
      return "seven"; 
     case "8": 
      return "eight"; 
     case "9": 
      return "nine"; 
    } 
} 
+0

您可以建立一个功能落后读取次数,并写下文字,加入“hundreed”或取决于什么样的功能,目前的数字之前发现“tousend”。 – 2014-09-08 14:29:55

2

有没有我知道的内置方式,但如果你看看我的示例代码this question(在C#中),它应该很容易让你工作。基本上它只是解决变量的问题,并在适当的地方添加$前缀,它应该可以工作。

3

我找到了两个链接。 first是一个可以使用的免费PHP类,second是一个示例函数,您可以查看和复制或使用它来编写自己的代码。

9

PECL中有Numbers_Words package。它完全符合你的要求。下列语言支持:

  • BG(保加利亚)由Kouber Saparev
  • CS(捷克)由彼得 '佩帕' 帕维尔
  • 德(德国)由彼得·Klaban
  • DK(丹麦)的加斯帕Veggerby
  • en_100(高德纳系统,英语)由彼得·Klaban
  • EN_GB(英式英语),由彼得·Klaban
  • EN_US英语(美国)的彼得·Klaban
  • ES(西班牙卡斯特利亚诺)由Xavier Noguer
  • es_AR(阿根廷西班牙语)由马丁Marrese
  • 等(爱沙尼亚)由埃尔基Saarniit
  • fr(法语)由Kouber Saparev
  • fr_BE(法国比利时)通过Kouber Saparev和Philippe Bajoit
  • 他(希伯来文)由哈达尔波拉特
  • hu_HU(匈牙利)由尼尔斯Homp
  • ID(印尼)由Ernas M.贾米勒和阿里夫木霉Dwiyanto
  • it_IT(意大利)由菲利波Beltramini和达维德Caironi
  • LT(立陶宛)由Laurynas布特库斯
  • NL(荷兰)的个唱面包车Dinter
  • PL(波兰)由彼得·Klaban
  • pt_BR表示(巴西葡萄牙语)Marcelo Subtil Marcal和Mario HCT
  • RU(俄罗斯)由安德烈Demenev
  • SV(瑞典)罗宾爱立信
26

或者,您可以在PHP中使用NumberFormatter类从intl包。这里有一个示例代码来让你开始(对于命令行):

<?php 
if ($argc < 3) 
    { 
    echo "usage: php {$argv[0]} lang-tag number ...\n"; 
    exit; 
    } 

array_shift($argv); 
$lang_tag = array_shift($argv); 

$nf1 = new NumberFormatter($lang_tag, NumberFormatter::DECIMAL); 
$nf2 = new NumberFormatter($lang_tag, NumberFormatter::SPELLOUT); 

foreach ($argv as $num) 
    { 
    echo $nf1->format($num).' is '.$nf2->format($num)."\n"; 
    } 
-3

我已经使用递归函数生成了这个。

$wordnum = numberToWord($number); 
echo $wordnum."<BR>"; 

function singledigit($number){ 
     switch($number){ 
      case 0:$word = "zero";break; 
      case 1:$word = "One";break; 
      case 2:$word = "two";break; 
      case 3:$word = "three";break; 
      case 4:$word = "Four";break; 
      case 5:$word = "Five";break; 
      case 6:$word = "Six";break; 
      case 7:$word = "Seven";break; 
      case 8:$word = "Eight";break; 
      case 9:$word = "Nine";break; 
     } 
     return $word; 
    } 

    function doubledigitnumber($number){ 
     if($number == 0){ 
      $word = ""; 
     } 
     else{ 
      $word = singledigit($number); 
     }  
     return $word; 
    } 

    function doubledigit($number){ 
     switch($number[0]){ 
      case 0:$word = doubledigitnumber($number[1]);break; 
      case 1: 
       switch($number[1]){ 
        case 0:$word = "Ten";break; 
        case 1:$word = "Eleven";break; 
        case 2:$word = "Twelve";break; 
        case 3:$word = "Thirteen";break; 
        case 4:$word = "Fourteen";break; 
        case 5:$word = "Fifteen";break; 
        case 6:$word = "Sixteen";break; 
        case 7:$word = "Seventeen";break; 
        case 8:$word = "Eighteen";break; 
        case 9:$word = "Ninteen";break; 
       }break; 
      case 2:$word = "Twenty".doubledigitnumber($number[1]);break;     
      case 3:$word = "Thirty".doubledigitnumber($number[1]);break; 
      case 4:$word = "Forty".doubledigitnumber($number[1]);break; 
      case 5:$word = "Fifty".doubledigitnumber($number[1]);break; 
      case 6:$word = "Sixty".doubledigitnumber($number[1]);break; 
      case 7:$word = "Seventy".doubledigitnumber($number[1]);break; 
      case 8:$word = "Eighty".doubledigitnumber($number[1]);break; 
      case 9:$word = "Ninety".doubledigitnumber($number[1]);break; 

     } 
     return $word; 
    } 

    function unitdigit($numberlen,$number){ 
     switch($numberlen){   
      case 3:$word = "Hundred";break; 
      case 4:$word = "Thousand";break; 
      case 5:$word = "Thousand";break; 
      case 6:$word = "Lakh";break; 
      case 7:$word = "Lakh";break; 
      case 8:$word = "Crore";break; 
      case 9:$word = "Crore";break; 

     } 
     return $word; 
    } 

    function numberToWord($number){ 

     $numberlength = strlen($number); 
     if ($numberlength == 1) { 
      return singledigit($number); 
     }elseif ($numberlength == 2) { 
      return doubledigit($number); 
     } 
     else { 

      $word = ""; 
      $wordin = ""; 

      if($numberlength == 9){ 
       if($number[0] >0){ 
        $unitdigit = unitdigit($numberlength,$number[0]); 
        $word = doubledigit($number[0].$number[1]) ." ".$unitdigit." "; 
        return $word." ".numberToWord(substr($number,2)); 
       } 
       else{ 
        return $word." ".numberToWord(substr($number,1)); 
       } 
      } 

      if($numberlength == 7){ 
       if($number[0] >0){ 
        $unitdigit = unitdigit($numberlength,$number[0]); 
        $word = doubledigit($number[0].$number[1]) ." ".$unitdigit." "; 
        return $word." ".numberToWord(substr($number,2)); 
       } 
       else{ 
        return $word." ".numberToWord(substr($number,1)); 
       } 

      } 

      if($numberlength == 5){ 
       if($number[0] >0){ 
        $unitdigit = unitdigit($numberlength,$number[0]); 
        $word = doubledigit($number[0].$number[1]) ." ".$unitdigit." "; 
        return $word." ".numberToWord(substr($number,2)); 
       } 
       else{ 
        return $word." ".numberToWord(substr($number,1)); 
       } 


      } 
      else{ 
       if($number[0] >0){ 
        $unitdigit = unitdigit($numberlength,$number[0]); 
        $word = singledigit($number[0]) ." ".$unitdigit." "; 
       }    
       return $word." ".numberToWord(substr($number,1)); 
      } 
     } 
    } 
+1

我想你的代码$数= 123456789结果是十二亿卢比ThirtyFour万卢比FiftySix三千七百EightyNine。它应该是一百二十三百万,四五六千元,七八九。 – Barmar 2012-10-02 02:22:14

+3

维基百科:“一个亿卢比在南亚编号系统等于十万元单位” - 我相信OP想在英语 – Muleskinner 2013-03-06 11:07:38

2

我重写了上面的代码以符合标准的美国书面文字数字格式。

function singledigit($number){ 
    switch($number){ 
     case 0:$word = "zero";break; 
     case 1:$word = "one";break; 
     case 2:$word = "two";break; 
     case 3:$word = "three";break; 
     case 4:$word = "four";break; 
     case 5:$word = "five";break; 
     case 6:$word = "six";break; 
     case 7:$word = "seven";break; 
     case 8:$word = "eight";break; 
     case 9:$word = "nine";break; 
    } 
    return $word; 
} 

function doubledigitnumber($number){ 
    if($number == 0){ 
     $word = ""; 
    } 
    else{ 
     $word = "-".singledigit($number); 
    }  
    return $word; 
} 

function doubledigit($number){ 
    switch($number[0]){ 
     case 0:$word = doubledigitnumber($number[1]);break; 
     case 1: 
      switch($number[1]){ 
       case 0:$word = "ten";break; 
       case 1:$word = "eleven";break; 
       case 2:$word = "twelve";break; 
       case 3:$word = "thirteen";break; 
       case 4:$word = "fourteen";break; 
       case 5:$word = "fifteen";break; 
       case 6:$word = "sixteen";break; 
       case 7:$word = "seventeen";break; 
       case 8:$word = "eighteen";break; 
       case 9:$word = "ninteen";break; 
      }break; 
     case 2:$word = "twenty".doubledigitnumber($number[1]);break;     
     case 3:$word = "thirty".doubledigitnumber($number[1]);break; 
     case 4:$word = "forty".doubledigitnumber($number[1]);break; 
     case 5:$word = "fifty".doubledigitnumber($number[1]);break; 
     case 6:$word = "sixty".doubledigitnumber($number[1]);break; 
     case 7:$word = "seventy".doubledigitnumber($number[1]);break; 
     case 8:$word = "eighty".doubledigitnumber($number[1]);break; 
     case 9:$word = "ninety".doubledigitnumber($number[1]);break; 

    } 
    return $word; 
} 

function unitdigit($numberlen,$number){ 
    switch($numberlen){   
     case 3:case 6:case 9:case 12:$word = "hundred";break; 
     case 4:case 5:$word = "thousand";break; 
     case 7:case 8:$word = "million";break; 
     case 10:case 11:$word = "billion";break; 
    } 
    return $word; 
} 

function numberToWord($number){ 

    $numberlength = strlen($number); 
    if ($numberlength == 1) { 
     return singledigit($number); 
    }elseif ($numberlength == 2) { 
     return doubledigit($number); 
    } 
    else { 

     $word = ""; 
     $wordin = ""; 
     switch ($numberlength) { 
     case 5:case 8: case 11: 
      if($number[0] >0){ 
       $unitdigit = unitdigit($numberlength,$number[0]); 
       $word = doubledigit($number[0].$number[1]) ." ".$unitdigit." "; 
       return $word." ".numberToWord(substr($number,2)); 
      } 
      else{ 
       return $word." ".numberToWord(substr($number,1)); 
      } 
     break; 
     default: 
      if($number[0] >0){ 
       $unitdigit = unitdigit($numberlength,$number[0]); 
       $word = singledigit($number[0]) ." ".$unitdigit." "; 
      }    
      return $word." ".numberToWord(substr($number,1)); 
     } 
    } 
} 
0

这里有一个小的类,我写在今晚。注意事项:

  1. 只有英文。
  2. 只处理美国/法国对数十亿等的定义
  3. longform方法不处理小数。它只是抹去它们。如果您愿意,可以随意修改并添加该功能。
  4. numberformat方法不会做小数点,但不做任何舍入。由于PHP整数大小的固有限制,我不得不创建一个新的numberformat函数。我翻译的数字非常大,当我用number_format()检查我的翻译时,花了30分钟才发现我的翻译没有错,number_format是。
  5. 这不是关于该类的警告,而是关于PHP。 32位版本的PHP不会处理大于2,147,483,647(20亿和更改)的整数。 64位版本将处理高达像9 quintillion什么的。但只要您将longform方法的数字以string的形式输入,此处无关紧要。我从网络表格中完成了一个306位数字,超过ajax,只要我将它作为''+number传递给服务器即可。

所以,这个类将把数字翻译到999 Centillion, 999 etc.(例如,一个9个字符长度为306个字符的字符串)。任何比这更大的数字,该函数只是返回一个愚蠢的消息。

用法:

$number = '999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999'; 
reallyBig::longform($number); 

可选的第二个布尔参数默认为true,这增加了逗号作为最好的可以在适当的地方,以使号码更易读。

顺便说一下,如果您希望它为负数,则可以将-放在前面,但输入字符串中包含的任何其他字符将被删除。例如:

reallyBig::longform('-C55LL-M5-4-a-9u7-71m3-M8');将输出:negative five billion, five hundred fifty-four million, nine hundred seventy-seven thousand, one hundred thirty-eight

numberformat方法是没有必要的任何其它方法。如果你想检查一个非常长的翻译数字,那就在那里。由于所有这些函数都以字符串形式处理数字,因此它们不会遇到PHP的限制。

我停在999厘米的唯一原因是因为centillion是我在查看网站时的最后一个数字,当时我不记得十亿分之后发生了什么。

class reallyBig 
{ 
    private static $map, $strings; 
    private static function map() 
    { 
     $map = array(); 
     $num = 1; 
     $count = 1; 
     while($num < 307) 
     { 
      if($count == 1) $map[$num] = $num+2; 
      elseif($count == 2) $map[$num] = $num+1; 
      else 
      { 
       $map[$num] = $num; 
       $count = 0; 
      } 
      $count++; 
      $num++; 
     } 
     return $map; 
    } 
    private static function strings() 
    { 
     return array 
     (
      6 => 'thousand', 
      9 => 'million', 
      12 => 'billion', 
      15 => 'trillion', 
      18 => 'quadrillion', 
      21 => 'quintillion', 
      24 => 'sextillion', 
      27 => 'septillion', 
      30 => 'octillion', 
      33 => 'nonillion', 
      36 => 'decillion', 
      39 => 'undecillion', 
      42 => 'duodecillion', 
      45 => 'tredecillion', 
      48 => 'quattuordecillion', 
      51 => 'quindecillion', 
      54 => 'sexdecillion', 
      57 => 'septendecillion', 
      60 => 'octodecillion', 
      63 => 'novemdecillion', 
      66 => 'vigintillion', 
      69 => 'unvigintillion', 
      72 => 'duovigintillion', 
      75 => 'trevigintillion', 
      78 => 'quattuorvigintillion', 
      81 => 'quinvigintillion', 
      84 => 'sexvigintillion', 
      87 => 'septenvigintillion', 
      90 => 'octovigintillion', 
      93 => 'novemvigintillion', 
      96 => 'trigintillion', 
      99 => 'untrigintillion', 
      102 => 'duotrigintillion', 
      105 => 'tretrigintillion', 
      108 => 'quattuortrigintillion', 
      111 => 'quintrigintillion', 
      114 => 'sextrigintillion', 
      117 => 'septentrigintillion', 
      120 => 'octotrigintillion', 
      123 => 'novemtrigintillion', 
      126 => 'quadragintillion', 
      129 => 'unquadragintillion', 
      132 => 'duoquadragintillion', 
      135 => 'trequadragintillion', 
      138 => 'quattuorquadragintillion', 
      141 => 'quinquadragintillion', 
      144 => 'sexquadragintillion', 
      147 => 'septenquadragintillion', 
      150 => 'octoquadragintillion', 
      153 => 'novemquadragintillion', 
      156 => 'quinquagintillion', 
      159 => 'unquinquagintillion', 
      162 => 'duoquinquagintillion', 
      165 => 'trequinquagintillion', 
      168 => 'quattuorquinquagintillion', 
      171 => 'quinquinquagintillion', 
      174 => 'sexquinquagintillion', 
      177 => 'septenquinquagintillion', 
      180 => 'octoquinquagintillion', 
      183 => 'novemquinquagintillion', 
      186 => 'sexagintillion', 
      189 => 'unsexagintillion', 
      192 => 'duosexagintillion', 
      195 => 'tresexagintillion', 
      198 => 'quattuorsexagintillion', 
      201 => 'quinsexagintillion', 
      204 => 'sexsexagintillion', 
      207 => 'septensexagintillion', 
      210 => 'octosexagintillion', 
      213 => 'novemsexagintillion', 
      216 => 'septuagintillion', 
      219 => 'unseptuagintillion', 
      222 => 'duoseptuagintillion', 
      225 => 'treseptuagintillion', 
      228 => 'quattuorseptuagintillion', 
      231 => 'quinseptuagintillion', 
      234 => 'sexseptuagintillion', 
      237 => 'septenseptuagintillion', 
      240 => 'octoseptuagintillion', 
      243 => 'novemseptuagintillion', 
      246 => 'octogintillion', 
      249 => 'unoctogintillion', 
      252 => 'duooctogintillion', 
      255 => 'treoctogintillion', 
      258 => 'quattuoroctogintillion', 
      261 => 'quinoctogintillion', 
      264 => 'sexoctogintillion', 
      267 => 'septenoctogintillion', 
      270 => 'octooctogintillion', 
      273 => 'novemoctogintillion', 
      276 => 'nonagintillion', 
      279 => 'unnonagintillion', 
      282 => 'duononagintillion', 
      285 => 'trenonagintillion', 
      288 => 'quattuornonagintillion', 
      291 => 'quinnonagintillion', 
      294 => 'sexnonagintillion', 
      297 => 'septennonagintillion', 
      300 => 'octononagintillion', 
      303 => 'novemnonagintillion', 
      306 => 'centillion', 
     ); 
    } 
    public static function longform($number = string, $commas = true) 
    { 
     $negative = substr($number, 0, 1) == '-' ? 'negative ' : ''; 
     list($number) = explode('.', $number);   
     $number = trim(preg_replace("/[^0-9]/u", "", $number)); 
     $number = (string)(ltrim($number,'0')); 
     if(empty($number)) return 'zero'; 
     $length = strlen($number); 
     if($length < 2) return $negative.self::ones($number); 
     if($length < 3) return $negative.self::tens($number); 
     if($length < 4) return $commas ? $negative.str_replace('hundred ', 'hundred and ', self::hundreds($number)) : $negative.self::hundreds($number); 
     if($length < 307) 
     { 
      self::$map = self::map(); 
      self::$strings = self::strings(); 
      $result = self::beyond($number, self::$map[$length]); 
      if(!$commas) return $negative.$result; 
      $strings = self::$strings; 
      $thousand = array_shift($strings); 
      foreach($strings as $string) $result = str_replace($string.' ', $string.', ', $result); 
      if(strpos($result, 'thousand') !== false) list($junk,$remainder) = explode('thousand', $result); 
      else $remainder = $result; 
      return strpos($remainder, 'hundred') !== false ? $negative.str_replace('thousand ', 'thousand, ', $result) : $negative.str_replace('thousand ', 'thousand and ', $result); 
     } 
     return 'a '.$negative.'number too big for your britches'; 
    } 
    private static function ones($number) 
    { 
     $ones = array('zero','one','two','three','four','five','six','seven','eight','nine'); 
     return $ones[$number]; 
    } 
    private static function tens($number) 
    { 
     $number = (string)(ltrim($number,'0')); 
     if(strlen($number) < 2) return self::ones($number); 
     if($number < 20) 
     { 
      $teens = array('ten','eleven','twelve','thirteen','fourteen','fifteen','sixteen','seventeen','eighteen','nineteen'); 
      return $teens[($number-10)]; 
     } 
     else 
     { 
      $tens = array('','','twenty','thirty','forty','fifty','sixty','seventy','eighty','ninety'); 
      $word = $tens[$number[0]]; 
      return empty($number[1]) ? $word : $word.'-'.self::ones($number[1]); 
     } 
    } 
    private static function hundreds($number) 
    { 
     $number = (string)(ltrim($number,'0')); 
     if(strlen($number) < 3) return self::tens($number); 
     $word = self::ones($number[0]).' hundred'; 
     $remainder = substr($number, -2); 
     if(ltrim($remainder,'0') != '') $word .= ' '.self::tens($remainder); 
     return $word; 
    } 
    private static function beyond($number, $limit) 
    { 
     $number = (string)(ltrim($number,'0')); 
     $length = strlen($number); 
     if($length < 4) return self::hundreds($number); 
     if($length < ($limit-2)) return self::beyond($number, self::$map[($limit-3)]); 
     if($length == $limit) $word = self::hundreds(substr($number, 0, 3), true); 
     elseif($length == ($limit-1)) $word = self::tens(substr($number, 0, 2)); 
     else $word = self::ones($number[0]); 
     $word .= ' '.self::$strings[$limit]; 
     $sub = ($limit-3); 
     $remainder = substr($number, -$sub); 
     if(ltrim($remainder,'0') != '') $word .= ' '.self::beyond($remainder, self::$map[$sub]); 
     return $word; 
    } 
    public static function numberformat($number, $fixed = 0, $dec = '.', $thou = ',') 
    { 
     $negative = substr($number, 0, 1) == '-' ? '-' : ''; 
     $number = trim(preg_replace("/[^0-9\.]/u", "", $number)); 
     $number = (string)(ltrim($number,'0')); 
     $fixed = (int)$fixed; 
     if(!is_numeric($fixed)) $fixed = 0; 
     if(strpos($number, $dec) !== false) list($number,$decimals) = explode($dec, $number); 
     else $decimals = '0'; 
     if($fixed) $decimals = '.'.str_pad(substr($decimals, 0, $fixed), $fixed, 0, STR_PAD_RIGHT); 
     else $decimals = ''; 
     $thousands = array_map('strrev', array_reverse(str_split(strrev($number), 3))); 
     return $negative.implode($thou,$thousands).$decimals; 
    } 
} 
2

我需要的是把“及”到返回字符串并格式化成一个句子的解决方案 - 通常是作为一个人会说出来。所以我稍微修改了一个不同的解决方案 - 因为我认为这可能对某人有用。

4,835,301 returns "Four million eight hundred and thirty five thousand three hundred and one." 

代码

function convertNumber($num = false) 
{ 
    $num = str_replace(array(',', ''), '' , trim($num)); 
    if(! $num) { 
     return false; 
    } 
    $num = (int) $num; 
    $words = array(); 
    $list1 = array('', 'one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine', 'ten', 'eleven', 
     'twelve', 'thirteen', 'fourteen', 'fifteen', 'sixteen', 'seventeen', 'eighteen', 'nineteen' 
    ); 
    $list2 = array('', 'ten', 'twenty', 'thirty', 'forty', 'fifty', 'sixty', 'seventy', 'eighty', 'ninety', 'hundred'); 
    $list3 = array('', 'thousand', 'million', 'billion', 'trillion', 'quadrillion', 'quintillion', 'sextillion', 'septillion', 
     'octillion', 'nonillion', 'decillion', 'undecillion', 'duodecillion', 'tredecillion', 'quattuordecillion', 
     'quindecillion', 'sexdecillion', 'septendecillion', 'octodecillion', 'novemdecillion', 'vigintillion' 
    ); 
    $num_length = strlen($num); 
    $levels = (int) (($num_length + 2)/3); 
    $max_length = $levels * 3; 
    $num = substr('00' . $num, -$max_length); 
    $num_levels = str_split($num, 3); 
    for ($i = 0; $i < count($num_levels); $i++) { 
     $levels--; 
     $hundreds = (int) ($num_levels[$i]/100); 
     $hundreds = ($hundreds ? ' ' . $list1[$hundreds] . ' hundred' . ($hundreds == 1 ? '' : '') . ' ' : ''); 
     $tens = (int) ($num_levels[$i] % 100); 
     $singles = ''; 
     if ($tens < 20) { 
      $tens = ($tens ? ' and ' . $list1[$tens] . ' ' : ''); 
     } elseif ($tens >= 20) { 
      $tens = (int)($tens/10); 
      $tens = ' and ' . $list2[$tens] . ' '; 
      $singles = (int) ($num_levels[$i] % 10); 
      $singles = ' ' . $list1[$singles] . ' '; 
     } 
     $words[] = $hundreds . $tens . $singles . (($levels && (int) ($num_levels[$i])) ? ' ' . $list3[$levels] . ' ' : ''); 
    } //end for loop 
    $commas = count($words); 
    if ($commas > 1) { 
     $commas = $commas - 1; 
    } 
    $words = implode(' ', $words); 
    $words = preg_replace('/^\s\b(and)/', '', $words); 
    $words = trim($words); 
    $words = ucfirst($words); 
    $words = $words . "."; 
    return $words; 
} 
0
Amount in Words:</b><?=no_to_words($number)?> 

很简单的方式转换成数字使用PHP函数的话。

相关问题