CComVariant.ChangeType(VT_R8) Странно однако
От: vaad not time
Дата: 16.04.03 08:27
Оценка:
_bstr_t m="13,4444";
CComVariant cVar=(BSTR)m;
cVar.ChangeType(VT_R8);
CString str;
str.Format("%f",cVar.dblVal);
::AfxMessageBox(str,MB_OK,NULL);

Все работает, но что ж мне теперь все числа писать через запятую? Вариант
 m="13.4444"
......

не проходит
Re: CComVariant.ChangeType(VT_R8) Странно однако
От: Plutonia Experiment Беларусь http://blogs.rsdn.org/ikemefula
Дата: 16.04.03 08:31
Оценка:
Здравствуйте, vaad, Вы писали:

Смотри локали свои. Это в них сидит

V>
V>_bstr_t m="13,4444";
V>CComVariant cVar=(BSTR)m;
V>cVar.ChangeType(VT_R8);
V>CString str;
V>str.Format("%f",cVar.dblVal);
V>::AfxMessageBox(str,MB_OK,NULL);
V>

V>Все работает, но что ж мне теперь все числа писать через запятую? Вариант
V>
V> m="13.4444"
V>......
V>

V>не проходит
Re: CComVariant.ChangeType(VT_R8) Странно однако
От: Tom Россия http://www.RSDN.ru
Дата: 16.04.03 08:34
Оценка:
Я тебе даже больше скажу. Этот симвоол зависит от локали. Какой символ стоит в локали тот и должен употребляться. Причём это один из частых источников граблей
... << RSDN@Home 1.0 beta 6a >>
Народная мудрось
всем все никому ничего(с).
Re: Свой вариант изменения типа
От: Vi2 Удмуртия http://www.adem.ru
Дата: 16.04.03 09:10
Оценка:
Здравствуйте, vaad, Вы писали:

V>_bstr_t m="13,4444";
V>CComVariant cVar=(BSTR)m;
V>cVar.ChangeType(VT_R8);
V>CString str;
V>str.Format("%f",cVar.dblVal);
V>::AfxMessageBox(str,MB_OK,NULL);

V>Все работает, но что ж мне теперь все числа писать через запятую? Вариант
V> m="13.4444"......
V>не проходит

А руки и функции на что?
HRESULT inPlaceChangeType( CComVariant& cvSrc, VARTYPE vtNew )
{
    HRESULT hr;
    char sDecimal[2];

    VARTYPE vtOldSimple = (cvSrc.vt & ~VT_BYREF);
    VARTYPE vtNewSimple = (vtNew & ~VT_BYREF);

    if( vtNewSimple != vtOldSimple )
    {
        if( vtNewSimple == VT_BSTR && (vtOldSimple == VT_R4 || vtOldSimple == VT_R8) )
        {
            hr = cvSrc.ChangeType( vtNew );
            ::GetLocaleInfo( LOCALE_USER_DEFAULT, LOCALE_SDECIMAL, sDecimal, sizeof(sDecimal) );
            if( sDecimal[0] != '.' )
            {
                LPOLESTR pIdent = (((cvSrc.vt & VT_BYREF) != 0) ? cvSrc.pbstrVal[0] : cvSrc.bstrVal);
                while( pIdent != NULL && (pIdent = wcschr( pIdent, sDecimal[0] )) != NULL )
                    *pIdent++ = '.';
            }
            return hr;
        }
        
        if( vtOldSimple == VT_BSTR && (vtNewSimple == VT_R4 || vtNewSimple == VT_R8) )
        {
            ::GetLocaleInfo( LOCALE_USER_DEFAULT, LOCALE_SDECIMAL, sDecimal, sizeof(sDecimal) );
            if( sDecimal[0] != '.' )
            {
                LPOLESTR pIdent = (((cvSrc.vt & VT_BYREF) != 0) ? cvSrc.pbstrVal[0] : cvSrc.bstrVal);
                while( pIdent != NULL && (pIdent = wcschr( pIdent, '.' )) != NULL )
                    *pIdent++ = sDecimal[0];
            }
        }
    }
    
    hr = cvSrc.ChangeType( vtNew );
    return hr;
}

Но проверь функциональность.
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! © КВН НГУ
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.