2010-03-15 74 views
4

我正在開發一個簡單的Web應用程序,其中需要以字符串格式向我的用戶顯示數字a。將數字轉換爲其字符串表示形式

實施例:

12 - One Two or Twelve 
-20 - minus Two zero or minus twenty 

無論哪種方式是好的。我需要這樣做在PHP中完成。任何幫助將不勝感激。

回答

7

的第一個選項(拼出位),strtr是你的朋友

$words = array(
    '-' => 'minus ', 
    '1' => 'one ', 
    '2' => 'two ', 
etc.... 
); 

echo strtr(-123, $words); 
3

如果你想拼出完整的號碼,你可以使用PEARNumbers_Words class。該類有一個toWords()方法,該方法接受+ve-ve num並返回拼出的字符串表示形式的數字。

如果你想將數字轉換爲字符串數字明智的,我不知道任何lib函數。但是你可以輕鬆編寫自己的代碼。 user187291 gives a good way to do this in his answer

<?php 

$arr = array(
     -12, 
     20 
      ); 

foreach($arr as $num) { 
     $nw = new Numbers_Words(); 
    echo "$num = ". $nw->toWords($num)."\n"; 
}  

?> 

輸出:

C:\>php a.php 
-12 = minus twelve 
20 = twenty 
1

波紋管我給你舉個例子功能。它可能不是一個完整的,但它應該讓你開始(我知道,這個問題已經發布很久了,但它可以幫助其他人 - ) 我對任何錯誤:)感到抱歉。最後,它還沒有完成。我只是以一個例子爲出發點。對@SRC在前面的回答所做的工作

function convertToString($number, $blankIfZero=true){ 
     $strRep = ""; 
     $n = intval($number);  
     $one2twenty = array("One", "Two", "Three", "Four", 
       "Five", "Six", "Seven", "Eight", "Nine", "Ten", "Eleven", 
       "Twelve", "Thirteen", "Fourteen", "Fifteen", "Sixteen", 
       "Seventeen", "Eighteen", "Nineteen"); 
     $twenty2ninty = array("Twenty", "Thirty", 
       "Fourty", "Fifty", "Sixty", "Seventy", "Eighty", 
       "Ninety"); 
     $hundred = "Hundred"; 
     $thousand = "Thousand"; 
     $million = "Million"; 
     $billion = "Billion"; 

     switch($n){ 
      case 0: 
       if($blankIfZero == true){ 
        $strRep= $strRep.""; 
        break; 
       }else{ 
        $strRep = $strRep."Zero"; 
        break; 
       } 
      case $n >0 && $n <20: 
       $strRep = $strRep." ".$one2twenty[($n-1)];    
       break; 
      case $n >=20 && $n < 100:    
       $strRep = $strRep . " ". $twenty2ninty[(($n/10) - 2)]; 
       $strRep .= convertToString($n%10); 
       break; 
      case $n >= 100 && $n <= 999: 
       $strRep = $strRep.$one2twenty[(($n/100)-1)]." ".$hundred. " "; 
       $strRep .= convertToString($n%100); 
       break; 
      case $n >= 1000 && $n < 100000: 
       if($n < 20000){ 
        $strRep = $strRep.$one2twenty[(($n/1000)-1)]." ".$thousand. " "; 
        $strRep .= convertToString($n%1000); 
        break; 
       }else{ 
        $strRep = $strRep . $twenty2ninty[(($n/10000) - 2)]; 
        $strRep .= convertToString($n%10000); 
        break; 
       } 
      case $n >= 100000 && $n < 1000000: 
       $strRep .= convertToString($n/1000). " ".$thousand. " "; 
       $strRep .= convertToString(($n%100000)%1000); 
       break; 
      case $n >= 1000000 && $n < 10000000:     
       $strRep = $strRep . $one2twenty[(($n/1000000) - 1)]. " ".$million." "; 
       $strRep .= convertToString($n%1000000); 
        break; 
      case $n >= 10000000 && $n < 10000000000: 
       $strRep .= convertToString($n/1000000). " ".$million. " "; 
       $strRep .= convertToString(($n%1000000)); 
       break; 

     } 

     return $strRep; 
    } 
1

大廈,我寫了一個函數任意裸無符號整數轉換成英語,主要是出於好奇。

您可以在這裏找到的代碼:a GitHub Gist by StampyCode(64位)

這個代碼僅由PHP的整數限制的限制:

9223372036854775807 

它是此代碼處理,輸出:

九個百分點,二百二十三萬億,三百二十二萬億,三十六十億,八百四十萬,七百七十五萬,ei GHT百零七

代碼中嵌入:

<?php 
$_1to19 = [ 
    "one", 
    "two", 
    "three", 
    "four", 
    "five", 
    "six", 
    "seven", 
    "eight", 
    "nine", 
    "ten", 
    "eleven", 
    "twelve", 
    "thirteen", 
    "fourteen", 
    "fifteen", 
    "sixteen", 
    "seventeen", 
    "eighteen", 
    "nineteen", 
]; 
$_teen = [ 
    "twenty", 
    "thirty", 
    "forty", 
    "fifty", 
    "sixty", 
    "seventy", 
    "eighty", 
    "ninety", 
]; 
$_mult = [ 
    2 => 'hundred', 
    3 => 'thousand', 
    6 => 'million', 
    9 => 'billion', 
    12 => 'trillion', 
    15 => 'quadrillion', 
    18 => 'quintillion', 
    21 => 'sextillion', 
    24 => 'septillion', // php can't count this high 
    27 => 'octillion', 
]; 
$fnBase = function ($n, $x) use (&$fn, $_mult) { 
    return $fn($n/(10 ** $x)) . ' ' . $_mult[$x]; 
}; 
$fnOne = function ($n, $x) use (&$fn, &$fnBase) { 
    $y = ($n % (10 ** $x)) % (10 ** $x); 
    $s = $fn($y); 
    $sep = ($x === 2 && $s ? " and " : ($y < 100 ? ($y ? " and " : '') : ', ')); 
    return $fnBase($n, $x) . $sep . $s; 
}; 
$fnHundred = function ($n, $x) use (&$fn, &$fnBase) { 
    $y = $n % (10 ** $x); 
    $sep = ($y < 100 ? ($y ? ' and ' : '') : ', '); 
    return ', ' . $fnBase($n, $x) . $sep . $fn($y); 
}; 
$fn = function ($n) use (&$fn, $_1to19, $_teen, $number, &$fnOne, &$fnHundred) { 
    switch ($n) { 
     case 0: 
      return ($number > 1 ? '' : 'zero'); 
     case $n < 20: 
      return $_1to19[$n - 1]; 
     case $n < 100: 
      return $_teen[($n/10) - 2] . ' ' . $fn($n % 10); 
     case $n < (10 ** 3): 
      return $fnOne($n, 2); 
    }; 
    for ($i = 4; $i < 27; ++$i) { 
     if ($n < (10 ** $i)) { 
      break; 
     } 
    } 
    return ($i % 3) ? $fnHundred($n, $i - ($i % 3)) : $fnOne($n, $i - 3); 
}; 
$number = $fn((int)$number); 
$number = str_replace(', , ', ', ', $number); 
$number = str_replace(', ', ', ', $number); 
$number = str_replace(' ', ' ', $number); 
$number = ltrim($number, ', '); 

return $number; 
相關問題