PHP bir sayı (1, 2, 3) bir dizeye (bir, iki, üç) dönüştürme

7 Cevap php

Herkes PHP onların metin sürümü (bir, iki, üç) tür, 1, 2 veya 3 gibi bir sayıyı dönüştürmek nasıl biliyor mu? Ben sadece 1-99 dönüştürmek gerekir. Ben büyük bir switch deyimi yazabilirsiniz biliyorum ama bu saçma olurdu.

7 Cevap

armut bir paket var Numbers_Words:

$numberToWord = new Numbers_Words();
echo $numberToWords->toWords(200);

Burada şekilde geri üniversitede yazdı biri. Bu negatif sayılar için destek içerir, aynı zamanda. Ben kısaltılmış ve / veya temizlenmiş olabilir bazı yolları var biliyorum, ama hey, bu any tamsayı için iyi çalışır!

/**
 Converts an integer to its textual representation.
 @param num the number to convert to a textual representation
 @param depth the number of times this has been recursed
*/
function readNumber($num, $depth=0)
{
    $num = (int)$num;
    $retval ="";
    if ($num < 0) // if it's any other negative, just flip it and call again
        return "negative " + readNumber(-$num, 0);
    if ($num > 99) // 100 and above
    {
        if ($num > 999) // 1000 and higher
            $retval .= readNumber($num/1000, $depth+3);

        $num %= 1000; // now we just need the last three digits
        if ($num > 99) // as long as the first digit is not zero
            $retval .= readNumber($num/100, 2)." hundred\n";
        $retval .=readNumber($num%100, 1); // our last two digits                       
    }
    else // from 0 to 99
    {
        $mod = floor($num / 10);
        if ($mod == 0) // ones place
        {
            if ($num == 1) $retval.="one";
            else if ($num == 2) $retval.="two";
            else if ($num == 3) $retval.="three";
            else if ($num == 4) $retval.="four";
            else if ($num == 5) $retval.="five";
            else if ($num == 6) $retval.="six";
            else if ($num == 7) $retval.="seven";
            else if ($num == 8) $retval.="eight";
            else if ($num == 9) $retval.="nine";
        }
        else if ($mod == 1) // if there's a one in the ten's place
        {
            if ($num == 10) $retval.="ten";
            else if ($num == 11) $retval.="eleven";
            else if ($num == 12) $retval.="twelve";
            else if ($num == 13) $retval.="thirteen";
            else if ($num == 14) $retval.="fourteen";
            else if ($num == 15) $retval.="fifteen";
            else if ($num == 16) $retval.="sixteen";
            else if ($num == 17) $retval.="seventeen";
            else if ($num == 18) $retval.="eighteen";
            else if ($num == 19) $retval.="nineteen";
        }
        else // if there's a different number in the ten's place
        {
            if ($mod == 2) $retval.="twenty ";
            else if ($mod == 3) $retval.="thirty ";
            else if ($mod == 4) $retval.="forty ";
            else if ($mod == 5) $retval.="fifty ";
            else if ($mod == 6) $retval.="sixty ";
            else if ($mod == 7) $retval.="seventy ";
            else if ($mod == 8) $retval.="eighty ";
            else if ($mod == 9) $retval.="ninety ";
            if (($num % 10) != 0)
            {
                $retval = rtrim($retval); //get rid of space at end
                $retval .= "-";
            }
            $retval.=readNumber($num % 10, 0);
        }
    }

    if ($num != 0)
    {
        if ($depth == 3)
            $retval.=" thousand\n";
        else if ($depth == 6)
            $retval.=" million\n";
        if ($depth == 9)
            $retval.=" billion\n";
    }
    return $retval;
}

Gerçekten ideal, ama bir 'büyük bir switch deyimi' den en az iyi değildir:

 $numbermappings = array("zero", "one","two","three", "four" .... "ninetynine");
 echo  $numbermappings[4]; // four

Ancak yine de bu büyük dizi yazmak zorunda ..

See this function in action:

function N2L($number)
{
    $result = array();
    $tens = floor($number / 10);
    $units = $number % 10;

    $words = array
    (
        'units' => array('', 'One', 'Two', 'Three', 'Four', 'Five', 'Six', 'Seven', 'Eight', 'Nine', 'Ten', 'Eleven', 'Twelve', 'Thirteen', 'Fourteen', 'Fifteen', 'Sixteen', 'Seventeen', 'Eightteen', 'Nineteen'),
        'tens' => array('', '', 'Twenty', 'Thirty', 'Fourty', 'Fifty', 'Sixty', 'Seventy', 'Eigthy', 'Ninety')
    );

    if ($tens < 2)
    {
        $result[] = $words['units'][$tens * 10 + $units];
    }

    else
    {
        $result[] = $words['tens'][$tens];

        if ($units > 0)
        {
            $result[count($result) - 1] .= '-' . $words['units'][$units];
        }
    }

    if (empty($result[0]))
    {
        $result[0] = 'Zero';
    }

    return trim(implode(' ', $result));
}
$numbers_as_words = array("zero", "one", "two"..."ninety nine");
echo $numbers_as_words[1] // prints one
echo $numbers_as_words[2] // prints two
echo $numbers_as_words[54] // prints fifty four

vs ..

Bunu yapan bir PEAR paketi var. Bu 99 daha YOL yüksek sayı yapar ve çoklu dil, bu yüzden daha ihtiyacınız daha ağır, ama kontrol yine de değer olabilir:

http://pear.php.net/package/Numbers_Words