更新时间:2026-07-28 GMT+08:00
解析、运算数值类型
此示例使用pgtypes库函数对numeric类型进行不同操作。
#include <stdio.h>
#include <stdlib.h>
#include <pgtypes_numeric.h>
#include <pgtypes_error.h>
#include <decimal.h>
char* nums[] = { "2E394", "-2", ".794", "3.44", "592.49E21", "-32.84e4",
"2E-394", ".1E-2", "+.0", "-592.49E-07", "+32.84e-4",
".500001", "-.5000001",
"1234567890123456789012345678.91", /* 30个数位应转换为十进制 */
"1234567890123456789012345678.921", /* 31个数位的数字不应转为十进制 */
"not a number",
NULL
};
static void check_errno(void);
int main(void)
{
char *text="error\n";
char *endptr;
numeric *num, *nin;
decimal *dec;
long l;
int i, j, k, q, r, count = 0;
double d;
numeric **numarr = (numeric **) calloc(1, sizeof(numeric));
for (i = 0; nums[i]; i++)
{
/* 返回由malloc分配的字符串的指针,它包含numeric类型nums[i]的字符串表达 */
num = PGTYPESnumeric_from_asc(nums[i], &endptr);
if (!num) check_errno();
if (endptr != NULL)
{
printf("endptr of %d is not NULL\n", i);
if (*endptr != '\0')
printf("*endptr of %d is not \\0\n", i);
}
if (!num) continue;
numarr = (numeric **)realloc(numarr, sizeof(numeric *) * (count + 1));
numarr[count++] = num;
/* 返回由malloc分配的字符串的指针,它包含numeric类型num的字符串表达 */
text = PGTYPESnumeric_to_asc(num, -1);
if (!text) check_errno();
printf("num[%d,1]: %s\n", i, text); free(text);
text = PGTYPESnumeric_to_asc(num, 0);
if (!text) check_errno();
printf("num[%d,2]: %s\n", i, text); free(text);
text = PGTYPESnumeric_to_asc(num, 1);
if (!text) check_errno();
printf("num[%d,3]: %s\n", i, text); free(text);
text = PGTYPESnumeric_to_asc(num, 2);
if (!text) check_errno();
printf("num[%d,4]: %s\n", i, text); free(text);
/* 请求一个指向新分配的numeric变量的指针 */
nin = PGTYPESnumeric_new();
text = PGTYPESnumeric_to_asc(nin, 2);
if (!text) check_errno();
printf("num[%d,5]: %s\n", i, text); free(text);
/* 将一个numeric类型的变量转换为长整型 */
r = PGTYPESnumeric_to_long(num, &l);
if (r) check_errno();
printf("num[%d,6]: %ld (r: %d)\n", i, r?0L:l, r);
if (r == 0)
{
/* 把一个长整型变量转换为一个numeric变量 */
r = PGTYPESnumeric_from_long(l, nin);
if (r) check_errno();
/* 返回由malloc分配的字符串的指针,它包含numeric类型nin的字符串表达 */
text = PGTYPESnumeric_to_asc(nin, 2);
/* 比较两个numeric变量 */
q = PGTYPESnumeric_cmp(num, nin);
printf("num[%d,7]: %s (r: %d - cmp: %d)\n", i, text, r, q);
free(text);
}
/* 将一个numeric类型的变量转换成整数 */
r = PGTYPESnumeric_to_int(num, &k);
if (r) check_errno();
printf("num[%d,8]: %d (r: %d)\n", i, r?0:k, r);
if (r == 0)
{
/* 把一个整数变量转换成一个numeric变量 */
r = PGTYPESnumeric_from_int(k, nin);
if (r) check_errno();
/* 返回由malloc分配的字符串的指针,它包含numeric类型nin的字符串表达 */
text = PGTYPESnumeric_to_asc(nin, 2);
q = PGTYPESnumeric_cmp(num, nin);
printf("num[%d,9]: %s (r: %d - cmp: %d)\n", i, text, r, q);
free(text);
}
if (i != 6)
{
/* 将一个numeric类型的变量转换成双精度类型 */
r = PGTYPESnumeric_to_double(num, &d);
if (r) check_errno();
printf("num[%d,10]: %g (r: %d)\n", i, r?0.0:d, r);
}
/* 请求一个指向新分配的numeric变量的指针 */
dec = PGTYPESdecimal_new();
/* 将一个decimal类型的变量转换成numeric */
r = PGTYPESnumeric_to_decimal(num, dec);
if (r) check_errno();
printf("num[%d,11]: - (r: %d)\n", i, r);
if (r == 0)
{
/* 将一个decimal类型的变量转换成numeric */
r = PGTYPESnumeric_from_decimal(dec, nin);
if (r) check_errno();
/* 返回由malloc分配的字符串的指针,它包含numeric类型nin的字符串表达 */
text = PGTYPESnumeric_to_asc(nin, 2);
/* 比较两个numeric变量 */
q = PGTYPESnumeric_cmp(num, nin);
printf("num[%d,12]: %s (r: %d - cmp: %d)\n", i, text, r, q);
free(text);
}
/* 释放numeric变量的内存 */
PGTYPESdecimal_free(dec);
PGTYPESnumeric_free(nin);
printf("\n");
}
for (i = 0; i < count; i++)
{
for (j = 0; j < count; j++)
{
/* 请求一个指向新分配的numeric变量的指针 */
numeric* a = PGTYPESnumeric_new();
numeric* s = PGTYPESnumeric_new();
numeric* m = PGTYPESnumeric_new();
numeric* d = PGTYPESnumeric_new();
/* 把两个numeric变量相加放到第三个numeric变量中 */
r = PGTYPESnumeric_add(numarr[i], numarr[j], a);
if (r)
{
check_errno();
printf("r: %d\n", r);
}
else
{
/* 返回由malloc分配的字符串的指针,它包含numeric类型a的字符串表达 */
text = PGTYPESnumeric_to_asc(a, 10);
printf("num[a,%d,%d]: %s\n", i, j, text);
free(text);
}
/* 把两个numeric变量相减并且把结果返回到第三个numeric变量 */
r = PGTYPESnumeric_sub(numarr[i], numarr[j], s);
if (r)
{
check_errno();
printf("r: %d\n", r);
}
else
{
/* 返回由malloc分配的字符串的指针,它包含numeric类型s的字符串表达 */
text = PGTYPESnumeric_to_asc(s, 10);
printf("num[s,%d,%d]: %s\n", i, j, text);
free(text);
}
/* 把两个numeric变量相乘并且把结果返回到第三个numeric变量 */
r = PGTYPESnumeric_mul(numarr[i], numarr[j], m);
if (r)
{
check_errno();
printf("r: %d\n", r);
}
else
{
/* 返回由malloc分配的字符串的指针,它包含numeric类型m的字符串表达 */
text = PGTYPESnumeric_to_asc(m, 10);
printf("num[m,%d,%d]: %s\n", i, j, text);
free(text);
}
/* 把两个numeric变量相除并且把结果返回到第三个numeric变量 */
r = PGTYPESnumeric_div(numarr[i], numarr[j], d);
if (r)
{
check_errno();
printf("r: %d\n", r);
}
else
{
/* 返回由malloc分配的字符串的指针,它包含numeric类型d的字符串表达 */
text = PGTYPESnumeric_to_asc(d, 10);
printf("num[d,%d,%d]: %s\n", i, j, text);
free(text);
}
/* 释放一个numeric变量的内存 */
PGTYPESnumeric_free(a);
PGTYPESnumeric_free(s);
PGTYPESnumeric_free(m);
PGTYPESnumeric_free(d);
}
}
for (i = 0; i < count; i++)
{
/* 返回由malloc分配的字符串的指针,它包含numeric类型numarr[i]的字符串表达 */
text = PGTYPESnumeric_to_asc(numarr[i], -1);
printf("%d: %s\n", i, text);
free(text);
/* 释放内存 */
PGTYPESnumeric_free(numarr[i]);
}
free(numarr);
return (0);
}
/* 错误处理 */
static void
check_errno(void)
{
switch(errno)
{
case 0:
printf("(no errno set) - ");
break;
case PGTYPES_NUM_OVERFLOW:
printf("(errno == PGTYPES_NUM_OVERFLOW) - ");
break;
case PGTYPES_NUM_UNDERFLOW:
printf("(errno == PGTYPES_NUM_UNDERFLOW) - ");
break;
case PGTYPES_NUM_BAD_NUMERIC:
printf("(errno == PGTYPES_NUM_BAD_NUMERIC) - ");
break;
case PGTYPES_NUM_DIVIDE_ZERO:
printf("(errno == PGTYPES_NUM_DIVIDE_ZERO) - ");
break;
default:
printf("(unknown errno (%d))\n", errno);
printf("(libc: (%s)) ", strerror(errno));
break;
}
} 运行结果(此实例运行结果过长,此处只截取部分):
endptr of 0 is not NULL num[0,1]: 20000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 num[0,2]: 20000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 num[0,3]: 20000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000.0 num[0,4]: 20000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000.00 num[0,5]: 0.00 (errno == PGTYPES_NUM_OVERFLOW) - num[0,6]: 0 (r: -1) (errno == PGTYPES_NUM_OVERFLOW) - num[0,8]: 0 (r: -1) (errno == PGTYPES_NUM_OVERFLOW) - num[0,10]: 0 (r: -1) num[0,11]: - (r: 0) num[0,12]: 20000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000.00 (r: 0 - cmp: 0) endptr of 1 is not NULL num[1,1]: -2 num[1,2]: -2 num[1,3]: -2.0 num[1,4]: -2.00 num[1,5]: 0.00 num[1,6]: -2 (r: 0) num[1,7]: -2.00 (r: 0 - cmp: 0) num[1,8]: -2 (r: 0) num[1,9]: -2.00 (r: 0 - cmp: 0) num[1,10]: -2 (r: 0) num[1,11]: - (r: 0) num[1,12]: -2.00 (r: 0 - cmp: 0) endptr of 2 is not NULL num[2,1]: 0.794 num[2,2]: 1 num[2,3]: 0.8 num[2,4]: 0.79 num[2,5]: 0.00 num[2,6]: 1 (r: 0) num[2,7]: 1.00 (r: 0 - cmp: -1) num[2,8]: 1 (r: 0) num[2,9]: 1.00 (r: 0 - cmp: -1) num[2,10]: 0.794 (r: 0) num[2,11]: - (r: 0) num[2,12]: 0.79 (r: 0 - cmp: 0) endptr of 3 is not NULL num[3,1]: 3.44 num[3,2]: 3 num[3,3]: 3.4 num[3,4]: 3.44 num[3,5]: 0.00 num[3,6]: 3 (r: 0) num[3,7]: 3.00 (r: 0 - cmp: 1) num[3,8]: 3 (r: 0) num[3,9]: 3.00 (r: 0 - cmp: 1) num[3,10]: 3.44 (r: 0) num[3,11]: - (r: 0) num[3,12]: 3.44 (r: 0 - cmp: 0) endptr of 4 is not NULL num[4,1]: 592490000000000000000000 num[4,2]: 592490000000000000000000 num[4,3]: 592490000000000000000000.0 num[4,4]: 592490000000000000000000.00 num[4,5]: 0.00 (errno == PGTYPES_NUM_OVERFLOW) - num[4,6]: 0 (r: -1) (errno == PGTYPES_NUM_OVERFLOW) - num[4,8]: 0 (r: -1) num[4,10]: 5.9249e+23 (r: 0) num[4,11]: - (r: 0) num[4,12]: 592490000000000000000000.00 (r: 0 - cmp: 0) ...(后续省略)
父主题: 典型应用开发示例