mValue = _bstr_t(flt); 我可以通过首先声明一个c字符串来格式化这个浮动字符串:
char* str = new char[30];
sprintf(str, "%.7g", flt);
mValue = _bstr_t(str);我对c++有点生疏,特别是当涉及到_bstr_t时,它是一个用于Visual Basic字符串类型的C++类包装器。我的问题是,将浮点数(flt)传递到_bstr_t的构造函数会导致数字为33.03434的浮点数变成"33,03434“,例如,如果我当前的语言集是意大利语。有没有其他方法来声明它呢?
发布于 2010-07-20 13:06:50
当您使用来自char*的转换创建一个_bstr_t实例时,将创建一个新的BSTR,该对象并不拥有char*所指向的内存的所有权。您必须自己管理char*指向的内存。
在你的例子中,既然你知道产生字符串的长度是有限制的,你最好的选择就是在堆栈上分配缓冲区:
const int bufferLength = 30;
char str[bufferLength] = {};
snprintf(str, bufferLength - 1, "%.7g", flt);
mValue = _bstr_t(str);发布于 2010-07-21 00:30:23
我最终使用了CString,因为它是内存管理的:
CString cstr;
cstr.Format(_T("%.7g"),flt);
mValue = _bstr_t(cstr);发布于 2012-09-13 21:41:07
_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);https://stackoverflow.com/questions/3286279
复制相似问题