我有一个应用程序可以导入一长串 csv 数据。
我需要处理获取的数字,但为了做到这一点,我需要去掉整数数字的小数位,并保留 x.5 为十进制的未更改数字
例如
1.0 make it 1
1.50 make it 1.5
实现这一目标的最佳方法是什么?
多谢!
我有一个应用程序可以导入一长串 csv 数据。
我需要处理获取的数字,但为了做到这一点,我需要去掉整数数字的小数位,并保留 x.5 为十进制的未更改数字
例如
1.0 make it 1
1.50 make it 1.5
实现这一目标的最佳方法是什么?
多谢!
一个简单的 NSNumberFormatter 应该可以为您实现:
float someFloat = 1.5;
NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init];
[formatter setAllowsFloats:YES];
[formatter setMaximumFractionDigits:1];
NSString *string = [formatter stringFromNumber:[NSNumber numberWithFloat:someFloat]];
当然,这假设您只有十分之一的小数要保留,例如,如果您使用“1.52”,这将返回“1.5”,但根据您上一篇关于将数字舍入为“.5”的帖子判断,这不应该成为问题。
您可以使用modf
来检查小数部分是否等于零。
-(BOOL)isWholeNumber:(double)number
{
double integral;
double fractional = modf(number, &integral);
return fractional == 0.00 ? YES : NO;
}
也适用于一些边界情况。
float a = 15.001;
float b = 16.0;
float c = -17.999999;
NSLog(@"a %@", [self isWholeNumber:a] ? @"YES" : @"NO");
NSLog(@"b %@", [self isWholeNumber:b] ? @"YES" : @"NO");
NSLog(@"c %@", [self isWholeNumber:c] ? @"YES" : @"NO");
输出
a NO
b YES
c NO
如果数字非常接近整数,则其他解决方案不起作用。我不确定你是否有这个要求。
之后,您可以使用NSNumberFormatter
, 一个表示整数,一个表示分数,随意显示它们。
这段代码实现了你想要的
float value1 = 1.0f;
float value2 = 1.5f;
NSString* formattedValue1 = (int)value1 == (float)value1 ? [NSString stringWithFormat:@"%d", (int)value1] : [NSString stringWithFormat:@"%1.1f", value1];
NSString* formattedValue2 = (int)value2 == (float)value2 ? [NSString stringWithFormat:@"%d", (int)value2] : [NSString stringWithFormat:@"%1.1f", value2];
这种事情可以在一个类别中完成,那么怎么样
// untested
@imterface NSString (myFormats)
+(NSString)formattedFloatForValue:(float)floatValue;
@end
@implementation NSString (myFormats)
+(NSString)formattedFloatForValue:(float)floatValue
{
return (int)floatValue == (float)floatValue ? [NSString stringWithFormat:@"%d", (int)floatValue] : [NSString stringWithFormat:@"%1.1f", floatValue];
}
@end
// usage
NSLog(@"%@", [NSString formattedFloatForValue:1.0f]);
NSLog(@"%@", [NSString formattedFloatForValue:1.5f]);