Преобразовать число в его строковое представление - PullRequest
4 голосов
/ 15 марта 2010

Я разрабатываю простое веб-приложение, в котором мне нужно отображать число a для моих пользователей в строковом формате.

Пример:

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

В любом случае это хорошо. Мне нужно, чтобы это было сделано в PHP. Любая помощь будет оценена.

Ответы [ 4 ]

7 голосов
/ 15 марта 2010

для первого варианта (прописать цифры), strtr ваш друг

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

echo strtr(-123, $words);
3 голосов
/ 15 марта 2010

Если вы хотите записать число complete , вы можете использовать класс PEAR Numbers_Words . В этом классе есть метод toWords (), который принимает +ve или -ve num и возвращает записанное строковое представление числа.

Если вы хотите преобразовать число в строку для цифр , я не знаю ни о какой функции lib. Но вы можете легко написать код самостоятельно. 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 голос
/ 08 января 2017

Основываясь на работе, которую @SRC делал в предыдущем ответе, я написал функцию для преобразования любого необработанного целого числа без знака в английский, в основном из любопытства.

Вы можете найти код здесь: a GitHub Gist от StampyCode

Этот код ограничен только целочисленным пределом 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;
1 голос
/ 25 августа 2012

ниже я даю вам пример функции.Это может быть не полный вопрос, но он должен помочь вам начать работу (я знаю, вопрос был опубликован давно. Тем не менее, он может помочь другим).и, наконец, он еще не закончен.Я просто отправляю для примера отправную точку.

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;
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...