2012-03-23 11 views
6

Me gustaría hacerlo para que uno de mis UILabels solo muestre un máximo de 3 dígitos. Entonces, si el valor asociado es 3.224789, me gustaría ver 3.22. Si el valor es 12.563, me gustaría ver 12.5 y si el valor es 298.38912, me gustaría ver 298. He estado tratando de usar NSNumberFormatter para lograr esto, pero cuando establezco los dígitos significativos máximos en 3 siempre tiene 3 dígitos después del lugar decimal. Aquí está el código:NSNumberFormatter para mostrar un máximo de 3 dígitos

NSNumberFormatter *distanceFormatter = [[[NSNumberFormatter alloc] init] autorelease]; 
[distanceFormatter setNumberStyle:NSNumberFormatterDecimalStyle]; 
[distanceFormatter setAlwaysShowsDecimalSeparator:NO]; 
[distanceFormatter setMaximumSignificantDigits:3]; 

Siempre pensé '' dígitos significativos decir todos los dígitos, antes y después del punto decimal. De todos modos, ¿hay alguna manera de lograr esto usando NSNumberFormatter?

Gracias!

Respuesta

10

Creo que

NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init]; 
formatter.usesSignificantDigits = YES; 
formatter.maximumSignificantDigits = 3; 

hará exactamente lo que quiera, es decir, siempre mostrará exactamente 3 dígitos, ya sea 2 antes del decimal y 1 después o 1 antes del decimal y 2 después.

+1

Sí, esto funciona genial. Establecer el indicador 'usesSignificantDigits' en YES es la clave de esta solución para el OP. Acabo de usar esto, y de hecho funciona a través del punto decimal, por ejemplo, convierte $ 19.17 a $ 19.20. –

+0

por favor revise mi pregunta http://stackoverflow.com/questions/35112206/how-to-show-only-first-two-numbers-in-nsnumberformatter. No funciona para mí en Swift – Alexander

2

Heres una pequeña función que escribió:

int nDigits(double n) 
{ 
    n = fabs(n); 
    int nDigits = 0; 
    while (n > 1) { 
     n /= 10; 
     nDigits++; 
    } 

    return nDigits; 
} 

NSString *formatNumber(NSNumber *number, int sigFigures) 
{ 
    double num = [number doubleValue]; 
    int numDigits = nDigits(num); 

    NSString *format = [NSString stringWithFormat:@"%%%i.%ilf", sigFigures -= numDigits, sigFigures]; 

    return [NSString stringWithFormat:format, num]; 
} 

En mis pruebas, esto funcionó bien.

+0

Gracias por entender la pregunta. Hay una diferencia entre "dígitos significativos" y "cantidad de dígitos a la derecha del punto decimal". –

4

Tal vez también hay que establecer (no estoy seguro de que):

[distanceFormatter setUsesSignificantDigits: YES];

Pero en tu caso es probablemente mucho más fácil usar el formato de cadenas estándar:

CGFloat yourNumber = ...; 
NSString* stringValue = [NSString stringWithFormat: @"%.3f", yourNumber]; 

(nota : esto redondeará el último dígito)

Cuestiones relacionadas