2011-01-20 3 views
1

я могу воспроизвести следующий C#/NET:.Net против какао Струнные Форматы

//A 
String.Format("There are {0} cats in my {1} and no {2}", 2, "house", "dogs"); 

в Objective-C/Cocoa:

//B 
[NSString stringWithFormat:@"There are %d cats in my %@ and no %@", 2, "house", "dogs"]; 

Но я не могу это сделать:

//C 
String.Format("I have {0} dogs in my house. My {0} dogs are very nice, but it is hard to walk {0} dogs at the same time.", numDogs); 

в Objective-C:

//D 
[NSString stringWithFormat:@"I have %d dogs in my house. My %d dogs are very nice, but it is hard to walk %d dogs at the same time.", numDogs]; 

потому что он использует формат printf или что-то еще. Есть ли более продвинутый способ сделать это? Есть ли способ сделать KVC при строчном разборе?

Это технически то, что я хотел:

[player setValue:@"Jimmy" [email protected]"PlayerName"]; 
//later 
[NSString stringWithMagicFormat:@"<PlayerName> sat on a bench in the middle of winter, and <GenderPronoun> felt very cold." andPlayer:player]; 
// or 
[NSString stringwithMagicFormat: playerEnteredStringWithTagInIt andPlayer:player]; 

Но я соглашайтесь: (см. man 3 printf)

String.Format(playerEnteredStringWithTagInIt, player.PlayerName, player.PlayerGender, player.GenderPronoun, ...); 

Спасибо,

ответ

5
[NSString stringWithFormat:@"I have %1$d dogs in my house. My %1$d dogs are very nice, but it is hard to walk %1$d dogs at the same time.", numDogs]; 

+0

+1 internets DUH. Я соглашусь с этим, если никто ничего не расскажет о KVC. –

+0

@Wevah, это не совместимо с C99? [«Стандарт C99 не включает стиль с использованием« $ », который исходит из спецификации Single Unix.»] (Http://linux.die.net/man/3/printf) –

+0

Зачем это нужно? Не можете ли вы использовать 'gnu99'? Если вы компилируете для OS X (который я предполагаю, так как вы отметили его «какао»), на странице руководства OS X нет этого оговорки. – Wevah

1

Если вы используете usin g NSString и stringWithFormat:, то я не думаю, что соответствие C99 действительно применимо: в то время как stringWithFormat: похож на printf, у него есть своя реализация, которая была вокруг какое-то время.

NSLocalizedString() макрос на самом деле делает это за вас автоматически. Например, у меня есть следующий код:

@implementation MDAppController 

- (id)init { 
    if (self = [super init]) { 
     NSArray *catsArray = [NSArray array]; 
     NSString *string = [NSString stringWithFormat: 
     NSLocalizedString(@"There are %lu %@ %@ in my home.", @"no comment"), 
     (unsigned long)[catsArray count], 
          NSLocalizedString(@"red", @""), 
          NSLocalizedString(@"cats", @"")]; 
     NSLog(@"string == %@", string); 
    } 
    return self; 
} 

@end 

Если я после этого запустить следующее в Терминале

/usr/bin/genstrings ~/Developer/NSLocalizedString/MDAppController.m -o ~/Desktop/Strings

(Хотя я предпочитаю просто перетащить значок прокси в заголовке окна на этот Капля AppleScript. Я держу в своей доке: GenerateStrings.app. Она записывает сгенерированные файлы .strings в ~/Desktop/Strings/(при необходимости создавая). Вы можете отредактировать скрипт, отбросив его в редакторе AppleScript).

Он сгенерирует файл UTF16 Localizable.strings, который вы можете добавить в свой проект. В нем будет иметь следующее:

English.lproj/Localizable.strings

/* No comment provided by engineer. */ 
"cats" = "cats"; 

/* No comment provided by engineer. */ 
"red" = "red"; 

/* no comment */ 
"There are %lu %@ %@ in my home." = "There are %1$lu %[email protected] %[email protected] in my home."; 

Продублируйте его в папку проекта к югу на испанском языке и изменить порядок элементов по мере необходимости (так как в испанских прилагательных обычно приходят после существительного):

Spanish.lproj/Локализованный.Строки

/* No comment provided by engineer. */ 
"cats" = "gatos"; 

/* No comment provided by engineer. */ 
"red" = "rojos"; 

/* no comment */ 
"There are %lu %@ %@ in my home." = "Está %1$lu %[email protected] %[email protected] en mi casa."; 

Когда английский язык мой основной (верхний) язык в языке & Текст прив панели:

1/20/2011 12:59:37 PM NSLocalizedString[1777] string == There are 0 red cats in my home.

Когда испанский мой основной (верхний) язык в языке & Текст прив панели:

1/20/2011 12:37:02 PM NSLocalizedString[1702] string == Está 0 gatos rojos en mi casa.

Файлы .strings: в определенном смысле пары значений.

Для получения дополнительной информации см Resource Programming Guide: String Resources

0

Я люблю ответы каждого, но я только что провел 15 минут в Документах и ​​нашел ответ, который я искал ... Вздохнув, RTM! Вот мое решение, если кто-то ищет что-то подобное.

// Put this in a category of NSString 
- (NSString*) stringByReplacingOccurrencesOfKeysWithValues:(NSDictionary*)keyValuePairs 
{ 
    NSString *fStr = self; 
    if (keyValuePairs) { 
     for (NSString *key in [keyValuePairs allKeys]) { 
      NSString *value = [NSString stringWithFormat:@"%@",[keyValuePairs valueForKey:key]]; 
      fStr = [fStr stringByReplacingOccurrencesOfString:key withString:value]; 
     } 
    } 
    return fStr; 
} 

Кажется, работает отлично, это был мой тестовый код:

// testing NSString+Keys 
NSMutableDictionary *mud = [NSMutableDictionary dictionaryWithCapacity:1]; 
[mud setValue:@"Jimmy" forKey:@"{PlayerName}"]; 
[mud setValue:[NSNumber numberWithInt:97] forKey:@"{HitPoints}"]; 
[mud setValue:[NSNumber numberWithFloat:1.0678f] forKey:@"{meters}"]; 
NSString *mystr = [@"Help me {PlayerName} before it is too late! I only have {HitPoints}hp left! And I am {meters}m away! {PlayerName} hurry!" stringByReplacingOccurrencesOfKeysWithValues:mud]; 
NSLog(mystr); 

Выход был:

Помогите мне Джимми, прежде чем это слишком поздно! У меня осталось только 97 л.с.! И я на расстоянии 1.0678м! Джимми спешит!

Смежные вопросы