2011-05-04 23 views
4

我需要用NSNumberFormatter格式化一個數字。如果數字很小(例如0.000001)將以十進制格式顯示0.000001。如果數字很大,許多小數或整數(例如1211345456或0.000000011111553242)將以科學記數法1.211 E9顯示。我有這個代碼(很糟糕),但對我來說還不夠:(。我認爲解決方案將在-setPositiveFormat和格式模式#,## 0.0000000和0。### E + 0,任何想法?謝謝如何根據長度在DecimalSyle或ScientificStyle中使用NSNumberFormatter格式化數字?

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]; 
+0

請有任何答案! – Yonedev 2011-05-09 19:21:22

回答

3

你可以只考數您發佈之前,並根據其大小更改號碼:

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

下面的代碼爲我工作..

- (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]; 
} 
相關問題