Objective C 从字符串中解析整数

Posted

技术标签:

【中文标题】Objective C 从字符串中解析整数【英文标题】:ObjectiveC Parse Integer from String 【发布时间】:2011-04-03 07:29:17 【问题描述】:

我正在尝试从数组中提取字符串(包含整数),然后将其用作函数中的 int。我正在尝试使用 intValue 将其转换为 int。

这是我一直在尝试的代码。

  NSArray *_returnedArguments = [serverOutput componentsSeparatedByString:@":"];
  [_appDelegate loggedIn:usernameField.text:passwordField.text:(int)[[_returnedArguments objectAtIndex:2] intValue]];

我收到此错误:

传递 'loggedIn:::' 的参数 3 使指针从整数 没有演员表

怎么了?

【问题讨论】:

我猜你不需要(int) 部分 loggedIn::: 是如何声明的?特别是它期望的第三个参数是什么类型的? 确实你不需要它,但这不会导致他看到的错误。 出于好奇,您来自什么语言?我看到很多人在 SO 上提出 Objective-C 问题,他们在哪里进行了看起来像您的 loggedIn::: 方法的方法调用,这显然是一种非 Objective-C 的做事方式。 不,确实是loggedIn:::。该声明的其余部分只是参数名称,而不是选择器的一部分。习惯上,它应该是- (void)loggedIn:(NSString *)tusername password:(NSString *)tpassword userID:(int)userId。然后你可以称它为[_appDelegate userIsLoggedIn:usernameField.text password:passwordField.text userID:[[_returnedArguments objectAtIndex:2] intValue]]; 【参考方案1】:

我真的不知道这个问题有什么难的,但我设法做到了:

[myStringContainingInt intValue];

需要注意的是,你也可以这样做:

myStringContainingInt.intValue;

【讨论】:

对于我们这些来自其他语言的菜鸟来说,[myStringContainingInt intValue]; 也可以写成myStringContainingInt.intValue; 如果myStringContainingInt 中的数字太大而无法容纳在 32 位中——实际上是 31 位,因为它已签名,会发生什么情况? 在这种情况下你应该使用 longValue 确切地说是longLongValue 请务必注意,-[NSString intValue] 的行为可能与您的预期不同。来自docs:如果字符串不是以数字的有效十进制文本表示开头,则此属性为 0。 例如,[@" 2 asdghjk" intValue] 将返回 2【参考方案2】:

你可以像 [str intValue] 或 [str integerValue] 那样转换字符串

整数值 返回接收者文本的 NSInteger 值。

(NSInteger)整数值 返回值 接收者文本的 NSInteger 值,假设为十进制表示并在字符串的开头跳过空格。如果接收者不是以数字的有效十进制文本表示开头,则返回 0。

更多信息请参考here

【讨论】:

你在同一件事的大量答案已经在这里后回答这个问题? 你在开玩笑吗?如果字符串是“0”怎么办?是错误还是正确的解析?有点遗憾的是,Apple 厌恶异常,因为这正是您需要它们的地方。【参考方案3】:
NSArray *_returnedArguments = [serverOutput componentsSeparatedByString:@":"];

_returnedArgumentsNSStrings 的数组,UITextField text 属性正在等待该数组。无需转换。

语法错误:

[_appDelegate loggedIn:usernameField.text:passwordField.text:(int)[[_returnedArguments objectAtIndex:2] intValue]];

如果您的 _appDelegate 有 passwordField 属性,那么您可以使用以下设置文本

[[_appDelegate passwordField] setText:[_returnedArguments objectAtIndex:2]];

【讨论】:

我认为你已经被奇怪的方法名称和笨拙的调用完全抛弃了。该属性不是“期待一个字符串”(不管是什么意思)——passwordField.textloggedIn::: 方法的第二个参数,[[_returnedArguments objectAtIndex:2] intValue] 是第三个参数。没有任何东西被传递给属性。 我将方法名称声明为错误......推断代码试图做什么......【参考方案4】:

基本上,loggedIn 中的第三个参数不应该是整数,它应该是某种对象,但我们无法确定,因为您没有在方法调用中命名参数。提供方法签名,以便我们可以确定。也许需要NSNumber 或其他东西。

【讨论】:

不一定是对象。他可能错误地将方法声明为采用int*——事实上,这对我来说似乎很可能,因为许多编写 Objective-C 而不学习 C 基础知识的人认为参数类型只包含星号作为他们的语法。 是的,不正确。你想要的只是 int (或者更好的是,NSInteger,这是一回事)。您只需要在objective-c 对象之前使用* 符号,并且int 不是对象,它是原始数据类型。因此,将方法签名更改为 (int) 或 (NSInteger),它应该会修复它。【参考方案5】:

请记住,国际用户可能会使用 . 以外的小数分隔符,在这种情况下,在字符串上使用 intValue 时值可能会混淆或变为 nil。

例如,在英国,1.23 写成 1,23,因此用户将输入数字 1.7771,777,而 .intValue 将是 1777 而不是 1 (截断)。


我制作了一个宏,它将基于可以为 nil 的语言环境参数将输入文本转换为 NSNumber(如果为 nil,则它使用设备当前语言环境)。

#define stringToNumber(__string, __nullable_locale) (\
(^NSNumber *(void)\
NSLocale *__locale = __nullable_locale;\
if (!__locale) \
__locale = [NSLocale currentLocale];\
\
NSString *__string_copy = [__string stringByReplacingOccurrencesOfString:__locale.groupingSeparator withString:@""];\
__string_copy = [__string_copy stringByReplacingOccurrencesOfString:__locale.decimalSeparator withString:@"."];\
return @([__string_copy doubleValue]);\
)()\
)

【讨论】:

【参考方案6】:

如果我理解正确,您需要将您的NSString 转换为int?试试这种和平的代码:

NSString *stringWithNumberInside = [_returnedArguments objectAtIndex:2];
int number;
sscanf([stringWithNumberInside UTF8String], "%x", &flags);

【讨论】:

NSString 确实有一个 intValue 方法。 developer.apple.com/iphone/library/documentation/cocoa/…

以上是关于Objective C 从字符串中解析整数的主要内容,如果未能解决你的问题,请参考以下文章

Objective-C将十六进制字符串解析为整数

将 JSON 字符串解析为对象数组 Objective C

如何在Objective C中使用XML解析发布带有特殊字符和泰语的字符串?

如何在 Objective C 中将十六进制数转换为整数和字符串?

Objective-C中整数与字符串的相互转换

使用Objective C将xml字符串归档