2010-03-05 11 views
9

ho il seguente codice che ha lo scopo di convertire millisecondi in ore, minuti e secondi:Objective 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); 

abbastanza semplice. Rawtime è un int con valore di 1200. L'uscita è come questo:

0:0:1 

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

Perché è che la conversione dei interi in stringhe dà tali numeri selvatici? Ho provato a utilizzare% i e% u e non hanno fatto alcuna differenza. Che cosa sta succedendo?

+0

Duplicato (?) Di [come convertire da int a stringa in iphone] (http://stackoverflow.com/questions/1372715/how-to-convert-from-int-to-string-in-iphone) –

risposta

17

È necessario utilizzare %@ come identificatore di conversione per una NSString. Cambia la tua ultima riga a:

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

%a significa qualcosa di completamente diverso. Dalla printf()man page:

aA
Il doppio argomento è arrotondato e convertito in notazione esadecimale in stile

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

dove il numero di cifre dopo il carattere esadecimale-punto è uguale a le specifiche di precisione.

+0

Ah sapevo che sarebbe stato qualcosa di semplice che mi mancava. Grazie. – Gilbert

6

Invece di tirare il proprio codice formattazione delle stringhe, si dovrebbe utilizzare un NSNumberFormatter per i numeri o un NSDateFormatter per date/orari. Questi formattatori di dati si occupano della localizzazione del formato nelle impostazioni locali dell'utente e gestiscono una varietà di formati integrati.

per l'utilizzo, è necessario convertire il vostro tempo millisecondo in un NSTimeInterval (typedef 'd da una doppia):

NSTimeInterval time = rawtime/1e3; 

Ora è possibile utilizzare un NSDateFormatter per presentare il tempo:

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

su OS X dove l'ultima riga rimuove "AM/PM". Ciò funzionerà in qualsiasi momento in meno di 12 ore e fornirà una stringa formattata nel formato localizzato per HH: MM: SS. Su iPhone, localizedStringFromDate:dateStyle:timeStyle: non è ancora disponibile. È possibile ottenere lo stesso effetto con setTimeStyle:, setDateStyle: e stringFromDate: in un'istanza di formattazione della data.

+0

LocalizedStringFromDate è disponibile su iphone? Forse dovresti usare setLocale invece? – DyingCactus

+0

@DyingCactus Hai assolutamente ragione; 'localizedStringFromDate: dateStyle: timeStyle' non è ancora disponibile su iPhone. È possibile ottenere la stessa funzionalità usando 'setDateStyle:' e 'setTimeStyle' seguito da' stringFromDate: ' –