NSString作为CoreData谓词中的float

时间:2016-01-18 13:43:20

标签: ios objective-c

我有带NSString字段的CoreData表。但是在过滤器中我需要被解释为float。

fieldName.floatValue 未提供正确的结果。如果有任何方法可以在不更改表中的字段类型的情况下执行此操作吗?

修改

数据是:

map.merge

我的谓词

company = "CompanyName";
date = "2016-01-17";
value = "379.76";

但值379.76输入结果。使用 value.floatValue 将所有相同的值作为字符串进行比较。

TNX

4 个答案:

答案 0 :(得分:1)

如果你知道value不是否定的,你可以使用这个技巧:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"abs:(value) > 2000"];

abs:强制SQLite将value属性视为数字。

或者,向它添加零(适用于负数):

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"add:to:(value,0) > 2000"];

答案 1 :(得分:0)

我认为您应该将String类型更改为Number,这是最简单的方法。 您可以使用此谓词:

NSPredicate *predicate = [NSPredicate predicateWithBlock:^BOOL(id  _Nonnull evaluatedObject, NSDictionary<NSString *,id> * _Nullable bindings) {
    return [[evaluatedObject value] floatValue] > 2000;  // Change id to your Class
}];

但是这个谓词不能与CoreData一起使用。因此,您应该将获取结果存储到数组中,然后使用此谓词。

答案 2 :(得分:0)

//Try with this. 
// '>' will apply when 'value' is number. So, I first put your values in an array. Only then, I can apply the predicate.

NSString *company = @"CompanyName";
NSString *date = @"2016-01-17";
NSString *value = @"379.76";

NSArray *dataArray = @[@(value.floatValue),@(379.76),@(379),@(200)];

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"self > %f",200.0];
NSArray *array = [dataArray filteredArrayUsingPredicate:predicate];
//output:@(379.76),@(379.76),@(379)

答案 3 :(得分:0)

试试这个:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"value > 2000"];