将数字转换为字符串表示形式

4

我是一名开发者,正在开发一个简单的Web应用程序。在这个应用程序中,我需要以字符串格式向用户显示数字a。

例如:

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

两种方式都可以。我需要用PHP完成这个任务。非常感谢您的帮助。

4个回答

7

对于第一个选项(数字拼写),strtr 是你的好帮手。

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

echo strtr(-123, $words);

3
如果您想要拼写出完整的数字,可以使用PEAR Numbers_Words class。这个类有一个toWords()方法,接受一个+ve-ve数,并返回数字的拼写字符串表示。
如果您想将数字转换为digit wise的字符串,我不知道是否有任何库函数。但是您可以轻松编写自己的代码。user187291在他的答案中提供了一种很好的方法
<?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
下面我会给你一个例子函数。可能不完整,但应该可以让你开始(我知道,这个问题已经发布很久了。不过,它可能对其他人有所帮助-) 还有抱歉如果有任何错误:)。最后,它不是完整的。我只是为了举一个例子起点而已。
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

在@SRC之前的回答中,基于他的工作,我写了一个函数来将任何原始无符号整数转换为英文,主要是出于好奇。

你可以在这里找到代码:StampyCode的GitHub Gist

此代码仅受PHP整数限制(64位)的限制:

9223372036854775807

这段代码的输出结果为:

九千二百二十三万亿三千七百二十三亿七千三百六十八万五千四百七十五

代码嵌入:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接