有没有一种方法可以使用NSNumberFormatter来获取"th""st""nd""rd"数字的结尾?

编辑:

看起来它不存在.这是我用的.

+(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的回答

推荐答案

因为这个问题需要一个数字格式化程序,所以我做了一个粗略的问题.

//
//  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对象,并将文本字段的格式化程序出口附加到该对象.对于更精细的控制(例如设置最大值和最小值),您应该创建格式化程序的实例,根据需要设置属性,并使用it's setFormatter:方法将其附加到文本字段.

您可以 Select download the class from GitHub(包括一个示例项目)

Objective-c相关问答推荐

错误无法使 UICollectionElementKindCell 类型的视图出列

NSError 和 __autoreleasing

具有动态高度的子视图的自动布局 UIScrollView

表达式不可分配 - 将浮点数分配为 Xcode 中其他两个浮点数的总和时出现问题?

在我的 UIImageView 的子类中没有调用 drawRect

目标 C:在不离开应用程序的情况下发送Electron邮件

是否需要 ARC 中的 NSNotificationCenter removeObserver?

NSFileManager 唯一的文件名

判断对象是 NSArray 还是 NSDictionary

实现 -hash / -isEqual: / -isEqualTo...: 用于 Objective-C 集合

奇怪的错误 NSAssert

alloc 和 allocWithZone: 有什么区别?

NSManagedObjectContext:异常断点在 save: 方法处停止,但没有日志(log)/崩溃/错误

Objective-C:前向类声明

遍历 NSString 中所有字符的最有效方法

无法将 searchBar 设置为 firstResponder

判断文件是否存在于路径中

如何在 Cocoa 中获取当前日期

UICollectionView:如何检测滚动何时停止

在 iOS 8 中使用 NSMutableAttributedString 的字符串的下划线部分不起作用