我有數字並需要添加後綴:'st','nd','rd','th'。例如:如果數字是42,後綴是'nd',521是'st',113是'th',依此類推。 我需要在perl中這樣做。任何指針。如何在Perl中檢索整數的序號後綴(如st,nd,rd,th)
回答
試試這個:
my $ordinal;
if ($foo =~ /(?<!1)1$/) {
$ordinal = 'st';
} elsif ($foo =~ /(?<!1)2$/) {
$ordinal = 'nd';
} elsif ($foo =~ /(?<!1)3$/) {
$ordinal = 'rd';
} else {
$ordinal = 'th';
}
使用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;
}
...
}
試試這個簡單的子程序
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
這裏有一些我不完全明白的地方。爲什麼在只有一個元素作爲參數時使用'for'循環?它也可以工作'返回int(shift)。 (qw/...''。對於幾個參數,'for'循環不會因爲return語句而工作,它可以正常工作,但是我錯過了一些關於循環的東西嗎? – Birei 2012-07-23 14:00:43
@Birei:它只是一種將'$ _ [0]'放入'$ _'中的方法,因爲正則表達式需要值在'$ _'中,所以你的方法不行,這很像新的'given'語言詞,但是你不能用'as'作爲語句修飾符。 – Borodin 2012-07-23 14:19:24
好的,謝謝。沒有得到'$ _'的意義,它值得** + 1 **。 – Birei 2012-07-23 14:25:35
這裏有一個解決方案which I originally wrote for a code golf challenge,稍微改寫符合非高爾夫代碼通常的最佳實踐:
$number =~ s/(1?\d)$/$1 . ((qw'th st nd rd')[$1] || 'th')/e;
它的工作方式是正則表達式(1?\d)$
匹配數字的最後一位數字加上前面的數字,如果它是1
。該替換然後使用匹配的數字作爲列表(qw'th st nd rd')
的索引,將0到th
,1到st
,2到nd
,3到rd
以及任何其他值到undef。最後,||
運營商用th
替換undef。
如果您不喜歡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');
}
另一種解決方案(雖然我喜歡的預先存在的答案是獨立於使用模塊更好的):
use Date::Calc 'English_Ordinal';
print English_Ordinal $ARGV[0];
- 1. 修改正則表達式來匹配日期與序號「st」,「nd」,「rd」,「th」
- 2. 以「st」,「nd」,「rd」和「th」格式顯示日期
- 3. 在unix中格式化日期以包含日期的後綴(st,nd,rd和th)
- 4. 如何在使用c#的日期向上移動st,nd,rd?
- 5. 將st,th,rd添加到jQuery日期
- 6. 有沒有一種簡單的方法在.NET中獲得數字的「st」,「nd」,「rd」和「th」結尾?
- 7. 如何在使用Jekyll的號碼後正確顯示帶有th/st/nd的日期?
- 8. 如何在日期中添加「th」或「rd」
- 9. 如何在日期上獲得'th'和'rd'?
- 10. 在python中給數字序號後綴
- 11. R:添加「日」,「RD」和「ND」爲日期
- 12. 如何在en.yml上使用「th」後綴格式化日期?
- 13. 如何在CakePHP中檢索整數列的整數值?
- 14. 如何使用後綴檢索存儲桶中的對象
- 15. VB-2008如何檢索數組中最大數字後綴的字符串?
- 16. 使用後綴數組搜索後綴
- 17. 完整的後綴數組
- 18. 如何檢索URL的整數部分?
- 19. 如何在sql中顯示帶有後綴/前綴的數據?
- 20. 如何在編制索引時添加前綴和後綴
- 21. 如何在Auth後檢索POST數據?
- 22. 如何在Android 7.0+中檢索SD卡的序列號?
- 23. 如何在crm中刪除自動編號的後綴2016
- 24. 如何檢查|在Perl中
- 25. 如何檢索用戶UPN後綴爲一個字符串
- 26. 如何檢索JFormattedTextField整數值?
- 27. 在Ruby on Rails中,如何使用「th」後綴格式化日期,如「Sun Oct 5th 5th」中的日期?
- 28. 如何檢索與prep_match_all號()
- 29. Perl如何從數組散列中檢索數組?
- 30. 如何檢測Perl中是否存在(=)當前行的符號?
給予好評用於生產的難以捉摸的零寬度負面後顧斷言。雖然(可惜)比爾·魯珀特指出,已經有一個CPAN模塊。 – 2012-07-06 23:35:43
儘管*有* CPAN解決方案,我也喜歡這個。它經過深思熟慮,可讀性強,沒有依賴關係,並且與任何整數的CPAN解決方案一樣精確。 – DavidO 2012-07-07 08:20:31