将拼写的数字转换为数字

时间:2013-03-28 19:55:31

标签: ios objective-c cocoa localization numbers

在Objective-C / Cocoa中,有没有办法将拼写出的单词转换成NSNumber或多种语言的同等单词?<​​/ p>

例如:

three转换为3或将ocho转换为8(西班牙语)。

也略有不同,但3 1/23.5

我可以编写自己的代码来执行此操作,但我希望有一种内置的方法来执行此操作。我希望避免使用多种语言翻译每个数字的翻译。

2 个答案:

答案 0 :(得分:12)

NSNumberFormatter可以从文字转换为数字:

NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init];
formatter.numberStyle = NSNumberFormatterSpellOutStyle;

NSLog(@"%@", [formatter numberFromString:@"thirty-four"]);
NSLog(@"%@", [formatter numberFromString:@"three point five"]);

formatter.locale = [[NSLocale alloc]initWithLocaleIdentifier:[NSLocale localeIdentifierFromComponents:@{NSLocaleLanguageCode: @"es"}]];

NSLog(@"%@", [formatter numberFromString:@"ocho"]);

它可以处理的内容存在严重的限制(如果你偏离预期的格式(例如“三十四”而不是“三十四”),它不会自动检测语言,分数等),但对于狭窄的领域,它似乎可以完成这项工作。

答案 1 :(得分:2)

NSLinguisticTagger会以多种语言为您标记数字。

NSArray * texts = @[@"It's 3 degrees outside", @"Ocho tacos", @"What is 3 1/2?", @"ocho"];
for (NSString * text in texts)
{
    NSLinguisticTaggerOptions options = NSLinguisticTaggerOmitWhitespace | NSLinguisticTaggerJoinNames;
    NSArray * tagSchemes = [NSLinguisticTagger availableTagSchemesForLanguage:@"en"];
    tagSchemes = [tagSchemes arrayByAddingObjectsFromArray:[NSLinguisticTagger availableTagSchemesForLanguage:@"es"]];

    NSLinguisticTagger * tagger = [[NSLinguisticTagger alloc] initWithTagSchemes:tagSchemes
                                                                                 options:options];
    [tagger setString:text];

    [tagger enumerateTagsInRange:NSMakeRange(0, [text length])
                          scheme:NSLinguisticTagSchemeNameTypeOrLexicalClass
                         options:options
                      usingBlock:^(NSString *tag, NSRange tokenRange, NSRange sentenceRange, BOOL *stop)
        {
            NSString *token = [text substringWithRange:tokenRange];
            NSLog(@"%@: %@", token, tag);
        }];
}

这确实使您无需确定如何以及何时执行分数分辨等操作。