2013-03-28 11 views
6

Gibt es in Objective-C/Cocoa eine Möglichkeit, buchstabierte Wörter in eine NSNumber oder gleichwertig in mehreren Sprachen zu konvertieren?Konvertieren Sie buchstabierte Zahl zu Nummer

Zum Beispiel:

convert three-3 oder konvertieren ocho zu 8 (Spanisch).

auch etwas anders, aber 3 1/2-3.5

Ich konnte meinen eigenen Code zu schreiben, dies zu tun, aber ich habe gehofft, es war eine eingebaute Möglichkeit, dies zu tun. Ich möchte die Übersetzungen jeder Zahl in mehreren Sprachen vermeiden.

+3

Betrachten Sie die Dokumentation für "natürliche Sprache" und "NSNumberFormatter" –

+0

@JoshuaNozzi Von dem, was ich gefunden habe, kann 'NSNumberFormatter' nur das Gegenteil tun. – edc1591

+0

Sie können ein NSDictionnary erstellen, das den Wert 1 für den Schlüssel "eins", 2 für "zwei" usw. hätte. Aber Sie müssen jede Nummer nacheinander schreiben - nicht ganz praktisch. – Moray

Antwort

12

NSNumberFormatter kann von Text in Zahlen konvertieren:

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

Es gibt ernsthafte Einschränkungen, was damit umgehen kann (es automatisch nicht Sprachen erkennen, wenn Sie von dem erwarteten Format abweichen (zB „vierunddreißig "statt" vierunddreißig "), Brüche usw.), aber für den engen Bereich scheint es die Aufgabe zu erfüllen.

+1

Super! Ich hatte keine Ahnung, dass 'NSNumberFormatter' das könnte. Vielen Dank! – edc1591

+0

diese Lösung funktioniert wie Magie. Könnten Sie jedoch erklären, warum ich für [formatter numberFromString: @ "three point eleven"] (null) bekomme, obwohl [formatter numberFromString: @ "three point one"] gut funktioniert? – static0886

+0

btw ich bekomme 3.11 für [formatter numberFromString: @ "Drei-Punkt-One One"], aber ich bekomme 101.3 für [formatter numberFromString: @ "ein Punkt drei"] – static0886

2

NSLinguisticTagger werden Kennzeichen für Sie in mehreren Sprachen kennzeichnen.

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

Dies lässt Sie mit der Aufgabe zu identifizieren, wie und wann Dinge wie Fraktion Auflösung zu tun.

Verwandte Themen