imho.ws
IMHO.WS  

Вернуться   IMHO.WS > Компьютеры > Программирование
Опции темы
Старый 22.06.2005, 13:14     # 1
Buddy
Guest
 
Сообщения: n/a

Формат чисел в окне CEdit

Подскажите, как можно выводить double числа в окно редактирования в заданом формате? Например, получается число 4.556565Е+11 и в окошко не влазит. Хочу ограничить его в "%.2е" формат. (4.56е+11).
 
Старый 22.06.2005, 17:50     # 2
alexey_ma
Member
 
Регистрация: 10.03.2002
Адрес: Israel
Сообщения: 245

alexey_ma Нимб уже пробиваетсяalexey_ma Нимб уже пробивается
Попробуй отформатировать строку перед тем как выводить её в эдит .
Примерно так:
Код:
double d =24938985938982.23985849859893345;
CString str;
str.Format("%.2e",d);
m_Edit.SetWindowText((LPCSTR)str);
результат будет "2.49e+013"
__________________
Best Regards
alexey_ma вне форума  
Старый 22.06.2005, 20:34     # 3
Buddy
Guest
 
Сообщения: n/a

У меня немного другая проблема. Есть переменная m_calc - принадлежащая окну CEdit. На начальном этапе я ввожу туда значение, запускаю счет. По мере счета значение m_calc изменяется и показывается в том же Edit окне.

m_calc = calculation();
UpdateData ( FALSE );

Так вот вопрос как управлять форматом вывода в это окошко?
 
Старый 22.06.2005, 22:12     # 4
alexey_ma
Member
 
Регистрация: 10.03.2002
Адрес: Israel
Сообщения: 245

alexey_ma Нимб уже пробиваетсяalexey_ma Нимб уже пробивается
Думаю что по другому не получится. Запоминай результат, форматируй его в стринге и потом ставь стринг в эдит. Дело в том что UpdateData приводит к вызову соответствующей функции DDX_Text. А она вызывает подходящую AfxText.... В твоем случай для агумента float будет вызвана
void AFXAPI AfxTextFloatFormat(CDataExchange* pDX, int nIDC,void* pData, double value, int nSizeGcvt)
(файл ....\Microsoft Visual Studio\VC98\MFC\SRC\DLGFLOAT.CPP)
Код:
void AFXAPI AfxTextFloatFormat(CDataExchange* pDX, int nIDC,
	void* pData, double value, int nSizeGcvt)
{
	ASSERT(pData != NULL);

	HWND hWndCtrl = pDX->PrepareEditCtrl(nIDC);
	TCHAR szBuffer[32];
	if (pDX->m_bSaveAndValidate)
	{
		::GetWindowText(hWndCtrl, szBuffer, _countof(szBuffer));
		double d;
		if (!_AfxSimpleFloatParse(szBuffer, d))
		{
			AfxMessageBox(AFX_IDP_PARSE_REAL);
			pDX->Fail();            // throws exception
		}
		if (nSizeGcvt == FLT_DIG)
			*((float*)pData) = (float)d;
		else
			*((double*)pData) = d;
	}
	else
	{
		_stprintf(szBuffer, _T("%.*g"), nSizeGcvt, value);
		AfxSetWindowText(hWndCtrl, szBuffer);
	}
}
Как видишь формат вполне определенный....
__________________
Best Regards
alexey_ma вне форума  
Старый 23.06.2005, 13:32     # 5
Buddy
Guest
 
Сообщения: n/a

Да, это выход. Немного громоздко, а у меня там каждая миллисекунда на учете... расчет в real-time. Но вывод результата можно выплевывать по секундному таймеру.
 
Старый 23.06.2005, 13:55     # 6
alexey_ma
Member
 
Регистрация: 10.03.2002
Адрес: Israel
Сообщения: 245

alexey_ma Нимб уже пробиваетсяalexey_ma Нимб уже пробивается
Не . Медленее не будет, скорее наоборот. UpdateData ,в конечном счёте, то же самое делает, только вызывает еще несколько допольнительных функций. Можешь для скорости не использовать CString, а форматировать с помощью sprintf и для установки текста в окно используй прямой вызов API -- ::SetWindowText(hWnd,Text).
Real-time лучше вообще без MFC писать.

__________________
Best Regards
alexey_ma вне форума  


Ваши права в разделе
Вы НЕ можете создавать новые темы
Вы не можете отвечать в темах.
Вы НЕ можете прикреплять вложения
Вы НЕ можете редактировать свои сообщения

BB код Вкл.
Смайлы Вкл.
[IMG] код Выкл.
HTML код Выкл.

Быстрый переход


Часовой пояс GMT +4, время: 03:13.




Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.