如何在Flutter中获取序号?

8

我曾经向Stack寻求帮助,并找到了这个Python代码

我想知道如何将其转换为Dart,并使用它获取序数。

ordinal = lambda n: "%d%s" % (n,"tsnrhtdd"[(n//10%10!=1)*(n%10<4)*n%10::4])
4个回答

14

试试这个

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 ..................


谢谢您的回应,它使用了月份中的日期?是否有方法扩展它,例如111日或更多。 - oceanmanta
你可以在序数 if(!(number >= 1 && number <= 100)) 中更改值范围。 - Jahidul Islam
你真的需要范围检查吗?它不应该无论如何都能正常工作,对吗? - Stack Underflow
是的,你说得对。 - Jahidul Islam

1

被接受的答案的可重复使用版本。

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';
  }
}

0

使用扩展功能,下面的代码可以与任何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());
   }

0

我使用本地平台库制作了一个包。

https://pub.dev/packages/ordinal_formatter

final ordinalString = await OrdinalFormatter().format(2) ?? ''; 
// -> 2nd

final localisedOrdinalString = await OrdinalFormatter().format(2, 'en_US') ?? ''; 
// -> 2nd

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接