PHP: функция счетчика приращения с использованием слов (т. Е. Первый, Второй, Третий и т. Д.)


Я пытался найти функцию, которая увеличивает счетчик с помощью слов. Я знаю, что это возможно с использованием чисел с суффиксами (т. Е. 1-й, 2-й, 3-й и так далее). Вот фрагмент кода, который у меня есть:

function addOrdinalNumberSuffix($num) {
    if (!in_array(($num % 100),array(11,12,13))){
        switch ($num % 10) {
            // Handle 1st, 2nd, 3rd
            case 1:  return $num.'st';
            case 2:  return $num.'nd';
            case 3:  return $num.'rd';
        }
    }
    return $num.'th';
}

Источник кода

Но есть ли способ повторить это словами (т.Е. Первым, Вторым, Третьим и т. Д.)?

Я ожидал бы, что создать бесконечный счетчик будет довольно сложно (но не невозможно), но достаточно всего до 20.

Любой помощь была бы очень признательна.

Author: Bergi, 2011-05-24

6 answers

Существует класс из пакета PEAR, который может это сделать:

<?php

// include class
include("Numbers/Words.php");

// create object
$nw = new Numbers_Words();

// convert to string
echo "600 in words is " . $nw->toWords(600);

?>

Источник.

 8
Author: SIFE, 2011-05-24 19:59:21

Двадцать - это не так уж много для жесткого кода. Вам просто понадобится массив, а не функция.

$array = array('First', 'Second', 'Third', ...);

foreach ($array as $key => $value)
{
  echo "$value index is $key";
}

Более прямой ответ: нет встроенной функции, которая делает то, что вы ищете.

 6
Author: Parris Varney, 2011-05-24 19:57:44

Здесь идет некоторый псевдокод, который, возможно, приведет к, как мы надеемся, хорошему пути:

input = //any number
output = string (input)
if output ends with '1' then output += 'st'
else if output ends with '2' then output += 'nd'
else if output ends with '3' then output += 'rd'
else output += 'th'
 4
Author: Hyperboreus, 2011-05-24 19:59:43
<?php

    /*****************************************************************************/

function ToOrdinal($n) {
  /* Convert a cardinal number in the range 0 - 999 to an ordinal in
     words. */

  /* The ordinal will be collected in the variable $ordinal.
   Initialize it as an empty string.*/
  $ordinal = "";

  /* Check that the number is in the permitted range. */
  if ($n >= 0 && $n <= 999)
    null;
  else{
    echo "<br />You have called the function ToOrdinal with this value: $n, but
it is not in the permitted range, from 0 to 999, inclusive.<br />";
    return;
  }
  /* Extract the units. */
  $u = $n % 10;

  /* Extract the tens. */
  $t = floor(($n / 10) % 10);

  /* Extract the hundreds. */
  $h = floor($n / 100);

  /* Determine the hundreds */
  if ($h > 0) {

    /* ToCardinalUnits() works with numbers from 0 to 9, so it's okay
       for finding the number of hundreds, which must lie within this
       range. */
    $ordinal .= ToCardinalUnits($h);
    $ordinal .= " hundred";

    /* If tens and units are zero, append "th" and quit */
    if ($t == 0 && $u == 0) {
      $ordinal .=  "th";
    } else {
      /* Otherwise put in a blank space to separate the hundreds from
     what follows. */
      $ordinal .= " ";
    }
  }

  /* Determine the tens, unless there is just one ten.  If units are 0,
     handle them separately */
  if ($t >= 2 && $u != 0) {
    switch ($t) {
    case 2:
      $ordinal .= "twenty-";
      break;
   case 3:
      $ordinal .= "thirty-";
      break;
    case 4:
      $ordinal .= "forty-";
      break;
    case 5:
      $ordinal .= "fifty-";
      break;
    case 6:
      $ordinal .= "sixty-";
      break;
    case 7:
      $ordinal .= "seventy-";
      break;
    case 8:
      $ordinal .= "eighty-";
      break;
    case 9:
      $ordinal .= "ninety-";
      break;
    }
  }
  /* Print the tens (unless there is just one ten) with units == 0 */
  if ($t >= 2 && $u == 0) {
    switch ($t) {
    case 2:
      $ordinal .= "twentieth";
      break;
    case 3:
      $ordinal .= "thirtieth";
      break;
    case 4:
      $ordinal .= "fortieth";
      break;
    case 5:
      $ordinal .= "fiftieth";
      break;
    case 6:
      $ordinal .= "sixtieth";
      break;
    case 7:
      $ordinal .= "seventieth";
      break;
    case 8:
      $ordinal .= "eightieth";
      break;
    case 9:
      $ordinal .= "ninetieth";
      break;
    }
  }


  /* Print the teens, if the tens is 1. */
  if ($t == 1) {
    switch ($u) {
    case 0:
      $ordinal .= "tenth";
      break;
    case 1:
      $ordinal .= "eleventh";
      break;
    case 2:
      $ordinal .= "twelfth";
      break;
    case 3:
      $ordinal .= "thirteenth";
      break;
    case 4:
      $ordinal .= "fourteenth";
      break;
    case 5:
      $ordinal .= "fifteenth";
      break;
    case 6:
      $ordinal .= "sixteenth";
      break;
    case 7:
      $ordinal .= "seventeenth";
      break;
    case 8:
      $ordinal .= "eighteenth";
      break;
    case 9:
      $ordinal .= "nineteenth";
      break;
    }
  }

  /* Print the units. */
  if ($t != 1) {
    switch ($u) {
    case 0:
      if ($n == 0)
    $ordinal .= "zeroth";
      break;
    case 1:
      $ordinal .= "first";
      break;
    case 2:
      $ordinal .= "second";
      break;
    case 3:
      $ordinal .= "third";
      break;
    case 4:
      $ordinal .= "fourth";
      break;
    case 5:
      $ordinal .= "fifth";
      break;
    case 6:
      $ordinal .= "sixth";
      break;
    case 7:
      $ordinal .= "seventh";
      break;
    case 8:
      $ordinal .= "eighth";
      break;
    case 9:
      $ordinal .= "ninth";
      break;
    }
  }
  return $ordinal;
}

/*****************************************************************************/


function ToCardinalUnits($n) {
  /* Convert a number in the range 0 to 9 into its word equivalent. */

  /* Make sure the number is in the permitted range. */
  if ($n >= 0 && $n <= 9)
    null;
  else
    {
      echo "<br />You have called ToCardinal() with an argument $n, but the permitted range is 0 to 9, inclusive.<br />";
    }

  switch ($n) {
  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";
  }
}



?>
 4
Author: cbc, 2012-03-01 23:38:28

Порядковые номера (только на английском языке), основанные на ответе SIFE:

include("Numbers/Words.php");

function Nth($n)
{
    $nw = new Numbers_Words();
    $s = $nw->toWords($n);
    $replacements = array(
        'one' => 'first',
        'two' => 'second',
        'three' => 'third',
        've' => 'fth',
        't' => 'th',
        'e' => 'th',
        'y' => 'ieth',
        '' => 'th',
    );
    foreach ($replacements as $from => $to)
    {
        $count = 0;
        $r = preg_replace('/' . $from . '$/', $to, $s, 1, $count);
        if ($count)
            return $r;
    }
}
 3
Author: Vladimir Panteleev, 2011-08-09 21:51:07

Вот ссылка на простую функцию PHP, которая показывает, как справиться с этим простым способом: http://webdeveloperblog.tiredmachine.com/php-converting-an-integer-123-to-ordinal-word-firstsecondthird/

Приведенный пример работает только в пятидесятых годах, но его можно легко расширить, чтобы достичь более высоких диапазонов.

function numToOrdinalWord($num)
{
    $first_word = array('eth','First','Second','Third','Fouth','Fifth','Sixth','Seventh','Eighth','Ninth','Tenth','Elevents','Twelfth','Thirteenth','Fourteenth','Fifteenth','Sixteenth','Seventeenth','Eighteenth','Nineteenth','Twentieth');
    $second_word =array('','','Twenty','Thirthy','Forty','Fifty');

    if($num <= 20)
        return $first_word[$num];

    $first_num = substr($num,-1,1);
    $second_num = substr($num,-2,1);

    return $string = str_replace('y-eth','ieth',$second_word[$second_num].'-'.$first_word[$first_num]);
}
 2
Author: Thor, 2012-01-08 17:07:39