我想在 Objective C 中将一个 int
转换成 NSString
,请问如何实现?
使用@()
表达式可以将基本类型转换为对象。因此,最简单的方法是将 int
转换为NSNumber
,然后使用stringValue
方法获取其字符串表示形式:
NSString *strValue = [@(myInt) stringValue];
或者NSString *strValue = @(myInt).stringValue;
NSString *string = [NSString stringWithFormat:@"%d", theinteger];
int i = 25;
NSString *myString = [NSString stringWithFormat:@"%d",i];
这是众多方法之一。
如果这个字符串是用于呈现给最终用户的,你应该使用NSNumberFormatter
。它将添加千位分隔符,并尊重用户的本地化设置:
NSInteger n = 10000;
NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init];
formatter.numberStyle = NSNumberFormatterDecimalStyle;
NSString *string = [formatter stringFromNumber:@(n)];
10,000
,但在德国,这将是10.000
。
NSString *strValue = [@(myInt) stringValue];
- StevestringValue
,但是所有的对象都有description
- 所以作为一个好的习惯,最好习惯于使用description
(NSNumber
有,这里不需要担心)。尝试这个(description
将打印日期,但stringValue
将崩溃):NSNumber *test = (id)[NSDate date]; NSLog(@"description: %@", test.description); NSLog(@"string value: %@", test.stringValue);
- Islam@(myInt)
是一个boxed expression,用于[NSNumber numberWithInt:]
,当给定一个int时,它将始终返回一个NSNumber。[NSNumber stringValue]
将始终返回一个NSString。在您的评论代码中,强制转换为(id)
并分配给不同类型是明显的编程错误:您永远不应该这样做。这就像交换方法,然后对该方法不执行原来的操作提出异议。 - Cœur!
),你会发现你在Objective-C中做错了。如果对象“test”不是由您创建的,则不是您的责任。您可以尝试为所有接收到的参数调用isKindOfClass:
,但即使通过传递结构而不是NSObject来欺骗它(例如),也可能被愚弄。所以不要这样做:只需明确记录预期的类型。 - Cœur(id)
是一个错误,这只是为了演示我认为description
比stringValue
更好(我可能错了,已经多年没有编写ObjC代码了)。 - IslamNSNumber *test = (__bridge id)(void*)1; NSLog(@"%@", test.description);
仍会崩溃。或者在与您的代码相同的文件中包含@implementation NSDate(foo)-(NSString *)description{exit(0);}@end
,并使用[NSDate date]
调用description时会崩溃。或者过度释放您的日期,当调用description时可能会不可预测地崩溃(CFDateRef date=CFDateCreate(nil, 0);CFRelease(date);NSNumber*test=CFBridgingRelease(date);NSLog(@"%@",test.description);
)。最后,您的description输出可能不会崩溃,但在操作系统更新时更可能不一致。 - Cœur