IMHO.WS

IMHO.WS (http://www.imho.ws/index.php)
-   Программирование (http://www.imho.ws/forumdisplay.php?f=40)
-   -   Формат чисел в окне CEdit (http://www.imho.ws/showthread.php?t=87837)

Buddy 22.06.2005 13:14

Формат чисел в окне CEdit
 
Подскажите, как можно выводить double числа в окно редактирования в заданом формате? Например, получается число 4.556565Е+11 и в окошко не влазит. Хочу ограничить его в "%.2е" формат. (4.56е+11).

alexey_ma 22.06.2005 17:50

Попробуй отформатировать строку перед тем как выводить её в эдит .
Примерно так:
Код:

double d =24938985938982.23985849859893345;
CString str;
str.Format("%.2e",d);
m_Edit.SetWindowText((LPCSTR)str);

результат будет "2.49e+013"

Buddy 22.06.2005 20:34

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

m_calc = calculation();
UpdateData ( FALSE );

Так вот вопрос как управлять форматом вывода в это окошко?

alexey_ma 22.06.2005 22:12

Думаю что по другому не получится. Запоминай результат, форматируй его в стринге и потом ставь стринг в эдит. Дело в том что 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);
        }
}

Как видишь формат вполне определенный.... :(

Buddy 23.06.2005 13:32

Да, это выход. Немного громоздко, а у меня там каждая миллисекунда на учете... расчет в real-time. Но вывод результата можно выплевывать по секундному таймеру. :beer:

alexey_ma 23.06.2005 13:55

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

;)


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

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