Objective-C 中有没有办法把一个数字拼出来?

Posted

技术标签:

【中文标题】Objective-C 中有没有办法把一个数字拼出来?【英文标题】:Is there a way in Objective-C to take a number and spell it out? 【发布时间】:2011-07-16 09:45:52 【问题描述】:

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

我正在寻找一种方法来获得一个拼写出来的数字它的序数后缀(五或二百七)。

【问题讨论】:

查看 karoly-nyisztor 的答案。这是正确的,应该被接受。 【参考方案1】:

更新:今天遇到this answer,建议在MIT-License下使用this 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];

这个数字是“四十秒”。 希望对你有帮助。

【讨论】:

每天学习新东西。 如果你需要用其他语言拼写出来,那就更复杂了。 NSNumberFormatter (CFNumberFormatter) 内部使用 ICU4C 库,ICU 已经可以拼出序数。但是,它不会通过NSNumberFormatter API 公开。你可以看看我的 pod - github.com/dimat/DMNumberSpellOutFormatter【参考方案2】:

这应该被接受为正确答案。 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 等等。

【讨论】:

如果您查看我的getSpelledOutNumber: 方法,这个答案实际上已经包含在我的答案中。事情是。问题是如何生成仅此代码无法生成的普通数字,这就是我提出“不稳定的解决方法”的原因。 NSNumberFormatterOrdinalStyle 也很棒。【参考方案3】:

我曾经写过一个叫 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 

它目前适用于比 1e306 小 1 的数字,这是我在网上找到的此类数字的名称。

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

【讨论】:

谢谢,但我会使用 NSNumberFormatter 方法。

以上是关于Objective-C 中有没有办法把一个数字拼出来?的主要内容,如果未能解决你的问题,请参考以下文章

sql 在SQL中拼出数字值

在 Objective-C 中有没有办法获取方法调用的方法列表?

Objective-C 有没有办法判断一个对象是不是设置为自动释放?

2021-12-31:给定一个arr,里面的数字都是0~9, 你可以随意使用arr中的数字,哪怕打乱顺序也行, 请拼出一个能被3整除的,最大的数字,用str形式返回。 来自去哪儿网。

Objective-C++:有没有办法出售 C++ 对象?

Objective-C:如何格式化浮点值以仅显示小数,没有完整数字或小数点?