2011-07-01 4 views
5

Tengo series NSString que representan tiempos en HH: MM: SS pero se puede omitir el HH y un dígito del MM.¿Cómo dejo el pad un NSString para que quepa en un ancho fijo?

necesito para alinear columnas de estos valores como esta:

1:01:43 
    43:23 
    7:00 

Cuál es la forma más sencilla de hacer esto?

+1

No he probado cadenas de relleno utilizando la clase NSString, pero en teoría debería ser capaz de hacer algo así ... * NSString otra = [NSString stringWithFormat: @ "% 8S", [str UTF8String]], donde * str * es la cadena de fecha sin formato en formato HH: MM: SS. – Perception

+0

Según el ejemplo, podría ser suficiente dibujar la cadena alineada a la derecha. Esto se puede configurar con estilo de párrafo. – Gobra

+0

@Perception: si publica eso como una respuesta (con S cambiado a s), lo votaré de vuelta. Es la solución correcta para un ancho de caracteres fijo. –

Respuesta

13

Haz uso del método stringWithFormat provisto en la clase NSString. Algo como esto:

NSString * dateStr = @"05:30"; 
NSString * formattedStr = [NSString stringWithFormat:@"%8s", [str UTF8String]]; 

El 8% en 8s es el número de dígitos de precisión (o en este caso caracteres) que desea en la cadena de formato. Las cadenas de entrada más cortas que la precisión especificada se rellenarán a la izquierda con espacios, cadenas más largas de lo que se truncarán. Puede leer más acerca de las cadenas de formato para printf here.

Editar Gracias a @Peter por señalar esto. Existen algunas diferencias (menores) entre los especificadores de formato en el estándar C, frente al objetivo C. Consulte la documentación de Apples en los especificadores de cadena de formato here.

+0

La lista específica de NSString/CFString está aquí: http://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/Strings/Articles /formatSpecifiers.html Hay al menos dos que son diferentes entre 'printf' y NSString/CFString de OS X. –

+0

¡Gracias por salvarnos de las respuestas más complicadas y hacky con una forma sencilla e integrada! – jpswain

+0

Uso: ... WithFormat: @ "% - 8s", [str UTF8String]]; para los espacios de relleno correctos – Raunak

0

Esta solución es válida para iOS:

en IOS puede utilizar UILabel y derecha alinearlos. Por supuesto, tendrá una alineación perfecta solo si utiliza una "fuente fija", como Courier New, por ejemplo. Si debe usar una fuente proporcional, la única forma es usar la extensión NSString + UIKit para dibujar todos los caracteres de la cadena en posiciones fijas dentro del contexto de dibujo de la vista: Así que idealmente el flujo es: 1. calcule la longitud de la cadena más larga 2. Dé la vuelta al resto de las cadenas agregando espacio extra 3. Luego, para cada cadena, repita cada carácter y grábelo como una posición específica (no copie y pegue este código, solo úselo para tener una idea; esto es obj-c-como pseudo-código)


CGFloat x=0; // the string start let's say at x=0 
CGFloat dx=40; // distance between characters 
for(NSInteger i=0;i<[myString length];i++) { 
    NSString *char = [myString substringWithRange:NSRangeMake(i,1)]; 
    [char drawAtPoint:CGPointMake(x,y) withFont:myFont]; 
    x+=dx; 
} 

de dx curso debe ser elegido de acuerdo con el tamaño de fuente.

2

No creo que haya una manera fácil. Probablemente pueda escribir un método de categoría en NSString para hacer eso.

- (NSString *)stringByPaddingLeftToLength:(NSUInteger)aLength withString:(NSString *)padString { 
    NSInteger lengthToPad = aLength - [self length]; 

    if (lengthToPad > 0) { 
     NSString * padding = [@"" stringByPaddingToLength:lengthToPad withString:padString startingAtIndex:0]; 
     NSString * paddedString = [padding stringByAppendingString:self]; 

     return paddedString; 
    } else { 
     return [[self copy] autorelease]; 
    } 
} 
1

Si se refiere a una anchura punto fijo, tanto NSTextField (cacao) y UILabel (Cocoa Touch) le permiten configurar la alineación. Para NSTextView y el dibujo personalizado, deberá crear un NSParagraphStyle (solo AppKit) o ​​CTParagraphStyle con la alineación especificada.

1

Si desea que esto tenga una alineación explícita con una fuente proporcional (es decir, no una fuente monoespacial), entonces debe usar diferentes vistas para cada uno de los componentes de la cadena.

[hour]-[:]-[minute]-[:]-[second] 
[hour]-[:]-[minute]-[:]-[second] 
[hour]-[:]-[minute]-[:]-[second] 

Donde cada uno de los [things] es una UILabel

3

código de relleno diferente diferente, pero podría ser útil

NSString *st = [@"abc" stringByPaddingToLength: 9 withString: @"." startingAtIndex:0]; 

ABC ......

[@"abc" stringByPaddingToLength: 2 withString: @"." startingAtIndex:0]; 

ab

[@"abc" stringByPaddingToLength: 9 withString: @". " startingAtIndex:1]; 

abc. . .

aviso de que el primer carácter en el relleno es un espacio

+0

, la pregunta pregunta por el panel izquierdo esta documentación si solo se usa para el relleno correcto. –

Cuestiones relacionadas