Objective-C中有一种方法可以取一个数字并拼出来吗?

Tec*_*Cat 6 numbers objective-c

我正在寻找一种方法来取一个数字(比如5或207),拼出来,并将其序数形式作为一个字符串(五或二百七)返回.我所能找到的只是代码,它接受一个数字并返回它的序数后缀(st,nd,rd,th)和英语语法指南的部分,说你应该拼写出序数.

我正在寻找一种方法来获得有序数后缀(第五或第二百零七)的拼写数字.

evo*_*pid 10

更新:我今天遇到了这个答案,建议在MIT-License下使用他的库,这也支持其他一些语言.希望这有助于某人.

旧答案:
我编写了一个可以这样的脚本,但只有英文版:

- (NSString*)getSpelledOutNumber:(NSInteger)num
{
    NSNumber *yourNumber = [NSNumber numberWithInt:(int)num];
    NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init];
    [formatter setNumberStyle:NSNumberFormatterSpellOutStyle];
    [formatter setLocale:[[NSLocale alloc] initWithLocaleIdentifier:@"en"]];
    return [formatter stringFromNumber:yourNumber];
}

- (NSString*)removeLastCharOfString:(NSString*)aString
{
    return [aString substringToIndex:[aString length]-1];
}

- (NSString*)getSpelledOutOrdinalNumber:(NSInteger)num
{    
    NSString *spelledOutNumber = [self getSpelledOutNumber:num];

    // replace all '-'
    spelledOutNumber = [spelledOutNumber stringByReplacingOccurrencesOfString:@"-"
                                                                   withString:@" "];

    NSArray *numberParts = [spelledOutNumber componentsSeparatedByString:@" "];

    NSMutableString *output = [NSMutableString string];

    NSUInteger numberOfParts = [numberParts count];
    for (int i=0; i<numberOfParts; i++) {
        NSString *numberPart = [numberParts objectAtIndex:i];

        if ([numberPart isEqualToString:@"one"])
            [output appendString:@"first"];
        else if([numberPart isEqualToString:@"two"])
            [output appendString:@"second"];
        else if([numberPart isEqualToString:@"three"])
            [output appendString:@"third"];
        else if([numberPart isEqualToString:@"five"])
            [output appendString:@"fifth"];
        else {
            NSUInteger characterCount = [numberPart length];
            unichar lastChar = [numberPart characterAtIndex:characterCount-1];
            if (lastChar == 'y')
            {
                // check if it is the last word
                if (numberOfParts-1 == i)
                { // it is
                    [output appendString:[NSString stringWithFormat:@"%@ieth ", [self removeLastCharOfString:numberPart]]];
                }
                else
                { // it isn't
                    [output appendString:[NSString stringWithFormat:@"%@-", numberPart]];
                }
            }
            else if (lastChar == 't' || lastChar == 'e')
            {
                [output appendString:[NSString stringWithFormat:@"%@th-", [self removeLastCharOfString:numberPart]]];
            }
            else
            {
                [output appendString:[NSString stringWithFormat:@"%@th ", numberPart]];
            }
        }
    }

    // eventually remove last char
    unichar lastChar = [output characterAtIndex:[output length]-1];
    if (lastChar == '-' || lastChar == ' ')
        return [self removeLastCharOfString:output];
    else
        return output;
}
Run Code Online (Sandbox Code Playgroud)

用法非常简单:

NSString *ordinalNumber = [self getSpelledOutOrdinalNumber:42];
Run Code Online (Sandbox Code Playgroud)

这个数字将是"四十二秒".我希望能帮助你.


Kar*_*tor 5

这应该被接受为正确的答案.NSNumberFormatter将完成这项工作,这是一种标准方法,而不是一些不稳定的解决方法.

这是一个例子:

NSNumberFormatter* numberFormatter = [[NSNumberFormatter alloc] init];
[numberFormatter setNumberStyle:NSNumberFormatterSpellOutStyle];
NSString* stringFromNumber = [numberFormatter stringFromNumber:your_number_goes_here];
NSLog( @"%@", stringFromNumber );
Run Code Online (Sandbox Code Playgroud)

它将输出'one'为1'2'为2等.此外,它也适用于非英语语言环境.例如,如果您将数字格式化程序区域设置更改为德语:

numberFormatter.locale = [NSLocale localeWithLocaleIdentifier:@"DE"];
Run Code Online (Sandbox Code Playgroud)

上面的代码将打印:'eins'表示1'zwei'为2,依此类推.