浮动到_bstr_t

时间:2010-07-20 01:07:50

标签: c++ string com localization

我知道我可以通过执行以下操作创建一个带有float的_bstr_t:

mValue = _bstr_t(flt); 

我可以通过首先声明一个c字符串来格式化浮点字符串:

char* str = new char[30];
sprintf(str, "%.7g", flt); 
mValue = _bstr_t(str);

我对c ++有点生疏,尤其是涉及_bstr_t时,它是Visual Basic字符串类型的A C ++类包装器。 str指向的内存是否由_bstr_t对象管理? 我的问题是将float(flt)传递给_bstr_t的构造函数会导致一个数字为33.03434的浮点数转为“33,03434”,例如我的当前语言集是意大利语。还有另一种方式可以宣布它吗?

3 个答案:

答案 0 :(得分:2)

使用_bstr_t的转换创建char*实例时,会创建新的BSTR,该对象不会获取char*指向的内存的所有权。您必须自己管理char*指向的内存。

在你的情况下,因为你知道生成字符串的时间有限,你最好的办法就是在堆栈上分配缓冲区:

const int bufferLength = 30;
char str[bufferLength] = {};
snprintf(str, bufferLength - 1, "%.7g", flt); 
mValue = _bstr_t(str);

答案 1 :(得分:1)

我最终使用CString,因为它是内存管理的:

CString cstr;
cstr.Format(_T("%.7g"),flt);
mValue = _bstr_t(cstr);

答案 2 :(得分:0)

_bstr_t FormatBstr(LPCWSTR FormatString, ...)
{
    ATLASSERT( AtlIsValidString(FormatString) );
    unsigned int len = 10 + wcslen(FormatString);
    unsigned int used = 0;

    BSTR r = ::SysAllocStringLen(NULL, len);

    va_list argList;
    va_start( argList, FormatString );
    while(len < 2048) {
            used = _vsnwprintf_s(r, len+1, _TRUNCATE, FormatString, argList);
            if(used < len)
                    break;
            len += 10; // XXX
            ::SysReAllocStringLen(&r, NULL, len);
    }
    va_end( argList );
    ::SysReAllocStringLen(&r, r, used);
    return _bstr_t(r, false);
}

然后

sprintf(str, "%.7g", flt); 
mValue = FormatBstr(L"%.7g", flt);