从nsstring中提取整数

时间:2013-06-09 22:21:06

标签: objective-c nsstring

调试日志如下所示。

2013-06-09 17:09:09.192 BridgeDeal[2430:11303] suito: 2K
2013-06-09 17:09:09.193 BridgeDeal[2430:11303] suit: 50
2013-06-09 17:09:09.193 BridgeDeal[2430:11303] suito: 2Q
2013-06-09 17:09:09.193 BridgeDeal[2430:11303] suit: 50
2013-06-09 17:09:09.194 BridgeDeal[2430:11303] suito: 3J
2013-06-09 17:09:09.194 BridgeDeal[2430:11303] suit: 51

上面suito的值是正确的,但不是上面suit的值。取而代之的是suit的值,我希望得到2,2,3。

for (int i = 0; i<3; i++) {
    NSInteger suit = [[self.cardList objectAtIndex:i ] characterAtIndex:0] ;
    NSLog(@"suito: %@", [self.cardList objectAtIndex:i ]);
    NSLog(@"suit: %d", suit);

}

cardlist声明如下。

@property (nonatomic, weak) NSMutableArray *cardList;

我尝试了以下代码,但收到错误:bUnexpected type name 'NSRange'

NSInteger suit = [[self.cardList objectAtIndex:i ] substringWithRange:NSRange(0,1)]  ;

2 个答案:

答案 0 :(得分:2)

您获得的是该号码的ASCII码。这就是角色。

您的第二部分代码更好,但请使用NSMakeRange(NSRange){0,1}

答案 1 :(得分:1)

NSLog(@"suit: %d",suit);更改为NSLog(@"suit: %d",suit - '0');

当你在NSString对象上调用characterAtIndex时,它返回一个unichar(unsigned short)变量;然后将该值存储在NSInteger中。你认为这会给你一个错误。它不是因为unichar(和C,char)变量实际上是整数(在这种情况下,unichar只是typedef为unsigned short)。每个字符('a','b','c','d'等)都有与之关联的不同数字。碰巧与ASCII字符集中的字符“2”相关联的数字是50,与“3”相关联的数字是51.因为(无论如何是ASCII)数字“0”到“9”的字符都是顺序的,你可以通过从你的角色(suit - '0')的值中减去'0'的值来“破解”你获得实际数字的方式。由于'0'(以ASCII为单位)的值为48,因此减去它会得到2,2和3,而不是50,50和51。

如果您将卡套装表示为数字,您可以考虑将它们作为数字而不是字符串存储在数组中。