ObjC格式化Float到字符串的小数位数

时间:2011-03-13 22:14:08

标签: iphone objective-c string floating-point

如何将float格式化为字符串,以便用户输入一个小数位数为2或更少的数字,然后将其格式化为2位小数,但如果用户输入的浮点数小于或等于2位数然后显示所有小数位。例如

4.1 => 4.10
1 => 1.00
1.358484 => 1.358484

因此,如果需要,格式化为2位小数或更多。

希望我有道理。

2 个答案:

答案 0 :(得分:2)

尝试这样的事情。

BOOL requiresExtraPrecision (double num) {
    double roundedToHundredth = round(num * 100.0) / 100.0;
    double diff = num - roundedToHundredth;
    if (diff < 0) diff = 0.0 - diff;
    if (diff < 0.0000001) {
        return NO;
    } else {
        return YES;
    }
}

NSString *formatted (double num) {
    if (requiresExtraPrecision(num)) {
        return [NSString stringWithFormat:@"%F", num];
    } else {
        NSNumberFormatter *formatter = [[[NSNumberFormatter alloc] init] autorelease];
        [formatter setMaximumFractionDigits:2];
        [formatter setMinimumFractionDigits:2];
        return [formatter stringFromNumber:[NSNumber numberWithDouble:num]];
    }
}

正如@Carl在对这个问题的评论中写道,困难的部分是决定双精度何时需要它的所有精度。在这段代码中,我假设如果double对于一个舍入的数字“足够接近”(在百万分之一内),那么我们应该只显示舍入的数字。

您可能决定使其更严格(十亿分之一?),但您总是必须使用某种近似值,因为有些小数不能精确地存储为浮点数。即使用户在输入时输入了“0.1”,当数字存储为浮点数时,该信息也会丢失。

因此,假设您的浮点数非常接近小数但不完全正确,那么您必须决定何时认为浮点数与小数点“足够接近”。

如果你需要绝对的精确度(如果你正在使用钱!)那么你应该考虑使用NSDecimal或NSDecimalNumber而不是浮点数。

答案 1 :(得分:2)

这可能适合你:

NSNumber *aFloat = [NSNumber numberWithFloat:1.2]; //try 1.234 ; 1.23 ; 1.2 ; 1. ; 1
NSString *numberString = [aFloat stringValue];
NSRange dot;
dot = [numberString rangeOfString:@"."];
NSString *finalString;
if (dot.location != NSNotFound) {
    NSString *decimals = [numberString substringFromIndex:dot.location + dot.length];
    if (decimals.length<1){ // ends with "."
        finalString = [numberString stringByAppendingString:@"00"];
    }else if (decimals.length<2){ // ends with ".n"
        finalString = [numberString stringByAppendingString:@"0"];
    }else { // 2 or more decimals: no changes
        finalString = numberString;
    }
}else { // no decimals
    finalString = [numberString stringByAppendingString:@".00"];
}
NSLog(@"______._____finalString:%@", finalString );

编辑(更灵活,适用于可变小数位数):

NSNumber *aFloat = [NSNumber numberWithFloat:1.1235]; //try 1.234 ; 1.23 ; 1.2 ; 1. ; 1
NSString *numberString = [aFloat stringValue];
NSRange dot;
dot = [numberString rangeOfString:@"."];
if (dot.location == NSNotFound) { // no decimals, add a dot
    numberString = [numberString stringByAppendingString:@"."];
    NSLog(@"__added dot___ numberString:%@", numberString );
}
dot = [numberString rangeOfString:@"."];
NSString *decimals = [numberString substringFromIndex:dot.location + dot.length];
//      int initialDecimals = decimals.length;
int numberOfDecimalsTerget = 2;

for (int initialDecimals = decimals.length; initialDecimals<numberOfDecimalsTerget; initialDecimals++) {
    numberString = [numberString stringByAppendingString:@"0"];
}
NSLog(@"__END_._____numberString:%@", numberString );