Странное поведение NSString с formatString - PullRequest
4 голосов
/ 13 декабря 2011

Сегодня я столкнулся с довольно странной проблемой. У меня есть этот статический метод (часть только что созданного исходного файла CommonUtilities, который собирает все мелкие общие методы, к которым я хотел бы получить доступ в любом месте моего кода, как я обычно это делаю ...)

Я просто хочу преобразовать число в его научную ценность, используя международную систему обозначений (k, M, G и т. Д.)

Вот код:

+ (NSString*)scientificFormatedStringForValue:(NSNumber*)value andUnits:(NSString*)_units
{
    NSMutableString* retStr = [NSMutableString string];
    long long longValue = [value longLongValue];
    if (longValue > 1000000000)
    {
        [retStr appendFormat:@"%d Md%@", longValue / 1000000000, _units];
    }
    else if (longValue > 1000000)
    {
        [retStr appendFormat:@"%d M%@", longValue / 1000000, _units];
    }
    else if (longValue > 1000)
    {
        [retStr appendFormat:@"%d k%@", longValue / 1000, _units];
    }
    else
    {
        [retStr appendFormat:@"%d %@", longValue, _units];
    }
    return retStr;
}

Это довольно легко, верно? Хорошо, вот сделка: _units не конвертируется должным образом.

В моем примере я использую это:

[CommonUtilities scientificFormatedStringForValue:[NSNumber numberWithLongLong:longValue] andUnits:@"€"];

Я получаю (null) как _units для форматированной строки. Если я напечатаю значение _units, это точка. Итак, чтобы попытаться отладить это, я просто заменил:

[retStr appendFormat:@"%d M%@", longValue / 1000000, _units];

с

[retStr appendFormat:@"%d M%@", longValue / 1000000, @"€"];

Все еще не работает. Он попытался передать один символ (думая, что, возможно, € нужно конвертировать в какой-то материал UTF8 или что-то в этом роде. Поэтому я изменил вызывающий метод на:

[CommonUtilities scientificFormatedStringForValue:[NSNumber numberWithLongLong:longValue] andUnits:@"e"];

Все еще дерьмовые вещи. Я даже изменил @ "€" на [NSString stringWithString: @ "€"], но результат все тот же! Я не могу понять, что здесь не так, я застрял.

Я подумал о проблеме в кодировке исходного файла, поэтому я удалил ее и создал заново, но проблема все та же ...

Если у кого-нибудь есть хоть малейшая подсказка, это было бы очень полезно. Спасибо, ребята ...

1 Ответ

3 голосов
/ 13 декабря 2011

Проблема в том, что вы пытаетесь записать int (32 бита), но вы передаете long long (64 бита), и он читает первые 4 байта вашего longValue для value и последние 4 байта для _units. Так уж получилось, что значение в младших байтах вашего long long равно nil и не вызвало сбоя. Вам нужно использовать %lld вместо %d для правильной печати длинного значения.

    longValue       NSString*
/---------------\ /---------\
|   8 bytes     | | 4 bytes |
\---------------/ \---------/
^^^^^^^^ ^^^^^^^^  ^^^^^^^^^
   %d       %@        This gets ignored.
(reads 4) (reads this 4 bytes which happen to be nil)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...