【问题标题】:Number modifying during conversion from NSString to NSNumber [closed]从 NSString 转换为 NSNumber 期间修改数字 [关闭]
【发布时间】:2013-04-06 05:23:55
【问题描述】:
 NSNumberFormatter * f = [[NSNumberFormatter alloc] init];
    [f setNumberStyle:NSNumberFormatterDecimalStyle];
    NSNumber * myNumber = [f numberFromString:txt2.text];
    ctbook.number=myNumber;

在上面的 ctbook.number 代码参数中是 NSNumber,所以我在传递给 ctbook.number 之前将文本字段值转换为 NSNumber。但是当我从 ctbook.number 检索值时,我得到了一个新的不同数字,这不是我通过文本字段传递的数字。我错过了什么?这段代码有什么问题?

【问题讨论】:

  • 文本字段中有什么?
  • 我只输入了一些数字
  • 你能提供一个准确的例子吗?你输入什么,你得到什么?
  • 你无法使用NSString@[txt2.text intValue]))的intValue方法吗?
  • @Dolours 你真的需要给我们更多的信息,否则无法帮助你

标签: ios objective-c nsstring nsnumber


【解决方案1】:

如果您使用“Integer 32”作为 Core Data 属性的数据类型,那么 Core Data 将(静默)将该值截断为 32 位。如果您分配的 NSNumber 值大于 2^31 - 1 = 2147483647,那么它将被截断为 32 位,这就解释了为什么当你读回数据时会得到不同的值。

您可以在 Core Data 实体中选择“整数 64”作为数据类型,这将允许最大值为 2^63 - 1 = 9223372036854775807

【讨论】:

    【解决方案2】:

    没有额外的信息很难判断出了什么问题,但如果你需要一些快速而肮脏的东西,你可以使用NSStringintValueintegerValue 方法。

    ctbook.number = @(txt2.txt.intValue);
    

    @(x) 语法只是[NSNumber numberWithInt:txt2.txt.intValue] 的简写)

    请注意,如果您的字符串不是有效的intintValue 调用将返回0

    编辑

    鉴于最近的 cmets,问题不在于转换,而在于整数表示。

    32 位不足以表示您的数字,因此您最好使用较小的数字或使用int64_t 切换到 64 位表示。

    【讨论】:

      猜你喜欢
      • 2011-09-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-05
      • 2011-04-27
      • 2010-11-29
      • 1970-01-01
      相关资源
      最近更新 更多