2009-05-19 42 views
10

Tôi muốn thay đổi ký tự đầu tiên của NSString thành chữ hoa. Thật không may, - (NSString *)capitalizedString chuyển đổi chữ cái đầu tiên của mỗi từ thành chữ hoa. Có cách nào dễ dàng để chuyển đổi chỉ một ký tự thành chữ hoa?Cách dễ dàng để đặt một ký tự duy nhất của NSString thành chữ hoa

Tôi hiện đang sử dụng:

NSRange firstCharRange = NSMakeRange(0,1); 
NSString* firstCharacter = [dateString substringWithRange:firstCharRange]; 
NSString* uppercaseFirstChar = [firstCharacter originalString]; 
NSMutableString* capitalisedSentence = [originalString mutableCopy]; 
[capitalisedSentence replaceCharactersInRange:firstCharRange withString:uppercaseFirstChar]; 

Mà dường như một chút phức tạp nhưng ít nhất làm cho không có giả định về mã hóa của chuỗi unicode tiềm ẩn.

+0

Có một cuộc thảo luận tốt về việc ánh xạ trường hợp tại đây: http://userguide.icu-project.org/transforms/casemappings Trong thuật ngữ của trang đó, là những gì bạn muốn làm một ánh xạ ký tự đơn giản? – sbooth

+0

@sbooth - đúng vậy. –

Trả lời

3

NSString là không thay đổi, những gì bạn có vẻ là một cách hay để làm những gì bạn muốn làm. Việc triển khai (NSString*)uppercaseString và các phương thức tương tự có thể trông rất giống với những gì bạn đã viết, khi chúng trả về một NSString mới thay vì sửa đổi phương thức bạn đã gửi thư.

+0

có vẻ như dấu gạch dưới được coi là dấu tách hợp lệ nên foo_bar sẽ được chuyển thành "Foo_Bar" – dwery

17

cách tiếp cận Rất giống với những gì bạn có, nhưng một chút cô đặc hơn:

NSString *capitalisedSentence = 
    [dateString stringByReplacingCharactersInRange:NSMakeRange(0,1) 
    withString:[[dateString substringToIndex:1] capitalizedString]]; 
+2

vâng, được tối ưu hóa cho cr/lf ;-) Tôi muốn để trình tối ưu hóa tạm thời hết thời gian của tôi. –

1

Tôi đã có một yêu cầu tương tự, nhưng nó đã cho các ký tự trong chuỗi. tôi giả định này là chỉ số của mình vào nhân vật bạn muốn chữ hoa này làm việc cho tôi:

curword = [curword stringByReplacingCharactersInRange:NSMakeRange(i,1) 
      withString:[[curword substringWithRange:NSMakeRange(i, 1)] capitalizedString]]; 
1

Nếu bạn hồ sơ những giải pháp mà họ đang chậm hơn sau đó làm điều này:

NSMutableString *capitolziedString = [NSMutableString stringWithString:originalString]; 
NSString *firstChar = [[capitolziedString substringWithRange:NSMakeRange(0,1)] uppercaseString]; 
[capitolziedString replaceCharactersInRange:NSMakeRange(0, 1) withString:firstChar]; 

trong thử nghiệm trên một iphone 4 chạy iOS 5:
giải pháp @ doomspork chạy trong 0.115750 ms
trong khi ở trên chạy trong 0,064250 ms;

trong thử nghiệm trên một Simulator chạy iOS 5:
@ giải pháp doomspork của chạy trong 0,021232 ms
trong khi ở trên chạy trong 0,007495 ms;

+0

Nếu chức năng này được chạy liên tục, có thể lo ngại rằng giải pháp của bạn chạy trong khoảng 1/3 đến 1/2 thời gian, nhưng vì chúng tôi đang tìm kiếm giải pháp "dễ nhất", có thể được đọc nhiều nhất dễ đọc. – ArtOfWarfare

+0

@ArtOfWarfare Giải pháp của tôi không khó đọc nhiều hơn, và nếu bạn định đóng gói giải pháp bên trong một danh mục, bạn sẽ không bao giờ nhìn lại, thì bạn nên xây dựng giải pháp nhanh nhất để không có một số vấn đề hiệu suất lạ sau này bởi vì bạn đã viết mã không hiệu quả. – odyth

1

Nhằm để có thể đọc tối đa, tạo ra một category trên NSString và cung cấp cho nó chức năng này:

NSString *capitalizeFirstLetter(NSString *string) { 
    NSString *firstCapital = [string substringToIndex:1].capitalizedString; 
    return [string stringByReplacingCharactersInRange:NSMakeRange(0, 1) withString:firstCapital]; 
} 

Sau đó, trong mã của bạn nơi bạn muốn nó:

NSString *capitalizedSentence = capitalizeFirstLetter(dateString); 

loại mã này hiếm khi thuộc về nơi bạn cần và thường phải được tính vào một lớp tiện ích hoặc category để cải thiện mức độ dễ đọc.

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