Objective-c преобразовать Long и float в строку

#objective-c #nsstring

#objective-c #nsstring

Вопрос:

Мне нужно преобразовать два числа в строку в Objective-C.

Одно из них является длинным числом, а другое — с плавающей точкой.

Я искал в Интернете решение, и все им пользуются stringWithFormat: , но я не могу заставить его работать.

Я пытаюсь

 NSString *myString = [NSString stringWithFormat: @"%f", floatValue]
  

для 12345678.1234 и получает «12345678.00000» в качестве выходных данных

и

 NSString *myString = [NSString stringWithFormat: @"%d", longValue]
  

Может кто-нибудь показать мне, как правильно использовать stringWithFormat:?

Ответ №1:

В этой статье обсуждается, как использовать различные строки форматирования для преобразования чисел / объектов в экземпляры NSString:

Руководство по программированию строк: форматирование строковых объектов

Которые используют указанные здесь форматы:

Руководство по программированию строк: спецификаторы формата строки

Для вашего float вы бы хотели:

 [NSString stringWithFormat:@"%1.6f", floatValue]
  

И для вашего длинного:

 [NSString stringWithFormat:@"%ld", longValue] // Use %lu for unsigned longs
  

Но, честно говоря, иногда проще просто использовать NSNumber класс:

 [[NSNumber numberWithFloat:floatValue] stringValue];
[[NSNumber numberWithLong:longValue] stringValue];
  

Комментарии:

1. Это хороший вопрос. Число справа от десятичной дроби указывает, до скольких цифр следует округлить значение с плавающей запятой. Для float 1,123456 строка формата %1.2f вернет 1,122, а строка формата %1.4f вернет 1,1234

Ответ №2:

Значение FLOAT должно быть двойным. По крайней мере, это компилируется правильно и делает то, что ожидается на моей машине, поплавки могут хранить только около 8 десятичных цифр, а ваш номер 12345678.1234 требует большей точности, чем это, следовательно, только около 8 наиболее значимых цифр хранятся в float.

 double floatValue = 12345678.1234;
NSString *myString = [NSString stringWithFormat: @"%f", floatValue];
  

приводит к

 2011-11-04 11:40:26.295 Test basic command line[7886:130b] floatValue = 12345678.123400
  

Комментарии:

1. Поскольку я не могу прокомментировать ответ мистера Крейга, я помещу его здесь. использование %1.6f не работает само по себе. Он отлично работает, если значение float равно двойному.

2. Можете ли вы быть более конкретным? Формат string %1.6f отлично работает со значениями с плавающей точкой.

3. Ну, вот float floatValue = 12345678.1234; NSString *myString = [NSString stringWithFormat: @"%1.6f", floatValue]; результаты 2011-11-04 12:25:43.133 Тест базовой командной строки [15718:707] floatValue = 12345678.000000 на моей машине.

4. в моей программе происходит то же самое

5. Я понимаю разницу между float и double. И на самом деле, это суть этой проблемы. Значения с плавающей запятой недостаточно велики, чтобы содержать 12 десятичных знаков, поскольку значение с плавающей запятой имеет 6 бит экспоненты и 23 бита для фракции (24 реальных бита точности). Но 24 бита могут хранить примерно 7 десятичных чисел (7.229, если быть точным), что является первой частью числа. Следовательно, для хранения 12345678.1234 необходимо использовать double. Это хорошо объяснено на странице wikepedia, которую вы предоставили. Я думаю, что мое решение в любом случае работает в xcode.

Ответ №3:

Вы должны использовать NSNumberFormatter, например:

     NSNumberFormatter * nFormatter = [[NSNumberFormatter alloc] init];
    [nFormatter setNumberStyle:NSNumberFormatterDecimalStyle];
    NSNumber *num = [nFormatter numberFromString:@"12345678.1234"];
    [nFormatter release];