从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)]  ;

您得到的是数字的ASCII码。这就是字符的含义。

你的第二段代码更好,但使用NSMakeRange(NSRange){0,1}

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

当你在NSString对象上调用characterAtIndex时,它返回一个unichar (unsigned short)变量;然后你把那个值存储在NSInteger中。你会认为这会给你一个错误。它没有这样做的原因是因为unichar(在C中是char)变量实际上是整数(在这种情况下,unichar只是被类型定义为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。

如果你用数字表示card suits,你可以考虑将它们存储在数组中,作为数字而不是字符串。

最新更新