Вы всегда можете использовать (по модулю проверки ошибок):
#include <sstream>
...
float longitude = 0.0f;
std::istringstream istr(pField);
istr >> longitude;
Стандартные iostreams по умолчанию используют глобальную локаль (которая, в свою очередь, должна быть инициализирована для классической (США) локали). Таким образом, вышеприведенное должно работать в целом, если кто-то ранее не изменил глобальную локаль на что-то другое, даже если вы работаете на неанглоязычной платформе. Чтобы быть абсолютно уверенным, что используется требуемый языковой стандарт, создайте конкретный языковой стандарт и «наполните» поток этим языковым стандартом, прежде чем читать из него:
#include <sstream>
#include <locale>
...
float longitude = 0.0f;
std::istringstream istr(pField);
istr.imbue(std::locale("C"));
istr >> longitude;
В качестве примечания, я обычно использовал регулярные выражения для проверки полей NMEA, извлечения различных частей поля в виде захватов, а затем преобразования различных частей с использованием вышеуказанного метода. Часть перед десятичной точкой в поле долготы NMEA фактически отформатирована как «DDDMM.mmm ..», где DDD соответствуют градусам, MM.mmm - минутам (но я полагаю, вы уже это знали).