Текст(TCHAR) в число
От: Аноним  
Дата: 14.01.10 21:27
Оценка:
Помогите пожалуйста, чёт туплю.
Есть переменная TCHAR x. И там данные, ну например v1.2.3456
Мне нужно извлечь 1.2. И записать в числовую переменную.
Как это сделать?

Пока вывожу вот так:
cout << x[1] << x[2] << x[3];
Re: Текст(TCHAR) в число
От: c-smile Канада http://terrainformatica.com
Дата: 15.01.10 00:51
Оценка: -1
Здравствуйте, Аноним, Вы писали:

А>Помогите пожалуйста, чёт туплю.

А>Есть переменная TCHAR x. И там данные, ну например v1.2.3456
А>Мне нужно извлечь 1.2. И записать в числовую переменную.
А>Как это сделать?

А>Пока вывожу вот так:

А>
А>cout << x[1] << x[2] << x[3];
А>


int v1,v2,v3;
_stscanf(str,"v%d.%d.%d",&v1,&v2,&v3);


http://msdn.microsoft.com/en-us/library/zkx076cy(VS.71).aspx
http://www.cplusplus.com/reference/clibrary/cstdio/sscanf/
Re: _ttoi
От: Alexander G Украина  
Дата: 15.01.10 08:20
Оценка:
Русский военный корабль идёт ко дну!
Re: Текст(TCHAR) в число
От: Кодт Россия  
Дата: 15.01.10 08:57
Оценка: +1 -1
Здравствуйте, Аноним, Вы писали:

А>Есть переменная TCHAR x. И там данные, ну например v1.2.3456


На самом деле, TCHAR x[...] — т.е. массив символов (строка), а не один символ

А>Мне нужно извлечь 1.2. И записать в числовую переменную.

LPCTSTR x = _T("v1.2.3456");

// копируем три символа с известной позиции
TCHAR tmp[4]; _tcsncpy(tmp, x+1, 3); tmp[3]=0;

// устанавливаем сишную локаль (чтобы десятичная точка была именно точкой, а не запятой, как в русской локали)
const char* old_locale = setlocale(LC_NUMERIC,NULL);
setlocale(LC_NUMERIC,"C");

// читаем число из строки
double n = _ttof(tmp);

// восстанавливаем старую локаль
setlocale(LC_NUMERIC,old_locale);

В принципе, с самого начала в программе установлена локаль Си. Но мало ли, кто-то где-то её переключил.
Перекуём баги на фичи!
Re: Текст(TCHAR) в число
От: rg45 СССР  
Дата: 15.01.10 08:58
Оценка: 12 (1) :)
Здравствуйте, Аноним, Вы писали:

А>Помогите пожалуйста, чёт туплю.

А>Есть переменная TCHAR x. И там данные, ну например v1.2.3456
А>Мне нужно извлечь 1.2. И записать в числовую переменную.
А>Как это сделать?

Еще вариант — регулярные выражения:
#include <stdexcept>
#include <string>
#include <boost/regex.hpp>

std::string extract_version(const std::string& input)
{
  static boost::regex regex("^\\D*(\\d+\\.\\d+).*");
  boost::smatch matches;
  
  if(!boost::regex_match(input, matches, regex))
    throw std::runtime_error("Unexpected version format: " + input);
    
  return matches[1];    
}
--
Справедливость выше закона. А человечность выше справедливости.
Re[2]: Текст(TCHAR) в число
От: sraider http://dvinogradov.blogspot.com
Дата: 15.01.10 20:29
Оценка: 3 (1)
К>
К>LPCTSTR x = _T("v1.2.3456");

К>// копируем три символа с известной позиции
К>TCHAR tmp[4]; _tcsncpy(tmp, x+1, 3); tmp[3]=0;

К>// устанавливаем сишную локаль (чтобы десятичная точка была именно точкой, а не запятой, как в русской локали)
К>const char* old_locale = setlocale(LC_NUMERIC,NULL);
К>setlocale(LC_NUMERIC,"C");

К>// читаем число из строки
К>double n = _ttof(tmp);

К>// восстанавливаем старую локаль
К>setlocale(LC_NUMERIC,old_locale);
К>

К>В принципе, с самого начала в программе установлена локаль Си. Но мало ли, кто-то где-то её переключил.

кто-то где-то её переключил... между вызовом setlocale и _ttof (в другом потоке)
Re[2]: Текст(TCHAR) в число
От: c-smile Канада http://terrainformatica.com
Дата: 15.01.10 20:42
Оценка: :))
Здравствуйте, rg45, Вы писали:

R>Еще вариант — регулярные выражения:


Ну ё моё... просили же "нужно извлечь 1.2. И записать в числовую переменную."
Re[3]: Текст(TCHAR) в число
От: Кодт Россия  
Дата: 15.01.10 22:16
Оценка: 1 (1)
Здравствуйте, sraider, Вы писали:

S>кто-то где-то её переключил... между вызовом setlocale и _ttof (в другом потоке)


_configthreadlocale(_ENABLE_PER_THREAD_LOCALE) — единожды в том потоке, где идут упражнения с локалью.

Правда, не знаю — совместимо ли это с ISO или POSIX, или же MSVC-specific?
Перекуём баги на фичи!
Re[3]: Текст(TCHAR) в число
От: rg45 СССР  
Дата: 16.01.10 00:26
Оценка: +1
Здравствуйте, c-smile, Вы писали:

R>>Еще вариант — регулярные выражения:


CS>Ну ё моё... просили же "нужно извлечь 1.2. И записать в числовую переменную."


Возможно, я чего-то недопонял. Ну допустим даже так, все равно, сначала нужно извлечь, и только потом записать. Так что можно считать, что на часть вопроса я ответил.

С другой стороны, вопрос сформулирован достаточно противоречиво:

Пока вывожу вот так:

cout << x[1] << x[2] << x[3];

Как я полагаю, "запись в числовую переменную" является не самоцелью, а скорее способом ее достижения.
--
Справедливость выше закона. А человечность выше справедливости.
Re[4]: Текст(TCHAR) в число
От: c-smile Канада http://terrainformatica.com
Дата: 16.01.10 03:39
Оценка:
Здравствуйте, rg45, Вы писали:

CS>>Ну ё моё... просили же "нужно извлечь 1.2. И записать в числовую переменную."


R>Возможно, я чего-то недопонял. Ну допустим даже так, все равно, сначала нужно извлечь, и только потом записать. Так что можно считать, что на часть вопроса я ответил.


Ну блин... А зачем "сначала нужно извлечь", а "только потом записать"?
А сразу нельзя извлекая писать? Зачем там по дороге еще аллокации строк?
Re[5]: Текст(TCHAR) в число
От: rg45 СССР  
Дата: 16.01.10 10:24
Оценка: 3 (1)
Здравствуйте, c-smile, Вы писали:

CS>Ну блин... А зачем "сначала нужно извлечь", а "только потом записать"?

CS>А сразу нельзя извлекая писать? Зачем там по дороге еще аллокации строк?

Ну хотя бы потому, что саму идею использования переменных вещественных типов в качестве контейнеров для храниения версии лично я не считаю удачной. Ну не собирается же он, в самом деле, выполнять арифметические операции с версией с плавающей точкой!

А насчет лишних аллокаций: избавиться от них — тривиальная задача. Только разговор об этом без данных профайлера я считаю преждевременным.
--
Справедливость выше закона. А человечность выше справедливости.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.