Существует ли способ использовать 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" окончаний для чисел?
Поскольку в вопросе просили форматер чисел, вот грубый форматер, который я сделал.
//
// 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 (включая пример проекта)
В следующем примере показано, как обрабатывать любое число. Он написан на C #, но может быть легко преобразован на любой язык.
Я не знаю о такой возможности. Однако это можно сделать самостоятельно. В английском языке порядковый номер (th, st, nd, rd, etc) имеет очень простую схему:
Если номер заканчивается на: => Use:
Это не поможет вам написать слово, но позволит вам сделать что-то вроде: "42-й", "1,340,697-й" и т.д.
Это становится сложнее, если вам нужно локализовать слово.