Hello and welcome to our community! Is this your first visit?
Register
Enjoy an ad free experience by logging in. Not a member yet? Register.
Page 2 of 3 FirstFirst 123 LastLast
Results 16 to 30 of 45
  1. #16
    Regular Coder
    Join Date
    Jun 2002
    Location
    Atlanta, GA.
    Posts
    313
    Thanks
    0
    Thanked 0 Times in 0 Posts
    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]);
    }

  2. #17
    Senior Coder
    Join Date
    Jun 2002
    Location
    41░ 8' 52" N -95░ 53' 31" W
    Posts
    3,660
    Thanks
    0
    Thanked 0 Times in 0 Posts
    Whoa.

    That works for dates, doesn't work for 113
    Former ASP Forum Moderator - I'm back!

    If you can teach yourself how to learn, you can learn anything. ;)

  3. #18
    Regular Coder
    Join Date
    Jun 2002
    Location
    Atlanta, GA.
    Posts
    313
    Thanks
    0
    Thanked 0 Times in 0 Posts
    Yeh I wasn't thinking above dates.
    I think liorean has the best solution

  4. #19
    New Coder
    Join Date
    Nov 2003
    Location
    Chicago, IL
    Posts
    12
    Thanks
    0
    Thanked 0 Times in 0 Posts

    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

  5. #20
    Regular Coder
    Join Date
    Jun 2002
    Location
    Atlanta, GA.
    Posts
    313
    Thanks
    0
    Thanked 0 Times in 0 Posts
    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)

  6. #21
    Master Coder
    Join Date
    Feb 2003
    Location
    Umeň, Sweden
    Posts
    5,575
    Thanks
    0
    Thanked 83 Times in 74 Posts
    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?
    Last edited by liorean; 11-26-2003 at 12:08 AM.
    liorean <[lio@wg]>
    Articles: RegEx evolt wsabstract , Named Arguments
    Useful Threads: JavaScript Docs & Refs, FAQ - HTML & CSS Docs, FAQ - XML Doc & Refs
    Moz: JavaScript DOM Interfaces MSDN: JScript DHTML KDE: KJS KHTML Opera: Standards

  7. #22
    Senior Coder
    Join Date
    Jun 2002
    Location
    41░ 8' 52" N -95░ 53' 31" W
    Posts
    3,660
    Thanks
    0
    Thanked 0 Times in 0 Posts
    This is the kind of discussion that totally rules.
    Former ASP Forum Moderator - I'm back!

    If you can teach yourself how to learn, you can learn anything. ;)

  8. #23
    Master Coder
    Join Date
    Feb 2003
    Location
    Umeň, Sweden
    Posts
    5,575
    Thanks
    0
    Thanked 83 Times in 74 Posts
    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');
    }
    liorean <[lio@wg]>
    Articles: RegEx evolt wsabstract , Named Arguments
    Useful Threads: JavaScript Docs & Refs, FAQ - HTML & CSS Docs, FAQ - XML Doc & Refs
    Moz: JavaScript DOM Interfaces MSDN: JScript DHTML KDE: KJS KHTML Opera: Standards

  9. #24
    Regular Coder
    Join Date
    Jun 2002
    Location
    Atlanta, GA.
    Posts
    313
    Thanks
    0
    Thanked 0 Times in 0 Posts
    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 
    + ["th","st","nd","rd"][(!( ((n%10) >3) || (Math.floor(n%100/10)==1)) ) * (n%10)]; 


  10. #25
    Senior Coder
    Join Date
    Jun 2002
    Location
    41░ 8' 52" N -95░ 53' 31" W
    Posts
    3,660
    Thanks
    0
    Thanked 0 Times in 0 Posts
    I personally think that's a work of art...
    Last edited by whammy; 11-26-2003 at 05:04 AM.
    Former ASP Forum Moderator - I'm back!

    If you can teach yourself how to learn, you can learn anything. ;)

  11. #26
    Senior Coder
    Join Date
    Apr 2003
    Location
    Canada
    Posts
    1,063
    Thanks
    2
    Thanked 0 Times in 0 Posts
    I personnaly thought I knew something about javascript. I now think I know nothing !
    Shawn

  12. #27
    New to the CF scene
    Join Date
    Oct 2005
    Location
    Torquay
    Posts
    1
    Thanks
    0
    Thanked 0 Times in 0 Posts

    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 />";
    }
    ?>
    Last edited by r0n1n; 10-20-2005 at 11:36 AM. Reason: code sucked

  13. #28
    Master Coder
    Join Date
    Feb 2003
    Location
    Umeň, Sweden
    Posts
    5,575
    Thanks
    0
    Thanked 83 Times in 74 Posts
    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.
    liorean <[lio@wg]>
    Articles: RegEx evolt wsabstract , Named Arguments
    Useful Threads: JavaScript Docs & Refs, FAQ - HTML & CSS Docs, FAQ - XML Doc & Refs
    Moz: JavaScript DOM Interfaces MSDN: JScript DHTML KDE: KJS KHTML Opera: Standards

  14. #29
    Master Coder felgall's Avatar
    Join Date
    Sep 2005
    Location
    Sydney, Australia
    Posts
    6,623
    Thanks
    0
    Thanked 645 Times in 635 Posts
    What about this to test the values in the easiest to follow way:

    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';
    }
    Stephen
    Learn Modern JavaScript - http://javascriptexample.net/
    Helping others to solve their computer problem at http://www.felgall.com/

    Don't forget to start your JavaScript code with "use strict"; which makes it easier to find errors in your code.

  15. #30
    New Coder
    Join Date
    Dec 2009
    Posts
    11
    Thanks
    1
    Thanked 0 Times in 0 Posts
    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");
    };
    Last edited by bardonw; 03-26-2010 at 03:07 PM. Reason: I found a better solution.


 
Page 2 of 3 FirstFirst 123 LastLast

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •