【问题标题】:Trying to save long long into NSNumber from String试图将 long long 从 String 保存到 NSNumber
【发布时间】:2011-06-13 09:23:38
【问题描述】:

我正在尝试将长长的数字(以字符串形式接收)例如“80182916772147201”保存到 NSNumber。

NSNumberFormatter * f = [[NSNumberFormatter alloc] init];
[f setNumberStyle:NSNumberFormatterBehaviorDefault];

[item setObject:[f numberFromString:@"80182916772147201"] forKey:@"theID"];
[f release];

当我 NSLog 退出时,假设字符串是 '80182916772147201' 我得到:

NSLog(@"%lld", [[item objectForKey:@"theID"] longLongValue]); 

返回:'80182916772147200' - 注意四舍五入的最后一位数。

我做错了什么?

【问题讨论】:

    标签: iphone ios nsstring nsnumber nsnumberformatter


    【解决方案1】:

    问题在于NSNumberFormatter 已决定将该数字表示为浮点数。强制它只使用整数:

    [f setAllowsFloats:NO];
    

    【讨论】:

      【解决方案2】:

      你可以试试这个吗?

      NSString *numStr = [NSString stringWithFormat:@"%llu", [myNum unsignedLongLongValue]];
      

      这做了一些合理的假设,例如 numStr 将只包含数字,并且它包含一个“有效的”无符号 long long 值。这种方法的一个缺点是 UTF8String 创建的内容基本上相当于 [[numStr dataUsingEncoding:NSUTF8StringEncoding] 字节],或者换句话说,每次调用都会产生 32 个字节的自动释放内存。对于绝大多数用途来说,这不是问题。

      有关如何将诸如 unsignedLongLongValue 之类的内容添加到 NSString 的示例,该内容既非常快又不使用自动释放的内存作为副作用,请查看我对这个 SO 问题的(长)答案的结尾。特别是 rklIntValue 的示例实现,它只需要简单的修改即可实现 unsignedLongLongValue。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-11-13
        • 1970-01-01
        • 2019-08-27
        • 1970-01-01
        • 1970-01-01
        • 2017-08-20
        • 2014-03-14
        • 1970-01-01
        相关资源
        最近更新 更多