2

我的问题是“R real:”的结果是完美的,但是当我将例如“cloth.R”转换为 int 时,结果为 0。我该如何解决它。谢谢。

 Cloth *cloth = [app.clothArray objectAtIndex:0];
NSLog(@"R real:%@",cloth.R);
 NSLog(@"G real:%@",cloth.G);
 NSLog(@"B real:%@",cloth.B);

NSString *aNumberString = cloth.R;
int i = [aNumberString intValue];
NSLog(@"NSString:%@",aNumberString);
NSLog(@"Int:%i",i);

结果:

2013-07-22 18:57:45.965 App_ermenegild[26030:c07] R real:
232
2013-07-22 18:57:45.965 App_ermenegild[26030:c07] G real:
0
2013-07-22 18:57:45.965 App_ermenegild[26030:c07] B real:
121
2013-07-22 18:57:45.966 App_ermenegild[26030:c07] NSString:
232
2013-07-22 18:57:45.966 App_ermenegild[26030:c07] Int:0

编辑
这里是Cloth

@interface Cloth : NSObject 
@property(nonatomic,retain) NSString *nom; 
@property(nonatomic,retain) NSString *R; 
@property(nonatomic,retain) NSString *G; 
@property(nonatomic,retain) NSString *B; 
@property(nonatomic,retain) NSString *col; 
@property (nonatomic,readwrite) NSInteger *clothID; 
@end

这里的 XML 文件模式:

<cloth id="1">
<nom>Heliconia</nom>
<R>232</R>
<G>0</G>
<B>121</B>
<col>#E80079</col>
</cloth>
4

2 回答 2

2

出现这种情况的唯一情况是开头有不可见字符,例如换行符

例如

NSString *cloth = @"\n232";
int i = [cloth intValue];
NSLog(@"NSString:%@",cloth);
NSLog(@"Int:%i",i);

日志是

2013-07-22 22:14:57.560 DeviceTest[801:c07] NSString:
232
2013-07-22 22:14:57.561 DeviceTest[801:c07] Int:0

这就是为什么我问你确切的日志输出。

于 2013-07-22T16:46:47.727 回答
0

%i不是. _ _ NSString编译器和/或 NSString 应该警告你。

嗯,该死的。每天学些新东西!不过,使用%dover %i

试试%d

NSLog(@"Int:%d",i);

如果这不起作用,请检查字符串中是否有不可见的字符 goobers。我建议测试长度,看看它是否是一个合理的长度。

找到丢失的字符可能非常棘手,因为许多 unicode 序列在许多上下文中将保持不可见。十六进制编辑器可以向您展示发生了什么,但这里有一个简单的、hackish 的测试,它对短字符串非常有效。

int main(int argc, char *argv[]) {
    @autoreleasepool {
        NSString *good = @"10";
        NSString *bad = @"1\u20630";

        NSLog(@"%@ %@", good, bad);

        NSLog(@"%d %d", [good intValue], [bad intValue]);

        NSData *dGood = [good dataUsingEncoding:NSUTF8StringEncoding];
        NSData *dBad = [bad dataUsingEncoding:NSUTF8StringEncoding];

        NSLog(@"%@ %@", dGood, dBad);
    }
}

输出:

2013-07-22 09:58:44.654 Untitled[1105:507] 10 1⁣0
2013-07-22 09:58:44.656 Untitled[1105:507] 10 1
2013-07-22 09:58:44.656 Untitled[1105:507] <3130> <31e281a3 30>

0x31是字符的 ASCII 10x300。显然,坏字符串在 1 和 0 之间有一堆 gobbledygook。将您的字符串转换为 NSData 并记录它。


通常,您应该使用NSIntegerandNSUInteger来存储数值使用系统提供的位宽特定类型。它会导致代码不那么脆弱,特别是如果您在编译器中打开“不安全转换”警告。

另外:如果那真的是一种颜色,请将其存储为UIColoror的实例NSColor。至少拼出组件的名称,因为它会使代码阅读更流畅。

于 2013-07-22T16:08:48.703 回答