6

Objective-C/Cocoaで、スペルアウトされた単語をNSNumber複数の言語でまたは同等のものに変換する方法はありますか?

例えば:

convert threeto3または convert ochoto 8(スペイン語)。

こちらも若干異なりますが3 1/23.5

これを行う独自のコードを作成することもできましたが、これを行う組み込みの方法があることを望んでいました。すべての数字を複数の言語に翻訳することは避けたいと思います。

4

2 に答える 2

13

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"]);

処理できるものに関して深刻な制限があります (想定される形式 (たとえば、"thirty-four" ではなく "thirty four")、分数などから逸脱した場合、言語を自動検出しません)。狭いドメインでは、仕事をしているようです。

于 2013-03-28T21:08:38.173 に答える
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);
        }];
}

これにより、分数分解などをいつ、どのように行うかを特定する作業が残ります。

于 2013-03-28T20:54:58.633 に答える