番号があり、接尾辞「st」、「nd」、「rd」、「th」を追加する必要があります。たとえば、数値が 42 の場合、接尾辞は 'nd' であり、521 は 'st' であり、113 は 'th' などです。これをperlで行う必要があります。任意のポインター。
2246 次
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 を に置き換えます。th
st
nd
rd
||
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 に答える