разбор NSString в Double

поэтому я хочу конвертироватьNSString удвоить. Я нашел следующий пример:

NSString * s = @"1.5e5";
NSLog(@"%lf", [s doubleValue]);

Это работает, но еслиdoubleValue не может преобразовать строку в удвоение, она просто возвращает 0.0, а это не то, что мне нужно. Мне нужен какой-то метод, который пытается преобразовать строковое представление double в double и, если указать каким-либо образом, не может ли он быть преобразован. C # имеет отличный метод

double d;
boolean Double.TryParse(str, out d)

Есть ли какой-либо метод, аналогичный приведенному выше в Задаче C? или может быть лучше использовать регулярные выражения? Однако я не знаю, как это сделать.

 Martin R12 окт. 2012 г., 21:58
@ H2CO3: в соответствии сРуководство по программированию строки / Спецификаторы формата, %f работает сfloat а такжеdouble при форматировании. Только для сканирования нужно различать.
 user52975812 окт. 2012 г., 21:50
Еще один пример того, как люди думают, что регулярное выражение является окончательным магическим решением для всего и приносит мир во всем мире ...
 user52975812 окт. 2012 г., 22:02
@MartinR Странно. Вверху на той же странице написано, что спецификаторы формата NSString поддерживают всеprintf() делает - и для printf,%f для поплавков и%lf для двойников, и их взаимозаменяемость - неопределенное поведение.
 Martin R12 окт. 2012 г., 22:09
@ H2CO3: я не эксперт в этом, ноstackoverflow.com/questions/4264127/... говорится, что%f может быть использован дляdouble, Это также то, что я понимаю изpubs.opengroup.org/onlinepubs/009695399/functions/printf.html.
 user52975812 окт. 2012 г., 21:52
Кстати, то, что вы делаете, этонеопределенное поведение. Я не удивлюсь, если он напечатал правильное значение, если вы использовали%lf вместо%f (что дляfloatс а не дляdoubles ...)

Ответы на вопрос(1)

Решение Вопроса

Вы можете использоватьNSScanner класс:

NSString *s = @"1.5e5";
NSScanner *scanner = [NSScanner scannerWithString:s];
double d;
BOOL success = [scanner scanDouble:&d];

Если вы хотите убедиться, что вся строка была отсканирована (без дополнительных символов после числа), используйте

BOOL isAtEnd = [scanner isAtEnd];

Ваш ответ на вопрос