[FIXED] NSNumberFormatter und ‘th’ ‘st’ ‘nd’ ‘rd’ (ordinale) Zahlenenden

Ausgabe

Gibt es eine Möglichkeit, NSNumberFormatter zu verwenden, um die ‘th’ ‘st’ ‘nd’ ‘rd’-Nummernenden zu erhalten?

BEARBEITEN:

Scheint nicht zu existieren. Hier ist, was ich verwende.

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

Angepasst von nickfs Antwort hier
Gibt es in .NET eine einfache Möglichkeit, die Endungen “st”, “nd”, “rd” und “th” für Zahlen zu erhalten?

Lösung

Da die Frage nach einem Zahlenformatierer gestellt wurde, habe ich hier einen groben gemacht.

//
//  OrdinalNumberFormatter.h
//

#import <Foundation/Foundation.h>


@interface OrdinalNumberFormatter : NSNumberFormatter {

}

@end

und die Umsetzung:

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

Instanziieren Sie dies als ein Interface Builder-Objekt und hängen Sie das Formatter-Outlet des Textfelds daran an. Für eine feinere Steuerung (z. B. das Festlegen von Höchst- und Mindestwerten) sollten Sie eine Instanz des Formatierers erstellen, die Eigenschaften nach Wunsch festlegen und sie mit ihrer setFormatter:Methode an das Textfeld anhängen.

Sie können die Klasse von GitHub herunterladen (einschließlich eines Beispielprojekts).


Beantwortet von –
Abizern


Antwort geprüft von –
Marilyn (FixError Volunteer)

0 Shares:
Leave a Reply

Your email address will not be published. Required fields are marked *

You May Also Like