我曾经向Stack寻求帮助,并找到了这个Python代码
我想知道如何将其转换为Dart,并使用它获取序数。
ordinal = lambda n: "%d%s" % (n,"tsnrhtdd"[(n//10%10!=1)*(n%10<4)*n%10::4])
试试这个
void main() {
for(int i =1; i<=100;i++){
print("$i${ordinal(i)}");
}
}
String ordinal(int number) {
if(!(number >= 1 && number <= 100)) {//here you change the range
throw Exception('Invalid number');
}
if(number >= 11 && number <= 13) {
return 'th';
}
switch(number % 10) {
case 1: return 'st';
case 2: return 'nd';
case 3: return 'rd';
default: return 'th';
}
}
输出: 第1 第2 第3 第4 第5 第6 第7 第8 第9 第10 ..................
被接受的答案的可重复使用版本。
main() {
print(toOrdinal(3));
// -> 3rd
print(ordinalGenerator(end: 1000));
// -> [1st, 2nd, 3rd, 4th,..., 1000th]
print(ordinalGenerator(start: 7, end: 14));
// -> [7th, 8th, 9th, 10th, 11st, 12nd, 13rd, 14th]
}
List ordinalGenerator({int start = 1,required int end}) {
if (start < 1) throw Exception('Start Number Can\' be less than 1');
if (start > end) throw Exception('Invalid Range');
return List.generate(
end - (start == 1 ? 0 : start - 1),
(index) => toOrdinal(index + start),
);
}
String toOrdinal(int number) {
if (number < 0) throw Exception('Invalid Number');
switch (number % 10) {
case 1:
return '${number}st';
case 2:
return '${number}nd';
case 3:
return '${number}rd';
default:
return '${number}th';
}
}
使用扩展功能,下面的代码可以与任何int类型一起使用。 由于序数基于数字的最后一个数字;此int扩展将整数值转换为字符串 接下来,它获取该字符串的最后索引并使用它来确定序数。
extension NumberParsing on int {
String toOrdinalString() {
if ((this < 0)) {
//here you change the range
throw Exception('Invalid number: Number must be a positive number');
}
if (this == 0) {
return '0';
}
String stringValue = toString();
switch (stringValue[stringValue.length - 1]) {
case '1':
return stringValue + 'st';
case '2':
return stringValue + 'nd';
case '3':
return stringValue + 'rd';
default:
return stringValue + 'th';
}
}
}
// Usage:
int someIntValue = 25;
someIntValue.toOrdinalString();
//Output:
25th
// Generate Ordinals from 1 to 100
for(int i =1; i<=100;i++){
print(i.toOrdinalString());
}
我使用本地平台库制作了一个包。
https://pub.dev/packages/ordinal_formatter
final ordinalString = await OrdinalFormatter().format(2) ?? '';
// -> 2nd
final localisedOrdinalString = await OrdinalFormatter().format(2, 'en_US') ?? '';
// -> 2nd
if(!(number >= 1 && number <= 100))
中更改值范围。 - Jahidul Islam