0

我有一个应用程序可以导入一长串 csv 数据。

我需要处理获取的数字,但为了做到这一点,我需要去掉整数数字的小数位,并保留 x.5 为十进制的未更改数字

例如

1.0 make it 1
1.50 make it 1.5

实现这一目标的最佳方法是什么?

多谢!

4

3 回答 3

2

一个简单的 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”的帖子判断,这不应该成为问题。

于 2012-09-07T07:58:20.527 回答
2

您可以使用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, 一个表示整数,一个表示分数,随意显示它们。

于 2012-09-07T08:13:17.947 回答
1

这段代码实现了你想要的

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]);
于 2012-09-07T08:00:48.403 回答