2009-11-17 9 views

Respuesta

23

he descubierto recientemente esta sola línea:

[@1234567 descriptionWithLocale:[NSLocale currentLocale]]; // 1,234,567 

O en Swift 2:

1234567.descriptionWithLocale(NSLocale.currentLocale())  // 1,234,567 

Swift 3/4:

(1234567 as NSNumber).description(withLocale: Locale.current) 

formateado por la pregunta:

[@(n) descriptionWithLocale:[NSLocale currentLocale]]; 

con formato sin literales de Objective-C:

[[NSNumber numberWithInt:n] descriptionWithLocale:[NSLocale currentLocale]]; 

Esta es la solución que estaba buscando cuando hice la pregunta. Disponible a partir de iOS 2.0 y OS X 10.0, documentada para devolver una cadena de versión del número formateado según la configuración regional prevista.stringValue incluso está documentado para utilizar este método pero al pasar nil.

Dado que es mi pregunta y esto se ajusta mejor a mi respuesta, estoy tentado de cambiar el tic, pero parece cruel. Actualización He cambiado la marca, esta respuesta es la respuesta.

0

Utilice un NSNumberFormatter.

+0

Así que la forma más fácil de hacerlo es '[NSString stringWithFormat: @"% d doodads ", [[[NSNumberFormatter alloc] autorelease] stringFromNumber: n]]];'? Como eso es más detallado de lo que esperaba. – mxcl

+0

Max Howell: Normalmente, mantendría el formateador de números en una variable de instancia (que puede hacer una salida para mantener el formateador en una punta), lo que hace que la expresión simplemente '[myFormatter stringFromNumber: [NSNumber numberWithInt: n] ] '. (Además, generalmente debe usar 'NSInteger' y' numberWithInteger: ', not' int' y 'numberWithInt:', para aprovechar el mayor alcance en máquinas de 64 bits). –

+0

No puedo hacer que esto funcione. Incluso usando setHasThousandSeparators: YES no cambia nada, no hay miles de separadores. – mxcl

50

Para esto funciona 10.6:

NSNumberFormatter* numberFormatter = [[NSNumberFormatter alloc] init]; 
[numberFormatter setFormatterBehavior: NSNumberFormatterBehavior10_4]; 
[numberFormatter setNumberStyle: NSNumberFormatterDecimalStyle]; 
NSString *numberString = [numberFormatter stringFromNumber: [NSNumber numberWithInteger: i]]; 

y maneja adecuadamente la localización.

+1

+1 Esto debe seleccionarse responder como en la respuesta seleccionada, no hay un método setFOrmat disponible. –

+0

Apple dice que 'NSNumberFormatter' definitivamente tiene un método' setFormat'. Lo aceptaría de preferencia, pero no lo he probado. Estoy seguro de que es mejor sin embargo. – mxcl

25

La continuación no se ocupa de la configuración regional, pero es una manera mejor (en mi opinión) de establecer el separador de miles en el formateador de número.

NSNumberFormatter *numberFormat = [[[NSNumberFormatter alloc] init] autorelease]; 
numberFormat.usesGroupingSeparator = YES; 
numberFormat.groupingSeparator = @","; 
numberFormat.groupingSize = 3; 
+1

Agradable si funciona, pero esto es estrictamente formato en inglés, no la configuración predeterminada de la máquina. – mxcl

+0

Puede establecer la propiedad de configuración regional en NSNumberFormatter – bandejapaisa

+1

Pero establece explícitamente el separador de agrupación en una coma. Esto no es cierto en muchos lugares. Además, el tamaño de la agrupación no es tres en todas las configuraciones regionales. – mxcl

1

Todd Ransom respondió perfectamente a esto.

me gustaría añadir (en un comentario separado, por lo que puedo mostrar algo de código con un formato agradable), que si va a hacer esto regularmente, vale la pena crear una clase de ayuda NSString.

Por lo tanto, crear tú mismo un NSStringHelper.h que contiene lo siguiente:

#import <Foundation/Foundation.h> 

@interface NSString (NSStringHelper) 

+(NSString*)formatWithThousandSeparator:(NSInteger)number; 

@end 

..y un archivo que contiene este NSStringHelper.m:

#import "NSStringHelper.h" 

@implementation NSString (NSStringHelper) 

+(NSString*)formatWithThousandSeparator:(NSInteger)number 
{ 
    // Format a number with thousand seperators, eg: "12,345" 
    NSNumberFormatter* numberFormatter = [[NSNumberFormatter alloc] init]; 
    [numberFormatter setFormatterBehavior: NSNumberFormatterBehavior10_4]; 
    [numberFormatter setNumberStyle: NSNumberFormatterDecimalStyle]; 
    NSString *result = [numberFormatter stringFromNumber:[NSNumber numberWithInteger:number]]; 
    return result; 
} 

@end 

Esto le da la forma perfecta para reutilizar el código en proyectos futuros

#import "NSStringHelper.h" 

NSInteger numOfUsers = 12345; 
NSString* strNumberOfUsers = [NSString formatWithThousandSeparator:numOfUsers]; 

fresco, ey?

Nuevamente, me disculpo por reenviar la respuesta de Todd (que era exactamente lo que estaba buscando), pero esta es una gran manera de resolver el problema y tenerlo listo para ser utilizado en sus futuros proyectos XCode.

Cuestiones relacionadas