#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];