Вот хорошее начало.Он не конвертирует все, что вы хотите конвертировать, но вы можете использовать идею и алгоритм для произвольного преобразования с помощью нескольких простых модов:
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
.