NSPredicate:如何将字符串视为数字?

Posted

技术标签:

【中文标题】NSPredicate:如何将字符串视为数字?【英文标题】:NSPredicate: how to treat strings as numbers? 【发布时间】:2012-01-16 11:23:02 【问题描述】:

我正在构建一个复合 NSPredicate 以在 ios 应用程序中使用 sqlite 上的核心数据发出获取请求。一切都已经很好了,但我无法包括最后一个条件。原因很简单:我需要检查存储为字符串的值是否在特定的浮点范围内。问题是条件是按字母顺序检查的,而不是根据它的浮点值。这是代码:

NSString * conditionToBeAdded = [NSString stringWithFormat:@" && (%@ >= \"""%@\""")  && (%@ <= \"""%@\""")", propertyName, myMinFloat, propertyName, myMaxFloat];
stringForPredicate = [stringForPredicate stringByAppendingString:conditionToBeAdded];  
NSPredicate * myPredicate = [NSPredicate predicateWithFormat:stringForPredicate];

有人知道如何构建一个 NSPredicate 对象,该对象能够将字符串值检查为数字,以在 coredata 请求中使用吗?

谢谢。

【问题讨论】:

你过滤什么样的对象?是否有可能反过来并在您的对象上创建一个只读属性,将字符串转换为 NSNumber?这样,您就可以完全控制存储的字符串不包含有效数字的情况。 它是应用程序的模型,它包含所有数据。这些对象有很多属性,(名称、地址、价格等)都是 NSString。到目前为止,我通过在没有此条件的情况下执行提取并过滤数组来解决,但它有点慢。我尝试了你的解决方案,它不起作用,因为它在模型实体定义中找不到属性,这是一个很好的点,但我需要再次定义我的模型,创建 mom 文件,生成类,然后重新导入我猜是所有数据 您可以使用自定义类来支持您的实体,该类基本上只添加只读属性。这可能会导致数据模型的新版本,因此需要数据迁移,这应该是可行的,因为数据模型的两个版本仅在添加自定义类方面有所不同。只要您有新旧版本的数据模型可用,自动迁移应该能够解决这个问题。 这也很有趣,可以考虑用于未来的应用程序。这次我算出来了,大概我们可以肯定,不可能建立这样一个谓词,不是吗?还是谢谢你。 【参考方案1】:

由于 NSPredicates 允许您使用与键值编码方法匹配的所有内容,因此您可以调用 NSStrings 方法,例如:intValue 或 floatValue

NSString * conditionToBeAdded = [NSString stringWithFormat:@" && (propertyName.floatValue >= %f )  && (propertyName.floatValue <= %f)", myMinFloat, myMaxFloat];
stringForPredicate = [stringForPredicate stringByAppendingString:conditionToBeAdded];  
NSPredicate * myPredicate = [NSPredicate predicateWithFormat:stringForPredicate];

希望对你有帮助。

【讨论】:

此语法有效,但结果仍然不正确。谓词如:attribute01.intValue 【参考方案2】:

您需要将该字符串更改为数字并正确修复它。字符串搜索是SLOW,应该避免。将数字放入字符串中会对性能造成很大影响,但没有任何好处。

至于您的实际谓词,您可以对字符串进行 比较。我怀疑你在谓词中使用的所有引号都把事情搞砸了。谓词中不需要引号,除非您设置了一个常量,在这种情况下您不需要。删除它们,然后重试。

【讨论】:

以上是关于NSPredicate:如何将字符串视为数字?的主要内容,如果未能解决你的问题,请参考以下文章

NSPredicate 比较字符串小于其他字符串

使用 NSPredicate 过滤以数字或符号开头的字符串到 NSArray

使用短语和数字序列设置 NSPredicate

NSPredicate 在包含数字和字母的字符串中包含搜索

NSPredicate - 使用两个条件进行评估

如何强制将变量视为 perl 中的字符串?