【问题标题】:Why my NSString to int is wrong in Objective C?为什么我的 NSString 到 int 在 Objective C 中是错误的?
【发布时间】:2013-07-21 10:43:03
【问题描述】:

我的问题是“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>

【问题讨论】:

  • cloth.R 绝对是 NSString 对象吗?
  • ... 如果是,并且用于保存 R、G、B 值,那么 为什么 它是 NSString 对象而不是 int ?
  • 为什么要将 Cloth 中的 R、G、B 存储为 NSString ?使用 CGFloat。或者更好的是有 UIColor 属性。
  • 我想不出一些会导致上述症状的场景。您需要向我们展示 Cloth 的定义,以及如何设置 R/G/B 值。
  • 您确定这是您正在运行的确切代码吗?您没有遗漏或重新输入任何内容吗?运行此代码时,我得到了正确的结果。

标签: objective-c nsstring int


【解决方案1】:

%i 不是NSStringformat specifier。编译器和/或 NSString 应该会警告你。

好吧,该死的。每天学些新东西!不过,请使用 %d 而不是 %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>

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


一般来说,您应该使用NSIntegerNSUInteger 来存储数值使用系统提供的位宽特定类型。这将导致代码不那么脆弱,尤其是如果您在编译器中打开“不安全转换”警告。

除此之外:如果这确实是一种颜色,请将其存储为UIColorNSColor 的实例。至少拼出组件的名称,这样可以让代码读起来更流畅。

【讨论】:

  • 他使用 %i 表示整数
  • 他们使用%i 记录的唯一内容是变量i,它是一个int
  • @bbum,是的。阅读 trojanfoe 链接到的页面 - 该表是一个摘要,如果您点击查看完整规范,您会看到%d%i 是同义词。
  • @HotLicks - 这是官方的 - 点击查看完整规范。该表只是一个摘要。
  • @user2607430 在调试控制台中,用鼠标“选择”文本并将其复制/粘贴到您的问题中,就像您(可能)对源代码所做的那样。
【解决方案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

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

【讨论】:

  • 是的,这正是我遇到的问题。但是当我阅读并保存它时会出现空格。我上传了。
  • 这就是为什么我想看看 RGB 值的设置位置。
  • @user2607430 你上传到哪里了.. 请给个链接
  • 谢谢我用 currentElementValue =[[NSMutableString alloc] initWithString:[string stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]] 解决了 ParserXML 上的空格;
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-20
  • 2012-05-13
相关资源
最近更新 更多