NSNumberFormatter и 'th' 'st' 'nd' 'rd' (порядковые) числа - PullRequest
30 голосов
/ 23 июля 2010

Есть ли способ использовать NSNumberFormatter для получения окончаний числа 'th' 'st' 'nd' 'rd'?

EDIT:

Похоже, его не существует.Вот что я использую.

+(NSString*)ordinalNumberFormat:(NSInteger)num{
    NSString *ending;

    int ones = num % 10;
    int tens = floor(num / 10);
    tens = tens % 10;
    if(tens == 1){
        ending = @"th";
    }else {
        switch (ones) {
            case 1:
                ending = @"st";
                break;
            case 2:
                ending = @"nd";
                break;
            case 3:
                ending = @"rd";
                break;
            default:
                ending = @"th";
                break;
        }
    }
    return [NSString stringWithFormat:@"%d%@", num, ending];
}

Адаптировано из ответа Никфа здесь Есть ли простой способ в .NET получить окончания "st", "nd", "rd" и "th"для номеров?

Ответы [ 20 ]

3 голосов
/ 23 июля 2010

Я не знаю об этой возможности.Тем не менее, это можно сделать самостоятельно.В английском языке порядковый номер (th, st, nd, rd и т. Д.) Имеет действительно простой шаблон:

Если число заканчивается на: => Use:

  • 0 =>th
  • 1 => st
  • 2 => nd
  • 3 => rd
  • 4 => th
  • 5 =>th
  • 6 => th
  • 7 => th
  • 8 => th
  • 9 => th
  • 11 =>th
  • 12 => th
  • 13 => th

Это не расшифрует слово для вас, но позволит вам сделать что-то вроде:«42-й», «1,340,697-й» и т. Д.

Это становится более сложным, если вам нужно локализовать.

2 голосов
/ 23 июля 2010

В следующем примере показано, как обрабатывать любое число.Он находится в C #, но может быть легко преобразован в любой язык.

http://www.bytechaser.com/en/functions/b6yhfyxh78/convert-number-to-ordinal-like-1st-2nd-in-c-sharp.aspx

2 голосов
/ 28 декабря 2015

Это преобразует дату в строку, а также добавляет порядковый номер даты.Вы можете изменить формат даты, изменив NSDateFormatter object

-(NSString*) getOrdinalDateString:(NSDate*)date
{
    NSString* string=@"";
    NSDateComponents *components = [[NSCalendar currentCalendar] components: NSCalendarUnitDay fromDate:date];

    if(components.day == 1 || components.day == 21 || components.day == 31)
        string = @"st";

    else if (components.day == 2 || components.day == 22)
        string = @"nd";

    else if (components.day == 3 || components.day == 23)
        string = @"rd";

    else
        string = @"th";


    NSDateFormatter *dateFormatte = [[NSDateFormatter alloc] init];
    [dateFormatte setFormatterBehavior:NSDateFormatterBehavior10_4];
    [dateFormatte setDateFormat:[NSString stringWithFormat:@"d'%@' MMMM yyyy",string]];

    NSString *dateString = [dateFormatte stringFromDate:date];
    return dateString;
}
2 голосов
/ 28 августа 2017

Для этого есть простое решение

let formatter = NumberFormatter()
formatter.numberStyle = .ordinal
let first = formatter.string(from: 1) // 1st
let second = formatter.string(from: 2) // 2nd

Ссылка: hackingwithswift.com

0 голосов
/ 19 апреля 2019

Вы можете попробовать это, Это очень упрощенно.

function numberToOrdinal(n) {

  if (n==0) {
    return n;
   }
   var j = n % 10,
       k = n % 100;


   if (j == 1 && k != 11) {
       return n + "st";
   }
   if (j == 2 && k != 12) {
       return n + "nd";
   }
   if (j == 3 && k != 13) {
       return n + "rd";
   }
   return n + "th";
}
0 голосов
/ 03 февраля 2014

Это была моя грубая попытка получить NSString * представление даты и вернуть порядковое значение.Я чувствую, что намного легче читать.

NSDictionary *ordinalDates = @{
    @"1": @"1st",
    @"2": @"2nd",
    @"3": @"3rd",
    @"4": @"4th",
    @"5": @"5th",
    @"6": @"6th",
    @"7": @"7th",
    @"8": @"8th",
    @"9": @"9th",
    @"10": @"10th",
    @"11": @"11th",
    @"12": @"12th",
    @"13": @"13th",
    @"14": @"14th",
    @"15": @"15th",
    @"16": @"16th",
    @"17": @"17th",
    @"18": @"18th",
    @"19": @"19th",
    @"20": @"20th",
    @"21": @"21st",
    @"22": @"22nd",
    @"23": @"23rd",
    @"24": @"24th",
    @"25": @"25th",
    @"26": @"26th",
    @"27": @"27th",
    @"28": @"28th",
    @"29": @"29th",
    @"30": @"30th",
    @"31": @"31st" };
0 голосов
/ 05 мая 2017
- (NSString *) formatOrdinalNumber:(NSInteger )number{
    NSString *result = nil;
    //0 remains just 0
    if (number == 0) {
        result = @"0";
    }

    //test for number between 3 and 21 as they follow a
    //slightly different rule and all end with th
    else if (number > 3 && number < 21)
    {
        result = [NSString stringWithFormat:@"%ld th",(long)number];
    }
    else {
        //return the last digit of the number e.g. 102 is 2
        NSInteger lastdigit = number % 10;
        switch (lastdigit)
        {
            case 1: result = [NSString stringWithFormat:@"%ld st",(long)number]; break;
            case 2: result = [NSString stringWithFormat:@"%ld nd",(long)number]; break;
            case 3: result = [NSString stringWithFormat:@"%ld rd",(long)number]; break;
            default: result = [NSString stringWithFormat:@"%ld th",(long)number];
        }
    }
    return result;
}
0 голосов
/ 18 ноября 2014

Вот решение Swift, которое циклически переключается на предпочитаемые пользователем языки, пока не находит решение с известными правилами (которые довольно легко добавить) для порядковых чисел:

extension Int {
    var localizedOrdinal: String {

        func ordinalSuffix(int: Int) -> String {
            for language in NSLocale.preferredLanguages() as [String] {
                switch language {
                case let l where l.hasPrefix("it"):
                    return "°"
                case let l where l.hasPrefix("en"):
                    switch int {
                    case let x where x != 11 && x % 10 == 1:
                        return "st"
                    case let x where x != 12 && x % 10 == 2:
                        return "nd"
                    case let x where x != 13 && x % 10 == 3:
                        return "rd"
                    default:
                        return "st"
                    }
                default:
                    break
                }
            }
            return ""
        }

        return "\(self)" + ordinalSuffix(self)
    }
}
0 голосов
/ 13 сентября 2016

Вот краткое расширение Int для английского языка, которое также учитывает и правильно отображает отрицательные целые числа:

extension Int {
    func ordinal() -> String {
        let suffix: String!
        // treat negative numbers as positive for suffix
        let number = (self < 0 ? self * -1 : self)

        switch number % 10 {
        case 0:
            suffix = self != 0 ? "th" : ""
        case 1:
            suffix = "st"
        case 2:
            suffix = "nd"
        case 3:
            suffix = "rd"
        default:
            suffix = "th"
        }

        return String(self) + suffix
    }
}
0 голосов
/ 20 августа 2015

Многие из решений здесь не обрабатывают более высокие числа, такие как 112. Вот простой способ сделать это.

for(int i=0;i<1000;i++){
    int n = i;
    NSString* ordinal = @"th";
    if(n%10==1 && n%100!=11) ordinal = @"st";
    if(n%10==2 && n%100!=12) ordinal = @"nd";
    if(n%10==3 && n%100!=13) ordinal = @"rd";
    NSLog(@"You are the %d%@",i,ordinal);
}
...