2008-12-21 11 views
61

Intento utilizar stringWithFormat para establecer un valor numérico en la propiedad de texto de una etiqueta, pero el siguiente código no funciona. No puedo convertir int en NSString. Esperaba que el método supiera cómo convertir automáticamente un int a NSString.¿Cómo debo pasar un int en stringWithFormat?

¿Qué debo hacer aquí?

- (IBAction) increment: (id) sender 
{ 
    int count = 1; 
    label.text = [NSString stringWithFormat:@"%@", count]; 
} 

Respuesta

122

hacer esto:

label.text = [NSString stringWithFormat:@"%d", count]; 
+8

Esto produce una advertencia cuando se compila para dispositivos de 64 bits donde 'int' es en realidad un' long'. – devios1

24

que desea utilizar %d o %i para enteros. %@ se usa para objetos.

Sin embargo, vale la pena señalar que el siguiente código realizará la misma tarea y es mucho más claro.

label.intValue = count; 
45

Tenga en cuenta que @ "% d" solo funcionará en 32 bits. Una vez que comience a usar NSInteger para compatibilidad si alguna vez compila para una plataforma de 64 bits, debe usar @ "% ld" como su especificador de formato.

+1

El uso de '% ld' al compilar para un dispositivo de 32 bits ahora produce una advertencia. ¿Qué camino es más seguro? ¿Usar '% ld' con 32 bits o usar'% d' con 64? – devios1

+1

No importa, primero veo la nota de squelart sobre el lanzamiento a 'largo'. ¡Eso hace el truco y ahora compila para cualquier objetivo sin una advertencia! – devios1

13

y por el valor de comedia:

label.text = [NSString stringWithFormat:@"%@", [NSNumber numberWithInt:count]]; 

(aunque podría ser útil si un día usted está tratando con NSNumber de)

+3

O use la sintaxis object-c moderna y use: [NSString stringWithFormat: @ "% @", @ (count)] –

37

Marc Charbonneau escribió:

Tenga en cuenta que @ "% d" solo funcionará en 32 bits. Una vez que comience a usar NSInteger para compatibilidad si alguna vez compila para una plataforma de 64 bits, debe usar @ "% ld" como su especificador de formato.

Interesante, gracias por la sugerencia, estaba usando @ "% d" con mi NSInteger s!

La documentación del SDK también recomienda a emitir NSInteger a long en este caso (para que coincida con el @ "% ld"), por ejemplo:

NSInteger i = 42; 
label.text = [NSString stringWithFormat:@"%ld", (long)i]; 

Fuente: String Programming Guide for Cocoa - String Format Specifiers (requiere registro desarrollador de iPhone)

1

¿El fragmento que publicó es solo una muestra para mostrar lo que está tratando de hacer?

La razón por la que pregunto es que ha nombrado un método increment, pero parece que lo está usando para establecer el valor de una etiqueta de texto, en lugar de incrementar un valor.

Si está intentando hacer algo más complicado, como establecer un valor entero y hacer que la etiqueta muestre este valor, podría considerar usar enlaces. por ejemplo,

Declara una propiedad count y su acción increment establece este valor en lo que sea, y luego en IB, vincula el texto de la etiqueta con el valor de count. Siempre que siga la codificación de valor clave (KVC) con count, no es necesario que escriba ningún código para actualizar la visualización de la etiqueta. Y desde una perspectiva de diseño, tienes un acoplamiento más flexible.

1

No se olvide de long long int:

long long int id = [obj.id longLongValue]; 
[NSString stringWithFormat:@"this is my id: %lld", id] 
0
label.text = [NSString stringWithFormat:@"%d", XYZ]; 

//result: label.text = XYZ 
//use %d for int values 
4

Para ser de 32 bits y de 64 bits segura, utiliza uno de los Boxed Expressions:

label.text = [NSString stringWithFormat:@"%@", @(count).stringValue]; 
0
NSString * formattedname; 
NSString * firstname; 
NSString * middlename; 
NSString * lastname; 

firstname = @"My First Name"; 
middlename = @"My Middle Name"; 
lastname = @"My Last Name"; 

formattedname = [NSString stringWithFormat:@"My Full Name: %@ %@ %@", firstname, middlename, lastname]; 
NSLog(@"\n\nHere is the Formatted Name:\n%@\n\n", formattedname); 

/* 
Result: 
Here is the Formatted Name: 
My Full Name: My First Name My Middle Name My Last Name 
*/ 
Cuestiones relacionadas