Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Convert spelled out number to number

Is there a way, in Objective-C/Cocoa, to convert spelled out words to an NSNumber or equivalent in multiple languages?

For example:

convert three to 3 or convert ocho to 8 (Spanish).

Also slightly different, but 3 1/2 to 3.5

I could write my own code to do this, but I was hoping there was a built-in way to do this. Getting the translations of every number in several languages is something I'd like to avoid.

like image 435
edc1591 Avatar asked Mar 28 '13 19:03

edc1591


People also ask

How do I convert numbers stored as text to numbers?

Use Paste Special and Multiply Select the cells that have numbers stored as text. On the Home tab, click Paste > Paste Special. Click Multiply, and then click OK. Excel multiplies each cell by 1, and in doing so, converts the text to numbers.

How do you convert digits to numbers?

Step 1 − Divide the decimal number to be converted by the value of the new base. Step 2 − Get the remainder from Step 1 as the rightmost digit (least significant digit) of new base number. Step 3 − Divide the quotient of the previous divide by the new base.

How to convert Spell number in excel?

Use the SpellNumber function in individual cells Type the formula =SpellNumber(A1) into the cell where you want to display a written number, where A1 is the cell containing the number you want to convert. You can also manually type the value like =SpellNumber(22.50). Press Enter to confirm the formula.

How do I convert a column to an entire number?

Select the entire column of cells you want to convert from text to numbers, right-click, and select Copy. 4. Select the first cell in the empty column you formatted, right-click the cell and select Paste Values. You'll see all of the text formatted numbers pasted in the General number format.


2 Answers

NSNumberFormatter can convert from text to numbers:

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

There are serious limitations as to what it can handle (it doesn't auto detect languages, if you deviate from the expected format (e.g. "thirty four" instead of "thirty-four"), fractions, etc.), but for the narrow domain, it appears to do the job.

like image 64
Rob Avatar answered Sep 28 '22 03:09

Rob


NSLinguisticTagger will flag numbers for you in multiple languages.

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

This does leave you with the task of identifying how and when to do things like fraction resolution.

like image 38
Fruity Geek Avatar answered Sep 28 '22 04:09

Fruity Geek