Iphone 如何使用NSNumberFormatter根据长度以小数或科学样式格式化数字?

Iphone 如何使用NSNumberFormatter根据长度以小数或科学样式格式化数字?,iphone,objective-c,nsnumberformatter,Iphone,Objective C,Nsnumberformatter,我需要使用NSNumberFormatter格式化一个数字。如果数字较小(例如0.000001),则将以十进制格式显示0.000001。如果数字较大,则许多十进制或整数(例如1211345456或0.0000000 11111 553242)将以科学记数法显示,1.211 E9 我有这样的代码(非常糟糕),但对我来说还不够:(.我想解决方案应该是-setPositiveFormat和格式模式、#0.0000000和0.##E+0,知道吗 NSNumberFormatter *formato =

我需要使用
NSNumberFormatter
格式化一个数字。如果数字较小(例如
0.000001
),则将以十进制格式显示
0.000001
。如果数字较大,则许多十进制或整数(例如
1211345456
0.0000000 11111 553242
)将以科学记数法显示,
1.211 E9

我有这样的代码(非常糟糕),但对我来说还不够:(.我想解决方案应该是
-setPositiveFormat
和格式模式
、#0.0000000
0.##E+0
,知道吗

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

您可以在发布之前测试数字,并根据其大小更改数字:

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

if(fabs(number)>10e7 | | fabs(number)下面的代码对我有用

- (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];
}