14

番号があり、接尾辞「st」、「nd」、「rd」、「th」を追加する必要があります。たとえば、数値が 42 の場合、接尾辞は 'nd' であり、521 は 'st' であり、113 は 'th' などです。これをperlで行う必要があります。任意のポインター。

4

5 に答える 5

27

Lingua::EN::Numbers::Ordinateを使用します。あらすじより:

use Lingua::EN::Numbers::Ordinate;
print ordinate(4), "\n";
 # prints 4th
print ordinate(-342), "\n";
 # prints -342nd

# Example of actual use:
...
for(my $i = 0; $i < @records; $i++) {
  unless(is_valid($record[$i]) {
    warn "The ", ordinate($i), " record is invalid!\n"; 
    next;
  }
  ...
}
于 2012-07-06T21:35:38.877 に答える
16

これを試して:

my $ordinal;
if ($foo =~ /(?<!1)1$/) {
    $ordinal = 'st';
} elsif ($foo =~ /(?<!1)2$/) {
    $ordinal = 'nd';
} elsif ($foo =~ /(?<!1)3$/) {
    $ordinal = 'rd';
} else {
    $ordinal = 'th';
}
于 2012-07-06T21:35:00.987 に答える
7

この簡単なサブルーチンを試してください

use strict;
use warnings;

sub ordinal {
  return $_.(qw/th st nd rd/)[/(?<!1)([123])$/ ? $1 : 0] for int shift;
}

for (42, 521, 113) {
  print ordinal($_), "\n";
}

出力

42nd
521st
113th
于 2012-07-06T22:04:24.240 に答える
3

これは、コード ゴルフ チャレンジ用に最初に書いたソリューションで、ゴルフ以外のコードの通常のベスト プラクティスに準拠するように少し書き直したものです。

$number =~ s/(1?\d)$/$1 . ((qw'th st nd rd')[$1] || 'th')/e;

それが機能する方法は、正規表現が(1?\d)$数字の最後の桁に一致することです1。次に、置換は一致した数字を list へのインデックスとして使用し、 0 を、1 を、2 を、3を undef(qw'th st nd rd')にマッピングします。最後に、演算子は undef を に置き換えます。thstndrd||th

が気に入らない場合はs///e、基本的に同じソリューションを次のように書くことができます。

for ($number) {
    /(1?\d)$/ or next;
    $_ .= (qw'th st nd rd')[$1] || 'th';
}

または関数として:

sub ordinal ($) {
    $_[0] =~ /(1?\d)$/ or return;
    return $_[0] . ((qw'th st nd rd')[$1] || 'th');
}
于 2012-07-25T00:30:20.417 に答える
1

別の解決策(ただし、モジュールの使用に依存しない既存の回答が好きです):

use Date::Calc 'English_Ordinal';
print English_Ordinal $ARGV[0];
于 2015-10-16T20:07:11.943 に答える