Objective C将int转换为NSString(iPhone)

Gil*_*ert 9 string iphone int objective-c

我有以下代码,用于将毫秒转换为小时,分钟和秒:

int hours = floor(rawtime / 3600000);

int mins = floor((rawtime % 3600000) / (1000 * 60));
int secs = floor(((rawtime % 3600000) % (1000 * 60)) / 1000);

NSLog(@"%d:%d:%d", hours, mins, secs);

NSString *hoursStr = [NSString stringWithFormat:@"%d", hours];
NSString *minsStr = [NSString stringWithFormat:@"%d", mins];
NSString *secsStr = [NSString stringWithFormat:@"%d", secs];

NSLog(@"%a:%a:%a", hoursStr, minsStr, secsStr);
Run Code Online (Sandbox Code Playgroud)

非常坦率的.Rawtime是一个值为1200的int.输出如下:

0:0:1

0x1.3eaf003d9573p-962:0x1.7bd2003d3ebp-981:-0x1.26197p-698
Run Code Online (Sandbox Code Playgroud)

为什么将int转换为字符串会产生如此狂野的数字呢?我尝试过使用%i和%u,但没有区别.怎么了?

Car*_*rum 17

您必须%@用作NSString的转换说明符.将您的最后一行更改为:

NSLog(@"%@:%@:%@", hoursStr, minsStr, secsStr);
Run Code Online (Sandbox Code Playgroud)

%a意味着完全不同的东西 从printf() 手册页:

aA
双参数被舍入并在样式中转换为十六进制表示法

[-]0xh.hhhp[+-]d
Run Code Online (Sandbox Code Playgroud)

其中十六进制点字符后面的位数等于精度规格.


Bar*_*ark 6

您应该使用NSNumberFormatterfor数字或NSDateFormatter日期/时间来代替滚动自己的字符串格式代码.这些数据格式化器负责将格式本地化到用户的语言环境,并处理内置的各种格式.

为了您的使用,您需要将毫秒时间转换为NSTimeInterval(typedef'd from double):

NSTimeInterval time = rawtime/1e3;
Run Code Online (Sandbox Code Playgroud)

现在你可以用a NSDateFormatter来表示时间:

NSDate *timeDate = [NSDate dateWithTimeIntervalSinceReferenceDate:time];
NSString *formattedTime = [NSDateFormatter localizedStringFromDate:timeDate
                                                         dateStyle:NSDateFormatterNoStyle 
                                                         timeStyle:NSDateFormatterMediumStyle];
NSString *rawTime = [[formattedTime componentsSeparatedByString:@" "] objectAtIndex:0];
Run Code Online (Sandbox Code Playgroud)

在OS X上,最后一行删除"AM/PM".这将适用于少于12小时的任何时间,并将为HH:MM:SS提供本地化格式的格式化字符串.在iPhone上,localizedStringFromDate:dateStyle:timeStyle:尚未推出.可以实现与同样的效果setTimeStyle:,setDateStyle:以及stringFromDate:在日期格式实例.