Независимый от локали “atof”?

Можно также связаться на заголовке раздела:

Оглавление

Introduction
Some background
On a more personal note
...the rest of the table of contents... ...the document body...

Introduction

...section 1...

Some background

...section 2...

On a more personal note

...section 2.1... [...]

Источник: http://www.w3.org/TR/REC-html40/struct/links.html

21
задан Community 23 May 2017 в 10:32
поделиться

5 ответов

Вы всегда можете использовать (по модулю проверки ошибок):

#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 - минутам (но я думаю, вы это уже знали).

16
ответ дан 29 November 2019 в 21:41
поделиться

Гадкий решение I ' Сделать один раз - это использовать sprintf () 0.0f и взять второй символ из вывода. Затем во входной строке замените "." этим персонажем. Это решает проблему с запятыми, но также будет работать, если языковой стандарт определяет другие десятичные разделители.

7
ответ дан 29 November 2019 в 21:41
поделиться

Любая причина, по которой вы не можете выполнить setlocale «C» перед atof и восстановить локаль после этого? Может я неправильно понял вопрос ...

2
ответ дан 29 November 2019 в 21:41
поделиться

Вы можете перебирать все символы в массиве и заменять любые нечисловые значения на . символ, который должен работать, пока координаты указаны в формате число-одиночный_делимитер_число .

0
ответ дан 29 November 2019 в 21:41
поделиться

Вам действительно нужно получить локаль для числовых значений? Если не

setlocale(LC_ALL|~LC_NUMERIC, "");

или эквивалентное использование конструктора std :: locale.

0
ответ дан 29 November 2019 в 21:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: