2008-11-10 54 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函數的話。

相關問題