Member 12677926 Ответов: 2

Вопрос _Tstof с десятичными изменения в язык и региональные стандарты


привет всем, у меня есть проблема с _tstof, когда мы меняем десятичную дробь в регионе и языке . к ,

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

это работает, когда точки в области и языка . но ее НТ, но когда она меняется в ,

Не могли бы вы помочь мне в этом вопросе?

Что я уже пробовал:

nData= (1 + str.Find(_T (","), nData+ 1 - 1));
_tstof(CString(str). Mid(nData+ 1 - 1)))

2 Ответов

Рейтинг:
2

KarstenK

Преобразование десятичных знаков сложнее, чем многие думают, потому что существуют локальные настройки. Иногда".", а иногда", " означает десятичный разделитель. Программное обеспечение должно соблюдать эту настройку. Обычно эта настройка используется при запуске программы.

Прочтите документацию по _tstof чтобы лучше понять поведение. В конце приведен пример кода, демонстрирующий явное использование некоторых языковых настроек.

Подумайте о некоторой проверке входных данных, например, об изменении", " на "." во введенной строке или о жалобе на сообщение о том, что формат данных недействителен. Это типичный код" UI behind"...


Member 12677926

есть какое-то решение ?

Рейтинг:
1

Jochen Arndt

Библиотека C использует свои собственные настройки локализации и всегда изначально является общей настройкой "C". Чтобы применить те же настройки, что и для текущего пользователя Windows, вызовите

setlocale(LC_ALL, "");
при запуске программы (например, в InitInstance для приложений Windows или поверх них main для приложений командной строки; требуется включение язык.ч).

Чтобы установить локаль для библиотеки C++, включите место действия (без ) и позвонить
std::locale::global(std::locale(""));
Это также установит локаль для библиотеки Си.

Заметим также, что CString класс использует библиотеку C для форматирования строк. Таким образом, десятичная точка, установленная вышеприведенными вызовами, также используется при передаче чисел с плавающей запятой в CString::[Append]Format().


Member 12677926

настройка на локаль вызывает какие-либо проблемы ?

Jochen Arndt

Нет,это обычное дело.

Но вы должны знать, что он делает. Если вам нужно, например, прочитать и проанализировать данные из файла, который использует точку в качестве десятичной точки, вам придется снова изменить локаль для этой задачи (или написать функцию, которая заменяет символ точки deciaml).

Member 12677926

::_tsetlocale(LC_NUMERIC, _T("C")); я держал его кривым

Jochen Arndt

Это позволит выбрать точку в качестве десятичной точки и будет использоваться по умолчанию при запуске программы.

При использовании atof (и strtod) вам просто нужно убедиться, что локаль соответствует десятичному piunt, используемому в строке.

Member 12677926

все в порядке ?