Преобразование размера файла в соответствующую форму показывает странный выход

У меня серьезные проблемы с обращением.
Первое решение, которое я попробовал, это код ниже ::

    NSByteCountFormatter *formatter = [[NSByteCountFormatter alloc] init];
    formatter.allowsNonnumericFormatting = NO;

    return [NSByteCountFormatter stringFromByteCount:valueFromAPI countStyle:NSByteCountFormatterCountStyleMemory];

Второе решение, которое я попробовал, это код ниже ::

double convertedValue = (double)valueFromAPI;
DebugLog(@"%f",convertedValue);

int multiplyFactor = 0;

NSArray *tokens = @[@"bytes",@"KB",@"MB",@"GB",@"TB",@"PB",@"EB",@"ZB",@"YB"];

while (convertedValue >= 1024) {
    convertedValue /= 1024;
    multiplyFactor++;
}
return [NSString stringWithFormat:@"%4.0f %@",convertedValue, tokens[multiplyFactor]];

Но оба возвращают один и тот же странный результат. Проверив множество случаев, я обнаружил, что это происходит только тогда, когда размер файла мал.

Изображение отображает проблему :
Введите описание изображения здесь

Изображение ясно показывает, что возвращенные размеры файлов находятся в отрицательном и в экзобайте (EB), которые на самом деле являются просто изображениями, выбранными из UIImagePickerController.
Во втором решении оказалось, что при конвертации из long longв double` он конвертируется в расширенный формат, что создает проблему.

Я не знаю, как это решить. Пожалуйста, помогите мне. Спасибо заранее.

3 ответа

  1. Попробуйте этот метод.

    Использование :

    #import "FileSize.h"
    
    ...
    
    unsigned long long fileSize = ...; 
    NSString *compressedFilesSize = [FileSize convertSize:fileSize];     
    NSLog(@"File size : %@", compressedFilesSize);
    
  2. Из разговора с вами через комментарии Вы заявили, что valueFromAPIэтоNSString *, в этом случае проблема заключается в том, что вы преобразуете адрес строки, а не значение, которое она содержит:

    double convertedValue = (double)valueFromAPI;
    

    Вы хотите:

    double convertedValue = [valueFromAPI doubleValue];
    
  3. - (NSString*)transformedValue:(double) valueFromAPI
    {
          NSByteCountFormatter *formatter = [[NSByteCountFormatter alloc] init];
          formatter.allowsNonnumericFormatting = NO;
          return [NSByteCountFormatter valueFromAPI countStyle:NSByteCountFormatterCountStyleMemory];
    }
    

    Я конвертировал valueFromAPI в ‘long long’, а затем в’ double’, что создало проблему. Поэтому я преобразовал NSString в double и непосредственно передал его. Теперь мои размеры файлов отображаются правильно.

    Спасибо всем за ваши предложения.