2011-07-01 42 views
5

Tôi có các chuỗi NSString đại diện cho thời gian trong HH: MM: SS nhưng HH và chữ số của MM có thể bị bỏ qua.Làm cách nào để tôi giữ lại một NSString để vừa với chiều rộng cố định?

tôi cần phải sắp xếp các cột của các giá trị như thế này:

1:01:43 
    43:23 
    7:00 

cách dễ nhất để làm điều này là gì?

+1

tôi đã không cố gắng xâu đệm bằng cách sử dụng lớp NSString, nhưng về mặt lý thuyết bạn sẽ có thể làm điều gì đó giống như ... NSString * khác = [NSString stringWithFormat: @ "% 8S", [str UTF8String]], trong đó * str * là chuỗi ngày tháng thô của bạn ở định dạng HH: MM: SS. – Perception

+0

Theo ví dụ, có thể đủ để vẽ chuỗi căn phải. Điều này có thể được thiết lập với kiểu đoạn văn. – Gobra

+0

@Perception: Nếu bạn đăng câu trả lời đó (với S thay đổi thành s), tôi sẽ upvote nó. Đó là giải pháp đúng cho chiều rộng ký tự cố định. –

Trả lời

13

Sử dụng phương thức stringWithFormat được cung cấp trong lớp NSString. Một cái gì đó như thế này:

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

Các trong% 8s là số chữ số chính xác (hoặc trong trường hợp này nhân vật) mà bạn muốn trong chuỗi định dạng của bạn. Các chuỗi đầu vào ngắn hơn độ chính xác được chỉ định sẽ bị chèn sang trái với dấu cách, chuỗi dài hơn chuỗi sẽ bị cắt bớt. Bạn có thể đọc thêm về chuỗi định dạng cho printf here.

Chỉnh sửa Nhờ @Peter đã chỉ ra điều này. Có một số khác biệt nhỏ (nhỏ) giữa các bộ định dạng định dạng trong tiêu chuẩn C, so với mục tiêu C. Tham khảo tài liệu Táo về định dạng chuỗi định dạng here.

+0

Danh sách NSString/CFString cụ thể có tại đây: http://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/Strings/Articles /formatSpecifiers.html Có ít nhất hai khác biệt giữa 'printf' và NSString/CFString của OS X. –

+0

Cảm ơn bạn đã cứu chúng tôi khỏi những câu trả lời phức tạp, phức tạp hơn với cách đơn giản, tích hợp! – jpswain

+0

Sử dụng: ... WithFormat: @ "% - 8s", [str UTF8String]]; cho không gian đệm phải – Raunak

0

giải pháp này có giá trị dành cho iOS:

trong iOS, bạn có thể sử dụng UILabel và phải sắp xếp chúng. Tất nhiên bạn sẽ có một sự liên kết hoàn hảo chỉ khi bạn sử dụng một "font chữ cố định", ví dụ như Courier New chẳng hạn. Nếu bạn phải sử dụng phông tỷ lệ, cách duy nhất là sử dụng phần mở rộng NSString + UIKit để vẽ tất cả các ký tự của chuỗi tại vị trí cố định bên trong ngữ cảnh vẽ: Vì vậy, lý tưởng là luồng: 1. tính toán độ dài chuỗi dài nhất 2. trái pad tất cả các chuỗi khác bằng cách thêm không gian 3. sau đó cho mỗi chuỗi lặp trên mỗi ký tự và vẽ nó như là một vị trí cụ thể (không sao chép và dán mã này, chỉ cần sử dụng nó để có một ý tưởng; đây là obj-c-giống như mã giả)


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

Tất nhiên dx phải được chọn theo kích thước phông chữ.

2

Tôi không nghĩ có một cách dễ dàng. Bạn có thể viết một phương pháp loại trên NSString để làm điều đó.

- (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

Nếu bạn có ý nghĩa cố định điểm chiều rộng, cả hai NSTextField (Cocoa) và UILabel (Cocoa Touch) cho phép bạn thiết lập các liên kết. Đối với NSTextView và bản vẽ tùy chỉnh, bạn sẽ cần tạo một NSParagraphStyle (chỉ AppKit) hoặc CTParagraphStyle với căn chỉnh được chỉ định.

1

Nếu bạn muốn điều này có liên kết rõ ràng với phông chữ tỷ lệ (ví dụ, không phải là phông chữ đơn cách), thì bạn nên sử dụng các chế độ xem khác nhau cho từng thành phần của chuỗi.

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

đâu mỗi một trong những [things] là khác nhau UILabel

3

đang đệm một khác nhau nhưng có thể hữu ích

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

abc ......

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

ab

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

abc. . .

thông báo rằng nhân vật đầu tiên trong đệm là một không gian

+0

câu hỏi yêu cầu pad bên trái tài liệu này nếu chỉ đệm đúng. –

Các vấn đề liên quan