2010-03-05 8 views
9

je le code suivant qui est censé convertir les millisecondes en heures, minutes et secondes:Convert Objectif C int 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); 

assez simple. Rawtime est un entier avec une valeur 1200. La sortie est comme ceci:

0:0:1 

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

Pourquoi est-ce que la conversion des chaînes à ints donne ces jokers? J'ai essayé d'utiliser% i et% u et ils n'ont fait aucune différence. Qu'est-ce qui se passe?

+0

Dupliquer (?) De [Comment faire pour convertir d'int en chaîne dans l'iphone] (http://stackoverflow.com/questions/1372715/how-to-convert-from-int-to-string-in-iphone) –

Répondre

17

Vous devez utiliser %@ comme spécificateur de conversion pour un NSString. Changez votre dernière ligne à:

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

%a signifie quelque chose de totalement différent. De l'printf()man page:

aA
Le double argument est arrondi et converti en notation hexadécimale dans le style

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

où le nombre de chiffres après le caractère hexadécimal point est égal à la spécification de précision.

+0

Ah je savais que ce serait quelque chose de simple que j'ai raté. Merci. – Gilbert

6

Au lieu de rouler votre propre code de formatage de chaîne, vous devez utiliser un NSNumberFormatter pour les numéros ou NSDateFormatter pour connaître les dates/heures. Ces formateurs de données prennent en charge la localisation du format dans les paramètres régionaux de l'utilisateur et gèrent une variété de formats intégrés.

Pour votre utilisation, vous devez convertir votre temps de milliseconde en un NSTimeInterval (typedef « d d'un double):

NSTimeInterval time = rawtime/1e3; 

Maintenant, vous pouvez utiliser un NSDateFormatter pour présenter le temps:

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

sur OS X où la dernière ligne supprime le "AM/PM". Cela fonctionnera pour n'importe quel temps moins de 12 heures et donnera une chaîne formatée dans le format localisé pour HH: MM: SS. Sur l'iPhone, localizedStringFromDate:dateStyle:timeStyle: n'est pas encore disponible. Vous pouvez obtenir le même effet avec setTimeStyle:, setDateStyle: et stringFromDate: sur une instance de formatage de date.

+0

Est-ce que localizedStringFromDate est disponible sur iphone? Peut-être que vous devez utiliser setLocale à la place? – DyingCactus

+0

@DyingCactus Vous avez absolument raison; 'localizedStringFromDate: dateStyle: timeStyle' n'est pas encore disponible sur iPhone. Vous pouvez obtenir la même fonctionnalité en utilisant 'setDateStyle:' et 'setTimeStyle' suivi de' stringFromDate: ' –