在我的应用程序中,我使用谓词来过滤字典数组中的值。
下面是我的数组结构
(
{
Apr = "6070.3869";
Feb = "9282.4067";
Jan = "5367.6783";
Jun = "7277.0928";
Mar = "8036.672";
May = "7677.0083";
};
{
Apr = "8542.590200000001";
Feb = "7471.3059";
Jan = "8427.397999999999";
Jun = "9138.6986";
Mar = "7830.722";
May = "9007.052600000001";
};
.
.
.
.
.
)
我使用表格视图来显示已过滤的列表
如果用户选择属性(来自jan,feb,mar,Apr),运算符(>,<,+)并输入int
值,那么我将显示已过滤的数组
例如,如果他选择Apr
并输入7000并选择<运算符然后我将显示其Apr
键的值小于7000的字典数组
我使用下面的谓词来过滤数组
NSPredicate *predicate;
///// filter is an instance of nsobject subclass ho;ding the value, key and operator
NSExpression *lhs = [NSExpression expressionForKeyPath:filter.name];
NSExpression *rhs = [NSExpression expressionForConstantValue:filter.values[0]];
predicate=[NSComparisonPredicate
predicateWithLeftExpression:lhs
rightExpression:rhs
modifier:NSDirectPredicateModifier
type:[[filter operatorType] intValue]
options:NSCaseInsensitivePredicateOption|NSCaseInsensitiveSearch];
以上方法不适用于NSEqualToPredicateOperatorType,因为对象是浮点数
我正在寻找一种在过滤时忽略小数点的方法。为此建议一个解决方案。
答案 0 :(得分:1)
当用户需要NSEqualToPredicateOperatorType
时,您可以创建具有两个谓词的复合谓词,这两个谓词定义上限和下限值。对于下限,您应该使用用户输入的内容,作为上限userInput+1
。
NSExpression *lhs = [NSExpression expressionForKeyPath:filter.name];
NSExpression *rhs = [NSExpression expressionForConstantValue:filter.values[0]];
NSExpression *rhsUpper = [NSExpression expressionForConstantValue:(filter.values[0]+1)]; // assumed that you have number type here
NSPredicate *lowerBoundPredicate =
[NSComparisonPredicate predicateWithLeftExpression:lhs
rightExpression:rhs
modifier:NSDirectPredicateModifier
type:NSGreaterThanOrEqualToPredicateOperatorType
options:NSCaseInsensitivePredicateOption|NSCaseInsensitiveSearch];
NSPredicate *upperBoundPredicate =
[NSComparisonPredicate predicateWithLeftExpression:lhs
rightExpression:rhsUpper
modifier:NSDirectPredicateModifier
type:NSLessThanPredicateOperatorType
options:NSCaseInsensitivePredicateOption|NSCaseInsensitiveSearch];
predicate = [NSCompoundPredicate andPredicateWithSubpredicates:@[lowerBoundPredicate, upperBoundPredicate]];
复合谓词将返回所有小数,整数部分等于用户输入。
答案 1 :(得分:1)
您可以使用以下正则表达式忽略小数点:
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"%K matches %@", filter.name, [NSString stringWithFormat:@"^%@($|\.)", filter.values[0]]];
如果使用小数字的字符串值,则可以正常工作。