_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"
......
не проходит
Здравствуйте, 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>не проходит
Я тебе даже больше скажу. Этот симвоол зависит от локали. Какой символ стоит в локали тот и должен употребляться. Причём это один из частых источников граблей
... << RSDN@Home 1.0 beta 6a >>
Здравствуйте, 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;
}
Но проверь функциональность.