目标C:用小数"just enough"位格式化数字



是否有一种快速的方法来格式化数字(例如,使用附录时),以便显示出足够的小数位置?例如,4.23100显示为4.231,而5.0000仅显示为5。

感谢您的阅读。

使用%g代替%f

double n = 1234.5678;

nsstring str = [nsstring stringwithformat:@" number is%g",n];

使用适当的精度使用%g。

double number = 1234.123;
NSLog(@"Number equals: %.8g", number)

如下所述,除非指定最大精度,否则%g转换将默认为6个重要数字。%.7g或更大的都将提供所需的浮点。

我一开始找不到内置的方法来执行此操作,因此,如果有人有兴趣,我就建立了一个快速功能(下)。也就是说,我相信%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)。

如果将原始值存储为字符串而不是浮点数,则问题很有意义。

我使用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]];
}

最新更新