有没有一种简单的方法可以将数字转换为PHP中的单词?

时间:2008-11-10 10:40:44

标签: php numbers

在PHP中,有一种简单的方法可以将数字转换为单词吗?例如, 27 二十七

13 个答案:

答案 0 :(得分:35)

found一些(2007/2008)在线源代码,因为它是版权但我可以随意使用它并按我的意愿修改它,所以我把它放在这里并在CC-Wiki下重新许可:

<?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";
    }
}

答案 1 :(得分:28)

或者,您可以在PHP中使用intl包中的NumberFormatter类。这是一个示例代码,可以帮助您(命令行):

<?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"; 
    }

答案 2 :(得分:9)

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

  • bg(保加利亚语),Kouber Saparev
  • cs(Czech)by Petr'PePa'Pavel
  • de(德语)由Piotr Klaban
  • Jesper Veggerby的
  • dk(丹麦语)
  • en_100(Donald Knuth系统,英文),Piotr Klaban
  • en_GB(英式英语),Piotr Klaban
  • en_US(美国英语),Piotr Klaban
  • es(西班牙卡斯特拉诺),Xavier Noguer
  • es_AR(阿根廷西班牙语)由Martin Marrese提供
  • et(爱沙尼亚语),Erkki Saarniit
  • fr(法语)由Kouber Saparev
  • fr_BE(法国比利时),Kouber Saparev和Philippe Bajoit
  • 他(希伯来文)Hadar Porat
  • hu_HU(匈牙利语),Nils Homp
  • id(印度尼西亚语),Ernas M. Jamil和Arif Rifai Dwiyanto
  • it_IT(意大利语),Filippo Beltramini和Davide Caironi
  • lt(立陶宛语)由Laurynas Butkus
  • nl(荷兰语)由WHAM van Dinter
  • pl(波兰语)由Piotr Klaban
  • pt_BR(巴西葡萄牙语),Marcelo Subtil Marcal和Mario H.C.T。
  • ru(俄罗斯)作者:Andrey Demenev
  • 罗宾爱立信
  • sv(瑞典语)

答案 3 :(得分: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));
        }
    }
}

答案 4 :(得分: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;
}

答案 5 :(得分:2)

使用NumberFormatter类,转换为单词很简单。

FileProvider.getUriForFile

答案 6 :(得分:1)

您可以使用NumberFormatter Class

$f = new NumberFormatter("en", NumberFormatter::SPELLOUT);
echo $f->format($myNumber);

答案 7 :(得分: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方法,这就不相关了。只要我将ajax传递给服务器,我就可以从网络表单中获得一个超过''+number的306位数字。
  6. 因此,此类会将数字转换为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厘米的唯一原因是因为当我记不起十亿分之后的事情时,我正在看的网站上的最后一个数字。

    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;
        }
    }
    

答案 8 :(得分:0)

是的。无需使用库,您只需遵循此步骤即可。

首先,您需要在服务器中检入 php.ini 中的;extension=php_intl.dll是否启用,如果仍然无法正常工作,则需要查看此答案。

intl extension php_intl.dll with wamp

成功移动所有文件后,以 icu 开头。

来自:<wamp_installation_path>/bin/php/php5.4.3/

收件人:<wamp_installation_path>/bin/apache/apache2.2.22/bin/

然后重新启动服务器。

尝试运行以下代码:

$f = new NumberFormatter("en", NumberFormatter::SPELLOUT);
echo $f->format(123456);

它将显示 123.5465 的输出。

希望对所有人有帮助:)。

答案 9 :(得分:0)

<?php
$grandTotalAmount = 700000000;
echo ($grandTotalAmount == round($grandTotalAmount)) ? convert_number_to_words(floatval($grandTotalAmount)) . ' Only' : convert_number_to_words(floatval($grandTotalAmount)) . ' Only';

function convert_number_to_words($number) {
    $hyphen = ' ';
    $conjunction = ' and ';
    $separator = ', ';
    $negative = 'negative ';
    $decimal = ' Thai Baht And ';
    $dictionary = array(
        0 => 'zero',
        1 => 'one',
        2 => 'two',
        3 => 'three',
        4 => 'four',
        5 => 'five',
        6 => 'six',
        7 => 'seven',
        8 => 'eight',
        9 => 'nine',
        10 => 'ten',
        11 => 'eleven',
        12 => 'twelve',
        13 => 'thirteen',
        14 => 'fourteen',
        15 => 'fifteen',
        16 => 'sixteen',
        17 => 'seventeen',
        18 => 'eighteen',
        19 => 'nineteen',
        20 => 'twenty',
        30 => 'thirty',
        40 => 'fourty',
        50 => 'fifty',
        60 => 'sixty',
        70 => 'seventy',
        80 => 'eighty',
        90 => 'ninety',
        100 => 'hundred',
        1000 => 'thousand',
        1000000 => 'million',
        1000000000 => 'billion',
        1000000000000 => 'trillion',
        1000000000000000 => 'quadrillion',
        1000000000000000000 => 'quintillion'
    );

    if (!is_numeric($number)) {
        return false;
    }

    if (($number >= 0 && (int) $number < 0) || (int) $number < 0 - PHP_INT_MAX) {
        // overflow
        trigger_error(
                'convert_number_to_words only accepts numbers between -' . PHP_INT_MAX . ' and ' . PHP_INT_MAX, E_USER_WARNING
        );
        return false;
    }

    if ($number < 0) {
        return $negative . convert_number_to_words(abs($number));
    }

    $string = $fraction = null;


    if (strpos($number, '.') !== false) {
        list($number, $fraction) = explode('.', $number);
    }

    switch (true) {
        case $number < 21:
            $string = $dictionary[$number];
            break;
        case $number < 100:
            $tens = ((int) ($number / 10)) * 10;
            $units = $number % 10;
            $string = $dictionary[$tens];
            if ($units) {
                $string .= $hyphen . $dictionary[$units];
            }
            break;
        case $number < 1000:
            $hundreds = $number / 100;
            $remainder = $number % 100;
            $string = $dictionary[$hundreds] . ' ' . $dictionary[100];
            if ($remainder) {
                $string .= $conjunction . convert_number_to_words($remainder);
            }
            break;
        default:
            $baseUnit = pow(1000, floor(log($number, 1000)));
            $numBaseUnits = (int) ($number / $baseUnit);
            $remainder = $number % $baseUnit;
            $string = convert_number_to_words($numBaseUnits) . ' ' . $dictionary[$baseUnit];
            if ($remainder) {
                $string .= $remainder < 100 ? $conjunction : $separator;
                $string .= convert_number_to_words($remainder);
            }
            break;
    }

    if (null !== $fraction && is_numeric($fraction)) {
        $string .= $decimal;
        $words = array();
        foreach (str_split((string) $fraction) as $number) {
            $words[] = $dictionary[$number];
        }
        $string .= implode(' ', $words);
    }

    return $string;
}
?>

答案 10 :(得分:0)

以下代码运行正常

$test = 1000025.05;

$f = new \NumberFormatter( locale_get_default(), \NumberFormatter::SPELLOUT );

$word = $f->format($test);

echo $word;

答案 11 :(得分:-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));
            }
        }
    }

答案 12 :(得分:-3)

Amount in Words:</b><?=no_to_words($number)?>

使用PHP函数将数字转换为单词的非常简单的方法。