使用NSNumberFormatter格式化双精度数

时间:2014-03-08 03:26:37

标签: objective-c nsnumberformatter

我有以下情况需要帮助解决。我有一个双倍,可以超过15位数,没有小数或可以有小数但不超过15位数。 以下是我需要满足的条件:

  • 我需要双倍才能得到6位十进制数字。
  • 如果双倍超过包括小数的15位数,则应将其转换为具有6位精度的科学记数法。例如1.234567E10
  • 小于15位的数字应该有逗号。

e.g。如果该数字为123456.382,则应将其格式化为123,456.882

如果号码为12345678901234567,则应将其格式化为1.234567E16。如果它有小数,则应忽略它们。

尝试使用格式说明符%1.6g从double创建一个字符串。这适用于十进制数字,但一旦数字超过6位,例如100,000,它变成科学记数法。我怎样才能达到预期的效果?

编辑:科学记数法的类型无关紧要。即我不关心它是...E10还是...e+10

2 个答案:

答案 0 :(得分:1)

  

如果双倍超过15位,包括小数,则应该转   6位精度的科学记数法。

您的意思是总是6个小数位,但如果整数部分超过9位数,那么请使用科学记数法吗?如果是这样,那么这就是我的解决方案。

NSString *numberToString(NSNumber *number) {
    NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init];

    // If number has (15 - 6) or less integer digits
    if ([number integerValue] < 1E9) {
        [formatter setNumberStyle:NSNumberFormatterDecimalStyle];
        [formatter setUsesGroupingSeparator:YES];
    } else {
        [formatter setNumberStyle:NSNumberFormatterScientificStyle];
    }

    [formatter setMinimumFractionDigits:6];
    [formatter setMaximumFractionDigits:6];

    return [formatter stringFromNumber:number];
}

答案 1 :(得分:0)

我不确定这是否是最好的方法,但确实有效:

    if ([[num stringValue] rangeOfString:@"e"].location == NSNotFound) {
        formatter.numberStyle = NSNumberFormatterDecimalStyle;
        NSLog(@"%@", [formatter stringFromNumber:num]);
    } else {
        formatter.positiveFormat = @"0.000000E0";
        formatter.roundingMode = NSNumberFormatterRoundDown;
        NSLog(@"%@", [formatter stringFromNumber:num]);
    }

如果num = NSNumber *num = [NSNumber numberWithDouble:12345678901234567];

将返回:1.234567E16

如果num = NSNumber *num = [NSNumber numberWithDouble:123456.382];

将返回:123,456.382