2012-02-07 332 views

回答

1

这是一个好的开始。它不会转换要转换的一切,但你可以使用这个想法和算法做任意转换一些简单的mods:

DWORD g_Denominators[10]={1,10,100,1000,10000,100000,1000000,10000000, 
          100000000,1000000000}; 

void FetchDecimalValue(Fraction::NumeratorType &numerator, 
         Fraction::DenominatorType &denominator, 
         const SQL_NUMERIC_STRUCT &src) 
{ 
    numerator=0; 
    denominator=1; 
    DWORDLONG byteDenominator=1; 

    for (size_t valIdx=0;valIdx<SQL_MAX_NUMERIC_LEN;++valIdx) 
    { 
    numerator+=src.val[valIdx]*byteDenominator; 
    byteDenominator<<=8UI64; 
    } 

    // Is the NUMERIC negative? 
    if (src.sign==0) 
    numerator=-numerator; 

    denominator=g_Denominators[src.scale]; 
} 

您可以轻松创建一个双出所产生的分子和分母的将前者分为后者。另外,要创建一个字符串,您可以始终使用sprintf或更多的C++方式,即ostringstream的双格式化程序。

+0

什么是Fraction :: NumeratorType和Fraction :: DenominatorType? – 2012-02-07 14:43:00

+0

你可以让他们__int64 ...(或Windows中的LONGLONG术语) – 2012-02-07 16:38:15

+0

我认为使用'double'类型会更好。但是我选择不使用'SQL_NUMERIC_STRUCT'结构,而是使用'SQLGetData()'读取数据时读取数字/十进制/金钱列作为字符串,指定'SQL_C_WCHAR'而不是'SQL_C_NUMERIC',如下所示:http ://stackoverflow.com/questions/9178900/how-to-read-numeric-decimal-money-columns-from-sql-server。无论如何,你的解决方案似乎在为我所问的问题工作,所以我将其标记为答案。 – 2012-02-08 06:31:00

相关问题