如何在使用NSEqualToPredicateOperatorType时使谓词忽略小数点?

时间:2014-07-22 12:58:26

标签: ios nspredicate

在我的应用程序中,我使用谓词来过滤字典数组中的值。

下面是我的数组结构

    (     
    {
        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,因为对象是浮点数

我正在寻找一种在过滤时忽略小数点的方法。为此建议一个解决方案。

2 个答案:

答案 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]]];

如果使用小数字的字符串值,则可以正常工作。