How to format a number using NSNumberFormatter in DecimalSyle or ScientificStyle depending on length?

I need to format a number with NSNumberFormatter. If the number is small (for example, 0.000001), it will be displayed in decimal format, 0.000001. If the number is large, many decimal or integer (for example, 1211345456 o 0.000000011111553242), will be displayed in scientific notation, 1.211 E9.

I have this code (very bad), but it’s not enough for me: (I think the solution will be in -setPositiveFormat and templates of the formats #, ## 0.0000000 and 0. ### E + 0, any idea? Thanks!

NSNumberFormatter *formato = [[NSNumberFormatter alloc] init]; [formato setNumberStyle:NSNumberFormatterDecimalStyle]; [formato setPositiveFormat:@"#,##0.0000000"]; [formato setNegativeFormat:@"-#,##0.0000000"]; [formato setMaximumFractionDigits:7]; [formato setMinimumFractionDigits:0]; [formato setRoundingMode: NSNumberFormatterRoundHalfDown]; NSString *numero = [formato stringFromNumber:[NSNumber numberWithDouble:valor]]; //si vale después de formatear y el valor inicial es distinto de 0 se va de rango, //por lo tanto usamos notación científica if([numero isEqualToString:@"0"] && valor != 0){ //inicializamos el objeto de nuevo para que no de problemas con setPositiveFormat [formato release]; formato = [[NSNumberFormatter alloc] init]; [formato setNumberStyle:NSNumberFormatterScientificStyle]; [formato setMaximumFractionDigits:4]; [formato setRoundingMode: NSNumberFormatterRoundHalfDown]; [formato setExponentSymbol:@"e"]; numero = [formato stringFromNumber:[NSNumber numberWithDouble:valor]] ; } [formato release]; 
+4
source share
2 answers

You can simply check the number before publishing it and change the number depending on its size:

 if (fabs(number)>10e7 || fabs(number)<10e-7) { [self.formatter setNumberStyle:NSNumberFormatterScientificStyle]; } else [self.formatter setNumberStyle:NSNumberFormatterDecimalStyle]; 
+3
source

Below code works for me ..

 - (NSString *)checkAndConvertNumberFormat:(NSString *)numString { NSRange range = [numString rangeOfString:@" "]; NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init]; [formatter setFormatterBehavior:NSNumberFormatterBehavior10_4]; [formatter setNumberStyle:NSNumberFormatterDecimalStyle]; [formatter setPositiveFormat:@"#,##0.0000000"]; [formatter setNegativeFormat:@"-#,##0.0000000"]; [formatter setMaximumFractionDigits:7]; [formatter setMinimumFractionDigits:0]; [formatter setRoundingMode: NSNumberFormatterRoundHalfDown]; NSNumber *numberFromString; if (range.location == NSNotFound) { range = [numString rangeOfString:@","]; if (([numString length]-range.location) == DECIMAL_POSITION) { NSLog(@"Comma notation"); [formatter setGroupingSeparator:@"."]; [formatter setDecimalSeparator:@","]; } NSLog(@"%d", [numString length]-range.location); range = [numString rangeOfString:@"."]; if (([numString length]-range.location) == DECIMAL_POSITION) { NSLog(@"Dot notation"); [formatter setGroupingSeparator:@","]; [formatter setDecimalSeparator:@"."]; numberFromString = [formatter numberFromString:numString]; } NSLog(@"%d", [numString length]-range.location); } else { NSLog(@"Space Notation"); [formatter setGroupingSeparator:@" "]; [formatter setDecimalSeparator:@","]; numberFromString = [formatter numberFromString:numString]; } numberFromString = [formatter numberFromString:numString]; [formatter setGroupingSeparator:@""]; // Whatever you want here [formatter setDecimalSeparator:@"."]; // Whatever you want here return [formatter stringFromNumber:numberFromString]; } 
0
source

All Articles