objective c - son - Objective-C: formato de números a ordinales: 1, 2, 3,.. a 1º, 2º, 3º
número ordinal teoría de conjuntos (4)
¿Has echado un vistazo a TTTOrdinalNumberFormatter
que está en FormatterKit
? Funciona muy bien, y estoy bastante seguro de que es exactamente lo que estás buscando.
Aquí hay un ejemplo tomado del kit:
TTTOrdinalNumberFormatter *ordinalNumberFormatter = [[TTTOrdinalNumberFormatter alloc] init];
[ordinalNumberFormatter setLocale:[NSLocale currentLocale]];
[ordinalNumberFormatter setGrammaticalGender:TTTOrdinalNumberFormatterMaleGender];
NSNumber *number = [NSNumber numberWithInteger:2];
NSLog(@"%@", [NSString stringWithFormat:NSLocalizedString(@"You came in %@ place!", nil), [ordinalNumberFormatter stringFromNumber:number]]);
Suponiendo que haya proporcionado cadenas localizadas para "¡Entró en% @ place!", La salida sería:
* English: "You came in 2nd place!"
* French: "Vous êtes venu à la 2eme place!"
* Spanish: "Usted llegó en 2.o lugar!"
En el Objetivo C, ¿hay alguna forma de formatear un integer
a los ordinales 1 => "1st", 2 => "2nd" etc ... que funciona para cualquier idioma ? Así que si el usuario es francés verá "1er", "2ieme", etc.
¡Muchas gracias!
Edición : esto es para una aplicación iOs
La solución está disponible de inmediato en NSNumberFormatter:
- (NSString *)getOrdinalStringFromInteger:(NSInteger)integer
{
NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init];
[formatter setLocale:[NSLocale currentLocale]];
[formatter setNumberStyle:NSNumberFormatterOrdinalStyle];
return [formatter stringFromNumber:[NSNumber numberWithInteger:integer]];
}
Necesita un conjunto de reglas para cada idioma que desee admitir. Cualquier lenguaje es pedir demasiado: todos ellos son muy diferentes. Primero, cree una clase de conjunto de reglas que contenga los casos regulares y de excepción para un idioma determinado. Esa clase necesita un solo método que tome un número y devuelva un sufijo de cadena (o el número más el sufijo). Cree instancias de conjuntos de reglas (estáticamente) para cada idioma que le interesa.
Luego cree una categoría en NSNumber
que devuelva un sufijo extraído del conjunto de reglas apropiado para el idioma que necesite el usuario (configuración regional del sistema o alguna elección que haga, o caso por caso).
Cada idioma tiene reglas diferentes, por supuesto. Por ejemplo, el inglés es relativamente complicado: 1º, 2º, 3º, 4º, 4º, 5º,… 20º y luego vuelve a comenzar en el segundo, segundo, tercero, quinto… Las unidades 1, 2, 3 y 4 siempre son casos especiales . Cero es ''th'' (cero, centésimo, millonésimo, etc.)
El francés es diferente. 1er, entonces es x ième todo el camino. (Estos usualmente están abreviados a solo ''re'' y ''e'', lo que hace que el francés sea bastante fácil).
Los japoneses se ponen muy raros. Cardenal 1, 2, 3, 4: (ichi, ni, san, yon) se convierte en tsuichi, futsuka, mikka y yokka. Sin embargo, esos no son sufijos: los números se nombran de manera diferente cuando se usan como ordinales. Afortunadamente, porque eso es increíblemente confuso, puedes pegar un kanji "kai" (que parece un cuadro en una caja) después del número y todos saben lo que quieres decir.
Podría usar la UCI, que incluye una forma de hacer lo que describe:
http://icu-project.org/apiref/icu4c/classRuleBasedNumberFormat.html
No dices en qué contexto estás usando Objective-C, pero si estás escribiendo para Cocoa, la UCI está realmente presente. Sin embargo, llegar a hablar directamente puede ser un poco complicado.
[editado para vincular a alguien que realmente parece haber descubierto cómo construir UCI y vincularlo]
¿Cómo construir una UCI para poder usarla en una aplicación de iPhone?