user1163722
user1163722

Reputation:

Is there any method that can take "one" and return "1"?

I've looked at NSNumberFormatter, but that hasn't worked, so is there a way of parsing written numbers and turning them in to actual numbers?

Upvotes: 0

Views: 114

Answers (2)

jscs
jscs

Reputation: 64002

NSNumberFormatter will get you some of the way there, via NSNumberFormatterSpellOutStyle. The basic formatting that NSNumber does will finish it off.

NSNumberFormatter * nf = [[NSNumberFormatter alloc] init];
[nf setNumberStyle:NSNumberFormatterSpellOutStyle];
NSString * numberWordString = @"three one two";
NSMutableString * digitString = [[NSMutableString alloc] init];
// Break up the input string at spaces and iterate over the result
for(NSString * s in [numberWordString componentsSeparatedByString:@" "]){
    // Let the formatter turn each string into an NSNumber, then get
    // the stringValue from that, which will be a digit.
    [digitString appendString:[[nf numberFromString:s] stringValue]] ;
}        
NSLog(@"%@", digitString);    // prints "312"

Obviously, you'll have to put some work in to handle different input formats, lowercase, bad input (this will crash if nf fails to format -- it'll return nil which is an illegal argument to appendString:), etc.

Upvotes: 0

rdelmar
rdelmar

Reputation: 104082

Something like this would work (for positive whole numbers anyway). This is just a starting point, you would have to check to see that the words were correct and maybe ignore capitalization to make it more robust:

 [self parseNumberWords:@"five two three"];


-(NSInteger)parseNumberWords:(NSString *)input {
NSArray *wordArray = [NSArray arrayWithObjects:@"zero",@"one",@"two",@"three",@"four",@"five",@"six",@"seven",@"eight",@"nine", nil];
NSArray *words = [input componentsSeparatedByString:@" "];
NSInteger num = 0;
NSInteger j =0;
for (NSInteger i = [words count]; i>0 ;i--) {
    num = num + [wordArray indexOfObject:[words objectAtIndex:i-1]] * pow(10, j);
    j = j+1;
}
NSLog(@"%ld",num);
return num;

}

Upvotes: 1

Related Questions