首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >float to _bstr_t

float to _bstr_t
EN

Stack Overflow用户
提问于 2010-07-20 09:07:50
回答 3查看 1.2K关注 0票数 4
代码语言:javascript
复制
mValue = _bstr_t(flt); 

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

代码语言:javascript
复制
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“,例如,如果我当前的语言集是意大利语。有没有其他方法来声明它呢?

EN

回答 3

Stack Overflow用户

发布于 2010-07-20 13:06:50

当您使用来自char*的转换创建一个_bstr_t实例时,将创建一个新的BSTR,该对象并不拥有char*所指向的内存的所有权。您必须自己管理char*指向的内存。

在你的例子中,既然你知道产生字符串的长度是有限制的,你最好的选择就是在堆栈上分配缓冲区:

代码语言:javascript
复制
const int bufferLength = 30;
char str[bufferLength] = {};
snprintf(str, bufferLength - 1, "%.7g", flt); 
mValue = _bstr_t(str);
票数 2
EN

Stack Overflow用户

发布于 2010-07-21 00:30:23

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

代码语言:javascript
复制
CString cstr;
cstr.Format(_T("%.7g"),flt);
mValue = _bstr_t(cstr);
票数 1
EN

Stack Overflow用户

发布于 2012-09-13 21:41:07

代码语言:javascript
复制
_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);
}

然后

代码语言:javascript
复制
sprintf(str, "%.7g", flt); 
mValue = FormatBstr(L"%.7g", flt);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3286279

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档