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

时间:2011-07-16 09:45:53

标签: objective-c numbers

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

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

4 个答案:

答案 0 :(得分:10)

更新:我今天遇到了this answer,建议在MIT-License下使用t his library,这也支持其他一些语言。希望这有助于某人。

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

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

用法非常简单:

NSString *ordinalNumber = [self getSpelledOutOrdinalNumber:42];

这个数字将是“四十二秒”。 我希望能帮助你。

答案 1 :(得分:5)

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

以下是一个例子:

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

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

numberFormatter.locale = [NSLocale localeWithLocaleIdentifier:@"DE"];

上面的代码将打印: 'eins'为1 'zwei'为2等等。

答案 2 :(得分:2)

我曾经写过一个名为vpi2english的工具。它是我的vpi toolbox的一部分,用matlab编写。但是代码非常简单,如果你愿意,可以转换成另一种语言。它基本上采用一个(十进制)数字字符串,一次将其分成三个数字,然后用文字写出。

>> vpi2english(vpi('2331546567543686356564321'))
ans =
   two septillion, three hundred thirty one sextillion,
five hundred forty six quintillion, five hundred sixty seven quadrillion,
five hundred forty three trillion, six hundred eighty six billion,
three hundred fifty six million, five hundred sixty four thousand,
three hundred twenty one 

它目前适用于大于1的小于1e306的数字,这与我在网上找到这些数字的名称一样大。

>> vpi2english(999999*vpi(10)^300)
ans =
nine hundred ninety nine centillion, nine hundred ninety nine novemnonagintillion

答案 3 :(得分:-6)

简短回答:

首先,这个任务不属于Objective-C作为编程语言。其次,结果应该取决于用户区域设置。