我一直试图找到一个使用单词递增计数器的函数。我知道可能使用带后缀的数字(即第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的计数器就足够了。
非常感谢任何帮助。
答案 0 :(得分:9)
PEAR包中有class可以做到这一点:
<?php
// include class
include("Numbers/Words.php");
// create object
$nw = new Numbers_Words();
// convert to string
echo "600 in words is " . $nw->toWords(600);
?>
答案 1 :(得分:6)
二十并不是硬编码。你只需要一个数组,而不是一个函数。
$array = array('First', 'Second', 'Third', ...);
foreach ($array as $key => $value)
{
echo "$value index is $key";
}
更直接的答案是:没有内置功能能够满足您的需求。
答案 2 :(得分:4)
这里有一些伪代码可能会带来希望的好方法:
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'
答案 3 :(得分:4)
<?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 :(得分:3)
普通(仅英文),基于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;
}
}
答案 5 :(得分:2)
这是一个简单的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]);
}
答案 6 :(得分:1)
一个简短的小技巧来达到相同的结果是(ab)使用date()。
$num = 2;
echo date("jS", strtotime("January {$num}"));
// Output
"2nd"
尽管最多只能运行31个,并且可能比仅使用Parris建议的数组要慢。