【问题标题】:NSPredicate and NSString QuestionNSPredicate 和 NSString 问题
【发布时间】:2011-08-14 01:44:53
【问题描述】:

我有以下谓词可以很好地处理 555 和 623(3 位数字)等数字

问题是,我有 005 和 009 等数字(1 位前面有两个 0)。

NSPredicate *filterPredicate = [NSPredicate predicateWithFormat:@"ANY code BETWEEN %@",
                                    [NSArray arrayWithObjects: 
                                     [NSExpression expressionForConstantValue: [NSNumber numberWithFloat: [self.predicateFilter floatValue]]],
                                     [NSExpression expressionForConstantValue: [NSNumber numberWithFloat: [self.predicateFilter floatValue] + .99]],
                                     nil]];

大多数时候,predicateFilter 将是一个带有数字的字符串,例如@"124"。但是当我运行像 035 这样的数字时(注意开头的 0),我得到以下 NSLog:

2011-08-13 18:32:23.989 Codes[2007:707] code 004
2011-08-13 18:32:24.018 Codes[2007:707] ANY code BETWEEN {4, 4.99}
2011-08-13 18:34:23.846 Codes[2007:707] code 083
2011-08-13 18:34:23.864 Codes[2007:707] ANY code BETWEEN {83, 83.99}

因此,由于00X,它没有找到这些数字。

有没有办法我可以执行 if/else 或捕获所有以 000 开头的数字,以便我可以相应地编辑谓词?

编辑:

我想我只需要创建一个谓词,将code 的前 3 位数字与 NSString 相匹配,即 005。然后这会给我剩下的结果是 005.5、005.6 等。

【问题讨论】:

  • 您要过滤的code 属性有什么类型?
  • 它是string,但它是数字,而不是字母。基本上,现在的谓词没有找到任何以000 开头的code
  • 前导零在数值表达式中没有意义。如果它们确实对您的代码有意义(004 != 4),您应该使用字符串。如果没有,请使用数字属性。
  • code 已经是一个字符串。我需要将其保留为 005,因为这是一个预加载的数据库。我现在遇到的问题是谓词没有找到任何以 0 或 00 开头的代码
  • 为什么不直接使用 predicateFilter 进行查询,而不是先将其转换为数字(删除前导零)?

标签: iphone objective-c nsstring nspredicate nsnumber


【解决方案1】:

由于 code 是一个字符串,你可以做一个 MATCH 比较,或者是这个核心数据。如果它是核心数据,您可以添加一个属性以将 code 作为整数返回 codeInteger 可能使用transient attribute

【讨论】:

  • 我可以,但我不认为这是必要的,因为只有少数code 低于 100。必须有一种方法让我做出 if/else 语句来收集所有以000 开头的code,然后我可以为它们创建一个单独的谓词。
  • 在我看来,您的问题是您正在与您进行字符串比较而不是数字,如果是这种情况,您可以尝试将您的两个值转换为字符串然后填充如果需要,它们用零输出。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-28
  • 1970-01-01
  • 1970-01-01
  • 2011-10-18
  • 1970-01-01
相关资源
最近更新 更多