NSNumberFormatter и 'th' 'Св.' 'без обозначения даты' 'ул.' (порядковые) окончания числа

Существует ли способ использовать NSNumberFormatter для получения 'th' 'Св.' 'без обозначения даты' окончания числа 'ул.'?

Править:

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

+(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];
}

Адаптированный из ответа nickf вот там простой способ в.NET для получения "Св.", "без обозначения даты", "ул." и "th" окончаний для чисел?

31
задан Leo Dabus 6 November 2017 в 05:08
поделиться

3 ответа

Поскольку в вопросе просили форматер чисел, вот грубый форматер, который я сделал.

//
//  OrdinalNumberFormatter.h
//

#import <Foundation/Foundation.h>


@interface OrdinalNumberFormatter : NSNumberFormatter {

}

@end

и реализация:

//
//  OrdinalNumberFormatter.m
//

#import "OrdinalNumberFormatter.h"


@implementation OrdinalNumberFormatter

- (BOOL)getObjectValue:(id *)anObject forString:(NSString *)string errorDescription:(NSString **)error {
    NSInteger integerNumber;
    NSScanner *scanner;
    BOOL isSuccessful = NO;
    NSCharacterSet *letters = [NSCharacterSet letterCharacterSet];

    scanner = [NSScanner scannerWithString:string];
    [scanner setCaseSensitive:NO];
    [scanner setCharactersToBeSkipped:letters];

    if ([scanner scanInteger:&integerNumber]){
        isSuccessful = YES;
        if (anObject) {
            *anObject = [NSNumber numberWithInteger:integerNumber];
        }
    } else {
        if (error) {
            *error = [NSString stringWithFormat:@"Unable to create number from %@", string];
        }
    }

    return isSuccessful;
}

- (NSString *)stringForObjectValue:(id)anObject {
    if (![anObject isKindOfClass:[NSNumber class]]) {
        return nil;
    }

    NSString *strRep = [anObject stringValue];
    NSString *lastDigit = [strRep substringFromIndex:([strRep length]-1)];

    NSString *ordinal;


    if ([strRep isEqualToString:@"11"] || [strRep isEqualToString:@"12"] || [strRep isEqualToString:@"13"]) {
        ordinal = @"th";
    } else if ([lastDigit isEqualToString:@"1"]) {
        ordinal = @"st";
    } else if ([lastDigit isEqualToString:@"2"]) {
        ordinal = @"nd";
    } else if ([lastDigit isEqualToString:@"3"]) {
        ordinal = @"rd";
    } else {
        ordinal = @"th";
    }

    return [NSString stringWithFormat:@"%@%@", strRep, ordinal];
}

@end

Инстанцируйте это как объект Interface Builder и присоедините к нему выход форматировщика текстового поля. Для более тонкого контроля (например, для установки максимальных и минимальных значений, вы должны создать экземпляр форматера, установить свойства по своему усмотрению и прикрепить его к текстовому полю с помощью метода setFormatter:.

Вы можете скачать класс с GitHub (включая пример проекта)

14
ответ дан 27 November 2019 в 21:23
поделиться

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

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

2
ответ дан 27 November 2019 в 21:23
поделиться

Я не знаю о такой возможности. Однако это можно сделать самостоятельно. В английском языке порядковый номер (th, st, nd, rd, etc) имеет очень простую схему:

Если номер заканчивается на: => 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-й" и т.д.

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

3
ответ дан 27 November 2019 в 21:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: