VC VT_DECIMAL 转换为CString

BOOL Convert::VarToStr(VARIANT var,CString& str)

{

                _variant_t varDest = var;

                HRESULT hr=::VariantChangeType(&varDest,&var,VARIANT_NOUSEROVERRIDE|VARIANT_LOCALBOOL,VT_BSTR);
                if(SUCCEEDED(hr)){
                    str=(LPCTSTR)_bstr_t(varDest);
                }

                int posDot = str.Find(".");
               if(posDot>0)
                {
                }
                if(posDot==0)
                {
                    str = "0"+str;
                    int i=nScale+2-str.GetLength();
                    for(; i>0;  i--)
                        str.AppendChar('0');
                }
                else if(posDot<0 && nScale>0)
                {
                    str.AppendChar('.');
                    int i=0;
                    for(; i<nScale;  i++)
                    {
                        str.AppendChar('0');
                    }
                }
                else if(posDot<0 && nScale==-1 && var.decVal.scale>0)
                {
                    str.AppendChar('.');
                    int i=0;
                    for(; i<var.decVal.scale;  i++)
                    {
                        str.AppendChar('0');
                    }
                }

                int zeroSize1 = var.decVal.scale-(str.GetLength()-posDot-1);//有多少位没补零
                for(int i=0; i<zeroSize1; i++)
                {
                    str.AppendChar('0');

                }

}

----------------------------------------------------------------------------------------------------------------------------

VariantChangeType 函数

原始地址:http://msdn.microsoft.com/en-us/library/ms221258.aspx

将VARIANT变量从一个类型转化到另外一个类型

HRESULT VariantChangeType(  

  VARIANTARG   *pvargDest,  

  VARIANTARG   *pvarSrc,  

  unsigned short  wFlags,  

  VARTYPE  vt              

);

参数:

pvargDest

指向目标VARIANT的指针。 如果这个参数和pvarSrc是相同的,这个参数就能被适当的转化。

 

pvarSrc

指向需要被强制转化的变量的指针

 

wFlags

强制转化的控制符。可用的值:

·        VARIANT_NOVALUEPROP:这个参数是为了避免一个对象通过读取其Value属性而被强制转化成基本数据类型。应用程序中要慎用该参数。因为可能造成不同的用程序中这个函数的行为不一致。

·        VARIANT_ALPHABOOL:将布尔类型VT_BOOL的变量转化成为”True”或者”false”。

·        VARIANT_NOUSEROVERRIDE:用于对VT_BSTR类型的变量进行转化,它会给底层的转化运行时传递LOCALE_NOUSEROVERRIDE参数。

·        VARIANT_LOCALBOOL:用于VT_BOOL和VT_BSTR之间的转化。使用locale指定的语言或者本机语言

vt

需要强制转化的类型。如果这个函数的返回值码是S_OK,那么*pvarDest的vt字段的值必定和这个vt值相同。

 

返回值:

 

从返回的HRESULT中获得值有如下几个:

含义

S_OK

成功

DISP_E_BADVARTYPE

vt的值不是合法的VARIANT类型

DISP_E_OVERFLOW

pvarSrc的类型与目标类型不匹配

DISP_E_TYPEMISMATCH

参数不能被强制转化到指定类型  

E_INVALIDARG

参数不合法

E_OUTOFMEMORY

内存分配错误

 

注释:

 

VariantChangeType主要用于基本数据类型之间的强制转化,包括数字-字符和字符-数字转化。pvarSrc在转化过程中被修改。例如,源变量是VT_BOOL,目标变量是VT_UINT,那源变量会先被转转化成为VT_I2,然后继续转化。含有VT_BYREF集合的变量,会被转化成引用的值。对象类型的变量则是通过调用对象的Value属性(DISPID_VALUE)来转化。

通常情况下,IDispatch::Invoke的实现对象会决定哪些成员被读取,然后调用VariantChangeType来获得参数值。例如,IDispatch指定了SetTitle函数的参数是string类型,那么实现对象就需要调用VariantChangeType来把参数转化成VT_BSTR。如果VariantChangeType不返回错误,这个参数就讷能通过VARIANTARG的bstrVal字段字节获得。如果返回的是DISP_E_TYPEMISMATCH,实现对象就会把*puArgErr设置为0,表示参数错误而且IDispatch::Invoke返回DISP_E_TYPEMISMATCH给上层函数。

这个函数不能将一种类型的数组转化成另一种类型的数组。

----------------------------------------------------------------------------------------------------------------------------

参考:http://topic.csdn.net/u/20090222/11/5e702363-03e4-42b2-b4c0-a483b04956e8.html

http://www.cnblogs.com/caucyj/archive/2011/02/12/1952660.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值