5

有没有一种快速格式化数字的方法(例如,使用 appendFormat 时)以便只显示足够的小数位?例如,4.23100 显示为 4.231,而 5.0000 仅显示为 5。

谢谢阅读。

4

4 回答 4

4

使用 %g 而不是 %f

双 n = 1234.5678;

NSString str = [NSString stringWithFormat:@"number is %g", n];

于 2012-11-03T22:56:52.743 回答
3

以适当的精度使用 %g。

double number = 1234.123;

NSLog(@"Number equals: %.8g", number)

如此处所引用,除非指定了最大精度,否则 %g 转换将默认为 6 个有效数字。%.7g 或更大都会给出所需的浮点数。

于 2013-12-10T15:28:59.753 回答
0

起初我找不到执行此操作的内置方法,因此如果有人感兴趣,我构建了一个快速函数(如下)。也就是说,我相信 %g(感谢 MSgambel,Roger Gilbrat)和 NSNumberFormatter 类(感谢 Inafziger,David Nedrow)更简洁,所以它们可能是更好的选择!

+ (NSString *)trimmedFraction:(float)fraction{

    int i=0; 
    float numDiff=0; 

    // Loop through possible decimal values (in this case, maximum of 6)
    for (i=0;i<=6;i++){

        // Calculate difference between fraction and rounded fraction
        numDiff=round(fraction*pow(10,i))/pow(10,i)-fraction;

        // Check if difference is less than half of the smallest possible value
        if (fabsf(numDiff)<(0.5*pow(10,-6))){
            break;
        }
    }

    // Return string of truncated fraction
    NSString *stringPattern=[NSString stringWithFormat:@"%%0.%df",i];
    return [NSString stringWithFormat:stringPattern,fraction];
}

在代码中,您可以指定小数位的最大数量(例如,在这种情况下为 6)。然后你只需发送一个分数,它就会返回一个只有相关小数的字符串。例如,发送 4.231000 并返回 @"4.231",发送 5.000000 并返回 @"5"。(同样,最好只使用 %g 和 NSNumberWithFormatter)。

于 2012-11-04T12:59:00.110 回答
0

如果将原始值存储为字符串而不是浮点数,那么这个问题就很有意义了。

我使用以下类别处理此问题NSString

+ (NSString *) stringForNotANumber {
    static NSString *singleton;
    if (!singleton) singleton = @"NaN";
    return singleton;
}

- (NSUInteger) numberOfDecimalPlaces {
    NSString *strValue = self;

    // If nil, return -1
    if (!strValue) return -1;

    // If non-numeric, return -1
    NSNumberFormatter *f = [[NSNumberFormatter alloc] init];
    [f setMaximumFractionDigits:128];
    NSNumber *numValue = [f numberFromString:strValue];
    if (!numValue) return -1;

    // Count digits after decimal point in original input
    NSRange range = [strValue rangeOfString:@"."];
    if (NSNotFound == range.location) return 0;

    return [strValue substringFromIndex:range.location+1].length;
}

- (NSString *) plus:(NSString *) addend1 {
    NSString *addend2 = self;

    if (!addend1 || !addend2) return nil;
    if (addend1 == [NSString stringForNotANumber] ||
        addend2 == [NSString stringForNotANumber])
        return [NSString stringForNotANumber];

    NSNumberFormatter *f = [[NSNumberFormatter alloc] init];
    NSNumber *num1 = [f numberFromString:addend1];
    NSNumber *num2 = [f numberFromString:addend2];
    if (!num1 || !num2) return [NSString stringForNotANumber];

    double sum = num1.doubleValue + num2.doubleValue;

    [f setMinimumFractionDigits:MAX(addend1.numberOfDecimalPlaces,
                                    addend2.numberOfDecimalPlaces)];

    return [f stringFromNumber:[NSNumber numberWithDouble:sum]];
}
于 2012-12-27T05:05:06.330 回答