# Add ST/ND/RD/TH to DAY in DATE

Show 40 post(s) from this thread on one page
Page 2 of 3 First 123 Last
• 11-25-2003, 10:23 PM
RoyW
Code:

```function num_abbrev_str(n) {  return n + (( Math.floor(n/10) == 1) ? "th" : ["th", "st", "nd", "rd", "th", "th", "th", "th", "th", "th"][n%10]); }```
• 11-25-2003, 10:26 PM
whammy
Whoa. :cool:

That works for dates, doesn't work for 113
• 11-25-2003, 10:46 PM
RoyW
Yeh I wasn't thinking above dates.
I think liorean has the best solution
• 11-25-2003, 10:47 PM
jsWalter
no, but this does!
function num_abbrev_str(n)
{
i = n % 100;

return n + (( Math.floor(i/10) == 1) ? "th" : ["th", "st", "nd", "rd", "th", "th", "th", "th", "th", "th"][i%10]);
}

jsWalter
• 11-25-2003, 11:13 PM
RoyW
Hi jsWalter,
You beat me to it. I was going to do it in one step
Code:

```function num_abbrev_str(n) {  return n + (( Math.floor((n%100)/10) == 1) ? "th" : ["th", "st", "nd", "rd", "th", "th", "th", "th", "th", "th"][n%10]); }```
but it is essentially the same thing.

I just noticed that liorean is assuming that in boolean expressions true==1

( this % 100 - nModTen != 10 )

Should evaluate to 0 or 1 and then multiply it by a value.

Hmm sneaky :)
(but maybe a little dangerous)
• 11-25-2003, 11:59 PM
liorean
Yah, I know it's sneaky. It's one of the tricks I thought of when I read through the JavaScript and ECMAScript specs recently, and this is the first time I've got to put it to use. Try it: <java&#0115;cript:alert(Number(Boolean(2)));void(0);>

Oh, just wondering - what might be fastest:
Code:

`(( Math.floor((n%100)/10) == 1)`
With one scope jump, one property lookup, one function call, one remainder, one division and one comparison, or
Code:

`( this % 100 - nModTen != 10 ) * nModeTen`
With one remainder, one subtraction, one comparison, one autocasting, and one multiplication.

I believe your code would win out, in those cases. (The access part (scope jump and property lookup) should be fast compared to my math, and the function call and the autocast should both be almost unnoticable) However, my single comparison should make my code faster in the cases of 'th', when I won't have to perform all those numerical operations. So, how would they compare for many numbers, performance wise?
• 11-26-2003, 12:36 AM
whammy
This is the kind of discussion that totally rules. :)
• 11-26-2003, 01:00 AM
liorean
Oh, having a look at your code, this change saves space, but I think it makes for slightly worse performance. I think it's cleaner looking, though:
Code:

```function num_abbrev_str(n) {  return n + (( Math.floor((n%100)/10) == 1) ? "th" : ([, "st", "nd", "rd", ,,,,,][n%10]) || 'th'); }```
• 11-26-2003, 04:44 AM
RoyW
I like the boolean trick and I like the idea of only having 4 strings in the array
Code:

```function num_abbrev_str(n) {     return n + ["th","st","nd","rd"][!(n%10>3||Math.floor(n%100/10)==1)*n%10]; }```
In this 60% of the time the
(n%10>3)
will be true so the
Math.floor(n%100/10)==1
will only be executed for 40% of the numbers.

Invert the boolean and do the multiply
NOTE: I have utilised operator precedence to reduce char count.
Here is a version with parentheses to show precedence
PHP Code:

``` function num_abbrev_str(n) {     return n + ["th","st","nd","rd"][(!( ((n%10) >3) || (Math.floor(n%100/10)==1)) ) * (n%10)];  }  ```
• 11-26-2003, 04:58 AM
whammy
I personally think that's a work of art... :D
• 03-18-2004, 03:05 AM
shlagish
I personnaly thought I knew something about javascript. I now think I know nothing !
• 10-20-2005, 10:14 AM
r0n1n
regexp
I know it's PHP but I thought somone was bound to know the JavaScript syntax for the regexp check.

<?php

\$days = range(1, 31);

foreach(\$days as \$day)
{
if(ereg("(^[23]?1\$)", \$day))
{
\$suff = "st";
}
elseif(ereg("(^2?2\$)", \$day))
{
\$suff = "nd";
}
elseif(ereg("(^2?3\$)", \$day))
{
\$suff = "rd";
}
else
{
\$suff = "th";
}

echo \$day . \$suff . "<br />";
}
?>
• 10-20-2005, 11:55 AM
liorean
That really was an old thread you dug up...

This problem is much less complex when handling it as numbers compared to handling it as strings. Math is generally easier to work with than string comparisons, especially when it's a numerical problem.
• 10-20-2005, 11:32 PM
felgall

switch (aNum) {
case 1:
case 21:
case 31:
suffix = 'st';
break;
case 2:
case 22:
suffix = 'nd';
break;
case 3:
case 23:
suffix = 'rd';
break;
default:
suffix = 'th';
}
• 03-26-2010, 02:11 PM
bardonw
I think that this is an interesting discussion. I see that there are a number of solutions for this problem. I think, though, that it is always important to generalize when developing script code that could be used in a number of situations. That said, I wrote a short function which will do the trick for any positive or negative integer. The code can be found at http://gotochriswest.com/development...OrdinalFor.php. Alternatively, you can also find it below:
Code:

```Number.getOrdinalFor = function(intNum, includeNumber) {         return (includeNumber ? intNum : "") + (((intNum = Math.abs(intNum) % 100)                 % 10 == 1 && intNum != 11) ? "st" : (intNum % 10 == 2 && intNum != 12)                 ? "nd" : (intNum % 10 == 3 && intNum != 13) ? "rd" : "th"); };```
Show 40 post(s) from this thread on one page
Page 2 of 3 First 123 Last