我知道我可以通过执行以下操作创建一个带有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”,例如我的当前语言集是意大利语。还有另一种方式可以宣布它吗?
答案 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);