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

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/277569/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-24 22:12:12  来源:igfitidea点击:

Is there an easy way to convert a number to a word in PHP?

phpnumbers

提问by Philip Morton

In PHP, is there an easy way to convert a number to a word? For instance, 27to twenty-seven.

在 PHP 中,有没有一种简单的方法可以将数字转换为单词?举例来说,2727

采纳答案by Chris

I foundsome (2007/2008) source-code online and as it is copyright but I can use it freely and modify it however I want, so I place it here and re-license under CC-Wiki:

网上找到了一些(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";
    }
}

回答by user132513

Alternatively, you can use the NumberFormatter class from intlpackage in PHP . Here's a sample code to get you started (for commandline):

或者,您可以使用intlPHP 包中的 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"; 
    }

回答by Milen A. Radev

There is the Numbers_Wordspackagein PECL. It does exactly what you ask for. The following languages are supported:

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

  • bg (Bulgarian) by Kouber Saparev
  • cs (Czech) by Petr 'PePa' Pavel
  • de (German) by Piotr Klaban
  • dk (Danish) by Jesper Veggerby
  • en_100 (Donald Knuth system, English) by Piotr Klaban
  • en_GB (British English) by Piotr Klaban
  • en_US (American English) by Piotr Klaban
  • es (Spanish Castellano) by Xavier Noguer
  • es_AR (Argentinian Spanish) by Martin Marrese
  • et (Estonian) by Erkki Saarniit
  • fr (French) by Kouber Saparev
  • fr_BE (French Belgium) by Kouber Saparev and Philippe Bajoit
  • he (Hebrew) by Hadar Porat
  • hu_HU (Hungarian) by Nils Homp
  • id (Indonesian) by Ernas M. Jamil and Arif Rifai Dwiyanto
  • it_IT (Italian) by Filippo Beltramini and Davide Caironi
  • lt (Lithuanian) by Laurynas Butkus
  • nl (Dutch) by WHAM van Dinter
  • pl (Polish) by Piotr Klaban
  • pt_BR (Brazilian Portuguese) by Marcelo Subtil Marcal and Mario H.C.T.
  • ru (Russian) by Andrey Demenev
  • sv (Swedish) by Robin Ericsson
  • bg(保加利亚语) by Kouber Saparev
  • cs(捷克语)作者:Petr 'PePa' Pavel
  • de(德语) by Piotr Klaban
  • Jesper Veggerby 的 dk(丹麦语)
  • piotr Klaban 的 en_100(Donald Knuth 系统,英语)
  • piotr Klaban 的 en_GB(英式英语)
  • piotr Klaban 的 en_US(美式英语)
  • es(西班牙语 Castellano) by Xavier Noguer
  • es_AR(阿根廷西班牙语)作者:Martin Marrese
  • Erkki Saarniit 的 et(爱沙尼亚语)
  • fr (法语) by Kouber Saparev
  • fr_BE(法国比利时)作者:Kouber Saparev 和 Philippe Bajoit
  • 他(希伯来语) by Hadar Porat
  • Nils Homp 的 hu_HU(匈牙利语)
  • id(印度尼西亚语)作者:Ernas M. Jamil 和 Arif Rifai Dwiyanto
  • it_IT(意大利语)作者:Filippo Beltramini 和 Davide Caironi
  • lt(立陶宛语) by Laurynas Butkus
  • WHAM van Dinter 的 nl(荷兰语)
  • Piotr Klaban 的 pl(波兰语)
  • pt_BR(巴西葡萄牙语)作者:Marcelo Subtil Marcal 和 Mario HCT
  • ru (俄语) by Andrey Demenev
  • sv(瑞典语) by Robin Ericsson

回答by prikkles

I needed a solution that put 'and' into the returned string and formatted it into a sentence - typically as a human would say it. So I adapted a different solution slightly - posted as I thought this could be useful for someone.

我需要一个解决方案,将 'and' 放入返回的字符串中并将其格式化为一个句子 - 通常就像人类所说的那样。所以我稍微调整了一个不同的解决方案 - 发布是因为我认为这对某人有用。

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

Code

代码

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

回答by wolfe

I rewrote the code above to fit the standard U.S. written word number format.

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

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

回答by Mohammed Shamshid

Using NumberFormatter class it is simple to get convert to words.

使用 NumberFormatter 类很容易转换为单词。

<?php

$number = '12345';
$locale = 'en_US';
$fmt = numfmt_create($locale, NumberFormatter::SPELLOUT);
$in_words = numfmt_format($fmt, $number);

print_r($in_words);
// twelve thousand three hundred forty-five

?>

回答by curiosity

Yes there is. without using a library you just need to follow this..

就在这里。不使用图书馆,你只需要遵循这个..

First you need to check in your server if ;extension=php_intl.dllis enabled in your php.iniif still not work you need to see this answer.

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

intl extension php_intl.dll with wamp

带有 wamp 的国际扩展 php_intl.dll

after successfully moving all the files starts with icu.

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

from: <wamp_installation_path>/bin/php/php5.4.3/

从: <wamp_installation_path>/bin/php/php5.4.3/

to: <wamp_installation_path>/bin/apache/apache2.2.22/bin/

到: <wamp_installation_path>/bin/apache/apache2.2.22/bin/

and restart your server.

并重新启动您的服务器。

try to run this code:

尝试运行此代码:

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

it will show the output of one hundred twenty-three thousand four hundred fifty-six.

它将显示十二万三千四百五十六的输出

hope that helps everyone :).

希望对大家有帮助:)。

回答by Rohan kumar

You can use the NumberFormatter Class:

您可以使用NumberFormatter 类

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

回答by Works for a Living

Here's a small class I wrote tonight. Caveats:

这是我今晚写的一个小班级。注意事项:

  1. Only in English.
  2. Only handles American/French definitions of billions, etc.
  3. The longformmethod doesn't handle decimals. It just erases them. Feel free to modify this and add that functionality if you wish.
  4. The numberformatmethod does do decimals, but doesn't do any rounding. I had to create a new numberformatfunction because of PHP's inherent limitations with integer sizes. I was translating numbers so big that when I used number_format()to check my translations, it took me 30 minutes to realize my translations weren't wrong, number_formatwas.
  5. This isn't a caveat about the class, but about PHP. 32-bit versions of PHP will not handle integers bigger than 2,147,483,647(2 billion and change). 64-bit versions will handle up to like 9 quintillionor something. BUT that's irrelevant here as long as you feed the numbers to the longformmethod as a string. I did a 306-digit number over ajaxfrom a webform just fine, as long as I passed it to the server as ''+number.
  1. 只有英文。
  2. 仅处理美国/法国对数十亿的定义等。
  3. longform方法不处理小数。它只是擦除它们。如果您愿意,可以随意修改它并添加该功能。
  4. numberformat方法确实进行小数,但不进行任何四舍五入。numberformat由于 PHP 对整数大小的固有限制,我不得不创建一个新函数。我翻译的数字太大了,以至于当我过去number_format()检查我的翻译时,我花了 30 分钟才意识到我的翻译没有错,number_format是。
  5. 这不是关于类的警告,而是关于 PHP。32 位版本的 PHP 不会处理大于2,147,483,647(20 亿和变化)的整数。64 位版本将处理最多喜欢9 quintillion什么的。但是,只要您将数字longform作为string. 我ajax从网络表单中输入了 306 位数字就好了,只要我将它作为''+number.

So, this class will translate numbers up to 999 Centillion, 999 etc.(e.g., a string of 9s 306 characters long). Any number bigger than that and the function just returns a dumb message.

所以,这个类将最多翻译数字999 Centillion, 999 etc.(例如,一个 9s 306 个字符长的字符串)。任何大于此的数字,该函数只会返回一条愚蠢的消息。

Usage:

用法:

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

The optional second boolean parameter defaults to true, which adds commas as best it can in the right places, to make the number more readable.

可选的第二个布尔参数默认为 true,它尽可能在正确的位置添加逗号,使数字更具可读性。

By the way, you can put a -at the front if you want it to be negative, but any other characters included in the inputted string will be stripped out. For instance:

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

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

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

The numberformatmethod isn't necessary for any other method. It's just there if you want to check a really long translated number. Since all these functions handle numbers as strings, they don't run up against PHP's limitations.

numberformat方法对于任何其他方法都不是必需的。如果您想检查一个非常长的翻译号码,它就在那里。由于所有这些函数都将数字作为字符串处理,因此它们不会遇到 PHP 的限制。

The only reason I stopped at a 999 centillion is because centillion was the last number on the website I was looking at when I couldn't remember what came after a decillion.

我停在 999 centillion 的唯一原因是 centillion 是我在网站上查看的最后一个数字,当时我不记得 decillion 之后是什么。

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

回答by Mukhpal Singh

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

Very simple way to convert number to words using PHP function.

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