相关疑难解决方法(0)

NSDecimalNumber和大型无符号长整数(64位)整数

我正在处理来自JSON源的大型64位无符号整数,这些整数被解析为NSDecimalNumbers,这显然是"忠实地表示任意精度数".

我遇到的问题是我无法从这堂课中得到正确的数字.例如(使用可能的最大值):

print (unsigned long long) [[NSDecimalNumber decimalNumberWithString:@"18446744073709551615"] unsignedLongLongValue]
= 0 // Incorrect
print (unsigned long long) [[NSDecimalNumber decimalNumberWithString:@"9223372036854775808"] unsignedLongLongValue]
= 9223372036854775808 // Correct
print (unsigned long long) [[NSDecimalNumber decimalNumberWithString:@"9223372036854775810"] unsignedLongLongValue]
= 9223372036854775808 // Incorrect
Run Code Online (Sandbox Code Playgroud)

看起来我无法获得大于NSDecimalNumber中最大签名long long值的任何值.它不喜欢大于9223372036854775808的值.但是看起来这个数字是以NSDecimalNumber中的完整精度存储的,如:

po [[NSDecimalNumber decimalNumberWithString:@"18446744073709551615"] stringValue]
= 18446744073709551615
Run Code Online (Sandbox Code Playgroud)

我注意到NSNumber对象可以正常处理这些大数字,unsignedLongLongValue可以正常工作.它只是NSDecimalNumbers(我坚持使用),它不起作用.

如何从NSDecimalNumbers中获取正确的无符号long long值?或者至少将它们转换为unsignedLongLongValue可以工作的NSNumber对象.

cocoa objective-c

14
推荐指数
2
解决办法
3533
查看次数

将NSString中的第一个数字转换为整数?

我有一个像这样的NSString:

@"200hello"
Run Code Online (Sandbox Code Playgroud)

要么

@"0 something"
Run Code Online (Sandbox Code Playgroud)

我想要做的是获取NSString中的第一个出现的数字并将其转换为int.

所以@"200hello"会变成int = 200.

和@"0 something"将成为int = 0.

cocoa cocoa-touch objective-c nsstring

4
推荐指数
3
解决办法
2万
查看次数

从NSDictionary存储和检索int64_t:NSNumber vs NSString

我正在开发一款具有Game Center功能的游戏.在内部,我的游戏保留了类型变量的所有分数int64_t,因为这是通过GameKitAPI 报告分数所需的类型(我假设这是为了避免32位和64位平台之间的歧义).

到现在为止还挺好.

接下来,我希望将用户的hiscore存储在本地(例如,in NSUserDefaults.但是.plist是等效的),因为当没有经过身份验证的Game Center播放器时,还要通过iCloud键值与用户拥有的其他设备同步.

我可以像这样存储他的核心int64_t:

// (int64_t) _hiscore is an ivar.
// (NSString) _playerID is the authenticated player ID, or else 
//  "AnonymousUser" when GKLocalPlayer is not authenticated.

[playerData setObject:@(_hiscore) forKey:@"HiScore"];
[[NSUserDefaults standardUserDefaults] setObject:playerData forKey:_playerID];
[[NSUserDefaults standardUserDefaults] synchronize];
Run Code Online (Sandbox Code Playgroud)

...(假设"@()"运算符将在所有情况下都要小心 - 不确定这个......),但是NSNumber我应该使用哪种方法来检索值而不会冒整数溢出的风险?

所有-*value类的方法(例如-intValue,-longValue,-unsignedIntegerValue等)的返回类型是平台相关的(不像的int64_t,它具有显式字节大小).这篇文章提供了关于每个平台上所有数据类型的精彩信息,但它对NSNumber... 没有帮助

我可以对每个平台的区分类型的大小进行运行时检查(例如,查看是否sizeof(unsigned long)等于4或8,并在每种情况下使用不同的方法),但这看起来并不优雅.并不是说新架​​构会很快出现,但......

我还可以将号码存储为一个字符串,如在这个岗位,但手头上有字典友好的NSNumber,感觉傻... …

objective-c 32bit-64bit ios game-center icloud

4
推荐指数
1
解决办法
2077
查看次数

需要帮助将MPMediaItemPropertyPersistentID转换为字符串然后再返回

我从MPMediaPickerController获取媒体项的ID.根据文档,此值是包含uint64_t(unsigned long long)的NSNumber对象.我想将其转换为NSString以保存在我的数据模型中.但是,当我将其转换为字符串时,其值会发生变化,当我将其转换回数字时,它会再次更改!显然,我对这些数据类型并不了解.你能帮我吗?

MPMediaItem *mediaPicked;

// set mediaPicked to an MPMedia item using MPMediaPickerController...

NSLog(@"id as number: %qu", [mediaPicked valueForProperty:MPMediaItemPropertyPersistentID]); // outputs 566042331449280
NSLog(@"id as string: %@", [[mediaPicked valueForProperty:MPMediaItemPropertyPersistentID] stringValue]); // outputs 16204893883745507648
NSLog(@"id as number: %qu", [[[mediaPicked valueForProperty:MPMediaItemPropertyPersistentID] stringValue] longLongValue]); // outputs 9223372036854775807
Run Code Online (Sandbox Code Playgroud)

如果我尝试在此转换之前播放媒体项目,它始终有效.但是如果我在转换后尝试播放媒体项目,那么我尝试过的媒体项目中只有大约一半可以使用.因此,一些ID值在转换后仍然存在,而另一些则没有.

types objective-c ios4

2
推荐指数
1
解决办法
2947
查看次数

从NSString创建无符号长整型

可能重复:
存储和检索NSString中的无符号long long值

我试图从一个字符串创建一个unsigned long long,所以我可以在其他地方使用该值,但没有太多的运气这样做...这是我用来尝试这个

-(void)unsignedLongValue{


NSString *theString = [NSString stringWithFormat:@"%llu", [NSNumber   
unsignedLongLongValue]];    

theString = [[_message objectForKey:@"user"] objectForKey:@"id"];    

NSLog(@"%llu");

}
Run Code Online (Sandbox Code Playgroud)

如果您有任何建议或知道任何好文章,如果您能通知我,我将非常感激!谢谢!

string iphone integer objective-c nsstring

2
推荐指数
1
解决办法
2520
查看次数