in reply to adding st,nd,rd and th to numbers

Note that your problem doesn't start at 111th and 112th. Your problem starts at 11th and 12th. 121st still follows your pattern, so really the only deviance you have from your pattern is when the last two numbers are 11, 12, or 13. See if you can add that special logic and you should be alright.

my $nouser = 5; my $suffix; $suffix = 'st' if ($nouser =~ /(1)$/); $suffix = 'nd' if ($nouser =~ /(2)$/); $suffix = 'rd' if ($nouser =~ /(3)$/); $suffix = 'th' if ($nouser =~ /(4|5|6|7|8|9|0)$/); $suffix = 'th' if ($nouser =~ /(11|12|13)$/); $nouser = $nouser . $suffix;

    -Bryan

Replies are listed 'Best First'.
Re^2: adding st,nd,rd and th to numbers
by ikegami (Patriarch) on Jul 19, 2005 at 15:34 UTC

    You're doing captures for nothing. Fix:

    my $suffix; $suffix = 'st' if ($nouser =~ /1$/); $suffix = 'nd' if ($nouser =~ /2$/); $suffix = 'rd' if ($nouser =~ /3$/); $suffix = 'th' if ($nouser =~ /(?:4|5|6|7|8|9|0)$/); $suffix = 'th' if ($nouser =~ /(?:11|12|13)$/);

    You're executing every regexp for nothing. Fix:

    my $suffix; if ($nouser =~ /(?<!1)1$/) { $suffix = 'st'; } elsif ($nouser =~ /(?<!1)2$/) { $suffix = 'nd'; } elsif ($nouser =~ /(?<!1)3$/) { $suffix = 'rd'; } else { $suffix = 'th'; }

    Alternative styles:

      While the existing Lingua module is probably the best solution, I thought I'd add to your list of styles a subroutine that I've used in the past:
      sub ordinate ($) { my $num = shift; $num =~ s/(\d*(11|12|13|4|5|6|7|8|9|0))$/$1th/ or $num =~ s/(\d*(1))$/$1st/ or $num =~ s/(\d*(2))$/$1nd/ or $num =~ s/(\d*(3))$/$1rd/; return $num; }

      So, just out of curiosity, I benchmarked the alternatives above and my code. I don't test your first chunk of code, I start with the first example using the if/elsif/else structure. Results:

      Rate Ordinate Method 3 Method 4 Method 2 Method 1 Ordinate 125/s -- -48% -50% -54% -64% Method 3 242/s 93% -- -4% -11% -30% Method 4 252/s 102% 5% -- -7% -27% Method 2 272/s 117% 13% 8% -- -21% Method 1 344/s 175% 42% 36% 27% --

      It looks like your first pass at if/elsif/else is the best by quite a bit, and my approach is extremely slow. ;-) The code I used for benchmarking:

      <-radiant.matrix->
      Larry Wall is Yoda: there is no try{} (ok, except in Perl6; way to ruin a joke, Larry! ;P)
      The Code that can be seen is not the true Code