Как дополнить строки фиксированной шириной с помощью NSMutableString?

Я пытаюсь записать строку в текстовый файл. Этот текстовый файл будет затем прочитан другой программой. Эта вторая программа ожидает, что различные "поля" в текстовом файле будут иметь фиксированную ширину. Поэтому, когда я пишу текстовый файл с моим приложением, мне нужно будет добавить пробелы между моими фактическими данными, чтобы все выстроилось правильно. Как мне добавить эти пробелы?


До сих пор я пытался написать функцию, которая принимает исходную строку и целевую длину в качестве входных данных. Если цель длиннее исходного, она просто добавляет " ". Код для этой процедуры ниже:

- (NSString *) makeStringFrom:(NSString *)source withLength:(NSInteger)length
{
    // Method to add spaces to the end of a string to get it to a certain length
    if ([source length] > length)
    {
        // String is too long - throw warning and send it back
        NSLog(@"Warning - string is already longer than length supplied.  Returning source string");
        return source;
    }
    else if ([source length] == length)
    {
        // String is already correct length, so just send it back
        return source;
    }
    else
    {
        // String is too short, need to add spaces
        NSMutableString *newString = [[NSMutableString alloc] initWithString:source];
        NSLog(@"newString initial length = %d",[newString length]);
        for (int current = [source length]; current < length; current ++)
        {
            [newString stringByAppendingString:@" "];
            NSLog(@"hit");
        }

        NSLog(@"target length = %d.  newString length = %d",length,[newString length]);
        return newString;
    }
}

Это, очевидно, не работает. Длина строки, которую я получаю в ответе, не меняется от длины предоставленной строки, даже когда NSLog(@"hit"); работает несколько раз.

3 ответа

Решение

Есть stringByPaddingToLength:withString:startingAtIndex: метод на NSString это делает только это.

Вы сделали глупую ошибку здесь

 [newString stringByAppendingString:@" "];

Это возвращает новую строку, и это не влияет на объект вызывающего. Вы должны хранить это

newString=[newString stringByAppendingString:@" "];

или просто

[newString appendString:@" "];

Вы хотите изменить:

[newString stringByAppendingString:@" "];

в:

newString = [newString stringByAppendingString:@" "];
Другие вопросы по тегам