2010-03-05 18 views
9

tengo el siguiente código que está destinado a convertir milisegundos en horas, minutos y segundos:Objetivo C Convert int a NSString (iPhone)

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

bastante sencillo. Rawtime es un entero con un valor de 1200. La salida es la siguiente:

0:0:1 

0x1.3eaf003d9573p-962:0x1.7bd2003d3ebp-981:-0x1.26197p-698 

Por qué es que la conversión de los enteros a cadenas da un número tan salvaje? Intenté usar% i y% u y no hicieron ninguna diferencia. ¿Que esta pasando?

+0

Duplicado (?) De [cómo convertir de int a cadena en iphone] (http://stackoverflow.com/questions/1372715/how-to-convert-from-int-to-string-in-iphone) –

Respuesta

17

Debe usar %@ como el especificador de conversión para un NSString. Cambiar la última línea a:

NSLog(@"%@:%@:%@", hoursStr, minsStr, secsStr); 

%a significa algo totalmente diferente. Desde el printf()man page:

aA
La doble argumento es redondeado y convierte a notación hexadecimal en el estilo

[-]0xh.hhhp[+-]d 

donde el número de dígitos después del carácter hexadecimal-punto es igual a la especificación de precisión.

+0

Ah, sabía que sería algo simple que extrañaba. Gracias. – Gilbert

6

En lugar de rodar su propio código de formato de cadenas, usted debe utilizar un NSNumberFormatter para los números o un NSDateFormatter de fechas/horas. Estos formateadores de datos se encargan de la localización del formato en la configuración regional del usuario y manejan una variedad de formatos integrados.

Para su uso, lo que necesita para convertir su tiempo de milisegundos en un NSTimeInterval (typedef 'd desde una doble):

NSTimeInterval time = rawtime/1e3; 

Ahora usted puede utilizar un NSDateFormatter para presentar el tiempo:

NSDate *timeDate = [NSDate dateWithTimeIntervalSinceReferenceDate:time]; 
NSString *formattedTime = [NSDateFormatter localizedStringFromDate:timeDate 
                 dateStyle:NSDateFormatterNoStyle 
                 timeStyle:NSDateFormatterMediumStyle]; 
NSString *rawTime = [[formattedTime componentsSeparatedByString:@" "] objectAtIndex:0]; 

en OS X donde la última línea elimina el "AM/PM". Esto funcionará en cualquier momento menos de 12 horas y dará una cadena formateada en el formato localizado para HH: MM: SS. En el iPhone, localizedStringFromDate:dateStyle:timeStyle: no está disponible (todavía). Puede lograr el mismo efecto con setTimeStyle:, setDateStyle: y stringFromDate: en una instancia de formateador de fecha.

+0

¿LocalizedStringFromDate está disponible en iphone? ¿Tal vez tenga que usar setLocale en su lugar? – DyingCactus

+0

@DyingCactus Tiene toda la razón; 'localizedStringFromDate: dateStyle: timeStyle' no está disponible en iPhone (todavía). Puede lograr la misma funcionalidad usando 'setDateStyle:' y 'setTimeStyle' seguido de' stringFromDate: ' –