2012-02-07 349 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

相關問題