【问题标题】:Compare strings with numeric values将字符串与数值进行比较
【发布时间】:2014-06-05 08:29:46
【问题描述】:

我已经搜索了很多小时如何比较这两个字符串(并且 str1 等于 str2 == YES):

此字符串由我的界面(搜索栏)中的用户输入给出

NSString *str1 = @"11,2";

这个字符串是我的模型对象的一个​​属性

NSString *str2 = @"11.2";

我已经测试过了,但它不起作用

if ([str1 rangeOfString:str2 options:options range:NSMakeRange(0, [str1 length]) locale:[NSLocale currentLocale]].location == NSNotFound

Witch 是比较两个 NSString 并让 str1 等于 str2 返回 YES 的最佳解决方案?

编辑:

我知道我只需将“,”替换为“。”即可。并进行比较,但我正在寻找一个优雅的解决方案,即 11.2 和 11,2 在不同的语言环境中是相同的(例如使用NSDecimalNumber)。

【问题讨论】:

  • 为什么不将 , 替换为 .然后比较?
  • 感谢您的评论,但我不喜欢这个解决方案。问题是我的模型对象中的值可以等于:11,2,输入可以是 11.2
  • 您能否澄清一下,如果两个字符串的区别仅在于一个具有, 而另一个具有. 或反之亦然(以及任意数量的'' s 或. 可能会出现?
  • 对不起,我不明白你的评论。 (1.2 等于 1,2),( 2.1 不等于 1.2)(2.1 不等于 1,2)....简单的数字比较与“。” == ","
  • 如果值实际上是数字,请使用 NSNumber 存储或使用它们...或围绕 NSNumberFormatter 构建解决方案...

标签: objective-c


【解决方案1】:

您基本上已经回答了您自己的问题 - 使用 NSDecimalNumber 根据当前语言环境解析用户的输入。使用您的语言环境解析您的字符串(或者最好将其保留为浮点值。除了不建议比较浮点值以获得完全相等的标准问题之外,这应该可以解决您的问题,尽管NSDecimalNumber 可能会帮助您解决这个问题。高温

【讨论】:

  • 这个解决方案的问题是,如果用户使用的是法语语言环境并且他使用“.”进行搜索。 NSDecimalNumber 将为空,如果用户在“美国”本地并且他使用“,”搜索,则 NSDecimalNumber 将为空。
  • @samir - 你不可能有千里眼。尝试用户的区域设置(机器当前区域设置),如果无法解析尝试通用(英语)区域设置。如果用户的语言环境是 X,但他们选择以语言环境 Y 的格式提供输入,那么您将被卡住,不是千里眼,您将不得不拒绝输入或在 UI 中包含一个菜单以供用户指示语言环境他们会跟随。然而,这不是标准的 OS X,它只是接受当前语言环境中的输入。 hTH
【解决方案2】:

如果您可以信任机器上用户的区域设置,您可以使用NSScanner 实例来扫描数字字符串并使用浮点数或双精度数作为您的模型,以便您可以执行正确的搜索。

【讨论】:

  • 我无法信任用户的语言环境。这取决于用户的输入
  • 那么你可以捕捉到“,”或“。”而用户输入值并将其保存为NSLocaleDecimalSeparator 的值,以传入-[NSDecimalNumber decimalNumberWithString:locale] 所需的字典。这在视图级别有点骇人听闻,但让您在逻辑级别更加优雅。
  • 不客气。让我知道它是否适合,以便我更新我的答案。
最近更新 更多