如何将float格式化为字符串,以便用户输入一个小数位数为2或更少的数字,然后将其格式化为2位小数,但如果用户输入的浮点数小于或等于2位数然后显示所有小数位。例如
4.1 => 4.10
1 => 1.00
1.358484 => 1.358484
因此,如果需要,格式化为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 );