I'm looking for a way to take a number (say 5 or 207), spell it out, and returns its ordinal form as a string (five or two hundred seven). All I could find was code that takes a number and returns its ordinal suffix (st, nd, rd, th) and the parts of English grammar guides that say you should spell out ordinals.
I'm looking for a way to get a spelled out number with its ordinal suffix (fifth or two hundred seventh).
Update: I came across this answer today, suggesting the use of the use of this library under the MIT-License which also supports a few other languages. Hope this helps someone.
Old Answer:
I coded a script which can this, but only in english:
- (NSString*)getSpelledOutNumber:(NSInteger)num
{
NSNumber *yourNumber = [NSNumber numberWithInt:(int)num];
NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init];
[formatter setNumberStyle:NSNumberFormatterSpellOutStyle];
[formatter setLocale:[[NSLocale alloc] initWithLocaleIdentifier:@"en"]];
return [formatter stringFromNumber:yourNumber];
}
- (NSString*)removeLastCharOfString:(NSString*)aString
{
return [aString substringToIndex:[aString length]-1];
}
- (NSString*)getSpelledOutOrdinalNumber:(NSInteger)num
{
NSString *spelledOutNumber = [self getSpelledOutNumber:num];
// replace all '-'
spelledOutNumber = [spelledOutNumber stringByReplacingOccurrencesOfString:@"-"
withString:@" "];
NSArray *numberParts = [spelledOutNumber componentsSeparatedByString:@" "];
NSMutableString *output = [NSMutableString string];
NSUInteger numberOfParts = [numberParts count];
for (int i=0; i<numberOfParts; i++) {
NSString *numberPart = [numberParts objectAtIndex:i];
if ([numberPart isEqualToString:@"one"])
[output appendString:@"first"];
else if([numberPart isEqualToString:@"two"])
[output appendString:@"second"];
else if([numberPart isEqualToString:@"three"])
[output appendString:@"third"];
else if([numberPart isEqualToString:@"five"])
[output appendString:@"fifth"];
else {
NSUInteger characterCount = [numberPart length];
unichar lastChar = [numberPart characterAtIndex:characterCount-1];
if (lastChar == 'y')
{
// check if it is the last word
if (numberOfParts-1 == i)
{ // it is
[output appendString:[NSString stringWithFormat:@"%@ieth ", [self removeLastCharOfString:numberPart]]];
}
else
{ // it isn't
[output appendString:[NSString stringWithFormat:@"%@-", numberPart]];
}
}
else if (lastChar == 't' || lastChar == 'e')
{
[output appendString:[NSString stringWithFormat:@"%@th-", [self removeLastCharOfString:numberPart]]];
}
else
{
[output appendString:[NSString stringWithFormat:@"%@th ", numberPart]];
}
}
}
// eventually remove last char
unichar lastChar = [output characterAtIndex:[output length]-1];
if (lastChar == '-' || lastChar == ' ')
return [self removeLastCharOfString:output];
else
return output;
}
The usage is pretty simple:
NSString *ordinalNumber = [self getSpelledOutOrdinalNumber:42];
The number would be 'forty-second'. I hope that helps you.
This should have been accepted as the correct answer. NSNumberFormatter will do the job, and it's a standard approach, not some shaky workaround.
Here is an example:
NSNumberFormatter* numberFormatter = [[NSNumberFormatter alloc] init];
[numberFormatter setNumberStyle:NSNumberFormatterSpellOutStyle];
NSString* stringFromNumber = [numberFormatter stringFromNumber:your_number_goes_here];
NSLog( @"%@", stringFromNumber );
It will output 'one' for 1 'two' for 2 etc. Besides, it works perfectly for nonEnglish locales as well. For example, if you change the number formatter locale to German:
numberFormatter.locale = [NSLocale localeWithLocaleIdentifier:@"DE"];
the code above will print: 'eins' for 1 'zwei' for 2 and so on.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With