C - преобразовать числовую строку в SQL_NUMERIC_STRUCT - PullRequest
0 голосов
/ 05 августа 2020

Мне нужна помощь в преобразовании числовой строки в значение SQL_NUMERIC_STRUCT для использования десятичных и числовых типов данных c базы данных. Значение SQL_NUMERIC_STRUCT - это 16-байтовое шестнадцатеричное целое число без знака. Например, у меня есть строка «12312312899012312890522341231231232198», содержащая 38 цифр (максимум для типов данных SQL SERVER decimal или numeri c). В других языках, таких как c#, есть встроенная функция преобразования, но моя Visual Studio 2019 не позволяет мне напрямую использовать 128-битные целые числа в среде C ++. На странице справки Microsoft, к сожалению, есть пример с маленьким 2-байтовым целым числом.

1 Ответ

0 голосов
/ 13 августа 2020

Я нашел решение.

bool ConvertToNumericStruct (char* s, SQL_NUMERIC_STRUCT* v){
int sc = (int)strlen(s), scale = 0, i,y, z; 
char c, p = 0, d; bool minus = false;
int _tmp, x, carryover;
memset(v->val, 0, 16);
for (i = 0; i < sc; i++) {
    c = s[i];
    if (i == 0 && c == '-')minus = true;
    else if (c == '.') { if (scale == 0)scale = sc - i - 1; else return false; }
    else if (c < '0' || c>'9') return false;
    else
    {
        if (p > 38) return false;
        d = c - 48;
        _tmp = 0;
        carryover = d;
        y = 0; z = 0;
        for (x = sc - 1; x > -1; x--)
        {
            if (y % 2 == 1)
            {
                _tmp = (v->val[z] >> 4) * 10 + carryover;
                v->val[z] &= 0x0F;
                v->val[z] |= ((_tmp % 16) << 4 & 0xF0);
                z++;
                if (z > 15) break;
            }
            else {
                _tmp = (v->val[z] & 0x0F) * 10 + carryover;
                v->val[z] &= 0Xf0;
                v->val[z] |= ((_tmp % 16) & 0x0F);
            }
            y++;
            carryover = _tmp / 16;
        }
        p++;
    }
}

v->precision = p;
v->scale = scale;
if (minus) v->sign = 0; else v->sign = 1;
return true;}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...