Tôi có số và cần thêm hậu tố: 'st', 'nd', 'rd', 'th'. Vì vậy, ví dụ: nếu số là 42 hậu tố là 'nd', 521 là 'st' và 113 là 'th' và cứ thế. Tôi cần làm điều này trong perl. Bất kỳ con trỏ nào.Làm cách nào để lấy hậu tố thứ tự của số nguyên trong Perl (như st, nd, rd, th)
Trả lời
Hãy thử điều này:
my $ordinal;
if ($foo =~ /(?<!1)1$/) {
$ordinal = 'st';
} elsif ($foo =~ /(?<!1)2$/) {
$ordinal = 'nd';
} elsif ($foo =~ /(?<!1)3$/) {
$ordinal = 'rd';
} else {
$ordinal = 'th';
}
Sử dụng Lingua::EN::Numbers::Ordinate. Từ tóm tắt:
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;
}
...
}
Hãy thử chương trình con ngắn gọn này
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";
}
đầu ra
42nd
521st
113th
Có điều gì đó tôi không hiểu đầy đủ ở đây. Tại sao một vòng lặp 'for' khi chỉ có một phần tử làm đối số? Nó cũng có thể làm việc 'return int (shift). (qw/... '. Đối với một số tham số, vòng lặp' for' sẽ không hoạt động vì câu lệnh 'return'. Nó hoạt động tốt như vậy, nhưng tôi có bỏ sót điều gì đó về vòng lặp không? – Birei
@Birei: nó chỉ là một cách để đặt '$ _ [0]' vào '$ _'. Cách của bạn sẽ không hoạt động vì biểu thức chính quy cần giá trị nằm trong' $ _'. Nó giống như từ ngữ 'given' mới nhưng bạn không thể sử dụng điều đó làm công cụ sửa đổi câu lệnh như bạn có thể với 'for'. – Borodin
Ah, ok. Cảm ơn bạn. Không nhận được điểm' $ _'. Nó xứng đáng là ** ** 1 **. – Birei
Dưới đây là một giải pháp which I originally wrote for a code golf challenge, hơi viết lại cho phù hợp với thông lệ tốt nhất thông thường cho mã phi golf :
$number =~ s/(1?\d)$/$1 . ((qw'th st nd rd')[$1] || 'th')/e;
Cách hoạt động của nó là regexp (1?\d)$
khớp với chữ số cuối cùng của số, cộng với số trước nếu nó là 1
. Thay thế sau đó sử dụng (các) chữ số phù hợp làm chỉ mục cho danh sách (qw'th st nd rd')
, ánh xạ 0 đến th
, 1 đến st
, 2 đến nd
, 3 đến rd
và bất kỳ giá trị nào khác để hoàn tác. Cuối cùng, toán tử ||
thay thế undef bằng th
.
Nếu bạn không thích s///e
, về cơ bản, giải pháp tương tự có thể được viết, ví dụ: như thế này:
for ($number) {
/(1?\d)$/ or next;
$_ .= (qw'th st nd rd')[$1] || 'th';
}
hoặc như là một chức năng:
sub ordinal ($) {
$_[0] =~ /(1?\d)$/ or return;
return $_[0] . ((qw'th st nd rd')[$1] || 'th');
}
Một giải pháp khác (mặc dù tôi thích câu trả lời từ trước đó là độc lập của việc sử dụng các module tốt hơn):
use Date::Calc 'English_Ordinal';
print English_Ordinal $ARGV[0];
- 1. datthon định dạng datetime với "st", "nd", "rd", "th" (tiếng anh thứ tự hậu tố) như PHP "S"
- 2. Định dạng ngày trong unix để bao gồm hậu tố vào ngày (st, nd, rd và th)
- 3. Phân tích ngày tháng của định dạng "ngày 10 tháng 1 năm 2010" trong Java? (với các chỉ số thứ tự, st | nd | rd | th)
- 4. Có cách nào dễ dàng trong .NET để nhận các kết thúc "st", "nd", "rd" và "th" cho các số không?
- 5. PHP ngày chuyển đổi đ [th/st/thứ]/tháng/yyyy
- 6. Cách thêm định dạng viết tắt thông thường vào ngày trong iOS, ví dụ: "Th", "st"
- 7. Số nguyên thủy và hậu tố của chúng
- 8. Javascript: Hậu tố thông thường cho các số có lớp CSS cụ thể
- 9. Mảng hậu tố và cây hậu tố
- 10. Tại sao các số nguyên trong tuple của cơ sở dữ liệu có hậu tố 'L'?
- 11. Cách tách tệp bằng hậu tố số
- 12. Làm cách nào để tạo định dạng Ngày như "ngày 1 tháng 11" trong C#
- 13. Làm cách nào để tắt tự động lưu tệp vim với hậu tố ~
- 14. Số hậu tố cho ngắn
- 15. css hướng rtl thứ tự nguyên tố vấn đề
- 16. Cảnh báo - "số Odd của các nguyên tố trong phân băm" trong perl
- 17. Lấy chữ số thứ bảy từ số nguyên
- 18. Làm cách nào để giữ lại thứ tự chèn của một hàm băm Perl lồng nhau?
- 19. Làm thế nào để đặt các cặp số nguyên không theo thứ tự trong C++?
- 20. Có cách nào trong Java để chuyển đổi một số nguyên thành thứ tự của nó không?
- 21. Hậu tố (ký tự kiểu) cho hằng số số "Byte" trong VB.NET là gì?
- 22. Làm cách nào để lấy số nguyên của không gian đĩa trống trong tệp Batch?
- 23. ULL hậu tố vào một số chữ
- 24. Regex này tìm số nguyên tố như thế nào?
- 25. Định dạng Số như Stack Overflow (được làm tròn đến hàng nghìn với hậu tố K)
- 26. Cách thức và thời điểm tạo liên kết hậu tố trong cây hậu tố?
- 27. Tại sao chắp thêm một hậu tố chung để đảo ngược thứ tự đối chiếu trong ngôn ngữ en_US?
- 28. Làm cách nào để thoát khỏi những thứ giống như mã trong chuỗi Perl?
- 29. lấy số thứ n của một phần tử trong jquery
- 30. Làm cách nào để lấy ký tự thứ n của chuỗi?
Upvote để sử dụng hiệu quả của sự khẳng định ngược chiều rộng tiêu cực khó nắm bắt. Mặc dù (đáng buồn) như Bill Ruppert chỉ ra, có một mô-đun CPAN cho điều này rồi. –
Mặc dù có * là * một giải pháp CPAN, tôi cũng thích cái này. Nó cũng được suy nghĩ, dễ đọc, không phụ thuộc và chính xác như giải pháp CPAN cho bất kỳ số nguyên nào. – DavidO