Objective c 目标C:将数字格式化为“格式”;“刚好够”;小数位

Objective c 目标C:将数字格式化为“格式”;“刚好够”;小数位,objective-c,Objective C,是否有一种快速方法来格式化数字(例如,使用appendFormat时),以便只显示足够的小数位数?例如,4.23100显示为4.231,而5.0000仅显示为5 感谢阅读。使用%g而不是%f 双n=1234.5678 NSString str=[NSString stringWithFormat:@“编号为%g”,n] 一开始我找不到一个内置的方法来实现这一点,所以如果有人感兴趣,我构建了一个快速函数(如下所示)。也就是说,我相信%g(感谢MSgambel、Roger Gilbrat)和NSNu

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

感谢阅读。

使用%g而不是%f

双n=1234.5678


NSString str=[NSString stringWithFormat:@“编号为%g”,n]

一开始我找不到一个内置的方法来实现这一点,所以如果有人感兴趣,我构建了一个快速函数(如下所示)。也就是说,我相信%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];
}
+(NSString*)trimmedFraction:(浮点)分数{
int i=0;
float numDiff=0;
//循环可能的十进制值(在这种情况下,最大值为6)

对于(i=0;i如果将原始值存储为字符串而不是浮点数,那么这个问题很有意义

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

以适当的精度使用%g

double number = 1234.123;

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

如前所述,%g转换将默认为6位有效数字,除非指定了最大精度。%.7g或更大的转换都将给出所需的浮点。

这没有意义,因为浮点表示法不精确。您可以指定所需的小数位数。感谢您的评论。希望这能澄清问题:如果我有两位变量,比如x=4.231和y=5,我想用它们组成一个字符串,比如@“%f+%f”,最后的结果是“4.231000+5.000000”。但是,我需要“4.231+5”我想知道是否有任何内置功能可以实现这一点,或者我是否只需要自己编写函数。@Rogare在
x
初始化后,它的值是
4.230999999998721023075631819665431976318359375
。现在编译器应该如何决定您需要多少位数字?这样如何:您想将数字转换为dec>imal(字符串)的位数刚好足够,如果字符串被转换回二进制,则会再次获得相同的浮点数。这听起来像你在问的吗?(如果是C,则涉及的函数将是
sprintf
strod
)。请注意,如果所涉及的数字是浮点计算的结果,而不仅仅是常量
x=4.231
,那么对于我建议的标准,您最多可以得到17个有效数字(比如说,
7.000000000000002
而不是
7.
。这就是浮点运算的原理。试试
%g
而不是
%f
。科学记数法,并删除不需要的小数点。您好,谢谢您的回答!我试过这段代码,它实际上返回1234.56。也就是说,我相信如果我使用NSNumberFormatter类(例如,)并增加MaximumFractionDigits,它应该可以根据需要工作。谢谢!参考文献,%g转换将默认为6位有效数字,除非指定了最大值。%.8g或更大都将给出所需的浮点。或者您可以使用
NSDecimalNumber
解决所有这些问题(以及更多)您也可以。:)是否
-description with locale:
使用“刚好足够”的小数位?我不确定,但我想是的。
stringValue
确实如此。没有人理解,更改的值需要是浮点数或数字,而不是字符串或显示的