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