2013-03-28 2 views
6

C'è un modo, in Objective-C/Cocoa, per convertire le parole enunciate in un NSNumber o equivalente in più lingue?Convertire il numero specificato in numero

Ad esempio:

convertito three-3 o convertire ocho per 8 (spagnolo).

anche un po 'diversa, ma 3 1/2-3.5

ho potuto scrivere il mio codice per fare questo, ma speravo ci fosse un modo integrato per effettuare questa operazione. Ottenere le traduzioni di ogni numero in più lingue è qualcosa che vorrei evitare.

+3

Considerare la ricerca della documentazione per "linguaggio naturale" e "NSNumberFormatter" –

+0

@JoshuaNozzi Da quello che ho trovato, 'NSNumberFormatter' può fare solo il contrario. – edc1591

+0

È possibile creare un NSDictionnary con il valore 1 per il tasto "uno", 2 per "due" e così via. Ma devi scrivere ogni numero uno dopo l'altro - non del tutto pratico. – Moray

risposta

12

NSNumberFormatter può convertire da testo a numeri:

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

Ci sono gravi limitazioni per quanto riguarda quello che può gestire (esso non rilevare automaticamente le lingue, se si devia dal formato previsto (ad esempio "trentaquattro "invece di" trentaquattro "), frazioni, ecc.), ma per il dominio ristretto, sembra fare il lavoro.

+1

Fantastico! Non avevo idea che 'NSNumberFormatter' potesse farlo. Grazie! – edc1591

+0

questa soluzione funziona come per magia. Tuttavia, potresti spiegare perché ottengo (null) per [formatter numberFromString: @ "three point undici"] anche se [formatter numberFromString: @ "three point one"] funziona bene? – static0886

+0

btw ottengo 3.11 per [formatter numberFromString: @ "three point one one"] ma ottengo 101.3 per [formatter numberFromString: @ "one one point three"] – static0886

2

NSLinguisticTagger contrassegnerà i numeri per voi in più lingue.

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

Questo ti lascia il compito di identificare come e quando fare cose come la risoluzione delle frazioni.