Как отформатировать число с NSNumberFormatter в DecimalSyle или ScientificStyle в зависимости от длины? - PullRequest
4 голосов
/ 04 мая 2011

Мне нужно отформатировать число с NSNumberFormatter. Если число маленькое (например, 0,000001) будет отображаться в десятичном формате, 0,000001. Если число большое, многие десятичные или целые числа (например, 1211345456 o 0,000000011111553242) будут отображаться в научной записи, 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];

Ответы [ 2 ]

3 голосов
/ 24 марта 2012

Вы можете просто проверить номер перед публикацией и изменить номер в зависимости от его размера:

if (fabs(number)>10e7 || fabs(number)<10e-7) {
    [self.formatter setNumberStyle:NSNumberFormatterScientificStyle]; 
}
else
    [self.formatter setNumberStyle:NSNumberFormatterDecimalStyle];
0 голосов
/ 11 декабря 2013

Ниже код работает на меня ..

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