是否有快速格式化数字的方式(例如,使用appendFormat时),以便只显示足够的小数位?例如,4.23100显示为4.231,而5.0000显示为5。
感谢阅读。
答案 0 :(得分:3)
以合适的精度使用%g。
double number = 1234.123;
NSLog(@"Number equals: %.8g", number)
如引用here,%g转换将默认为6个有效数字,除非指定了最大精度。 %.7g或更大将全部给出所需的浮动。
答案 1 :(得分:2)
使用%g代替%f
double n = 1234.5678;
NSString str = [NSString stringWithFormat:@“number is%g”,n];
答案 2 :(得分: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)。
答案 3 :(得分: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]];
}