diff --git a/legacy/app/common/util_amount.c b/legacy/app/common/util_amount.c index 94b0549..27cfa6c 100644 --- a/legacy/app/common/util_amount.c +++ b/legacy/app/common/util_amount.c @@ -1,82 +1,61 @@ -/* - * util_amount.c - 금액/통화 유틸리티 (plain C) - */ -#include "acq_util.h" - +#include +#include #include #include -#include -/* 거래금액 상한 (원). 건당 1억원 */ -#define AMOUNT_MAX 100000000L +#define AMOUNT_BUF_SIZE 64 -long amount_parse(const char *field, int len) -{ - long v = 0; - int i; +typedef struct { + long long units; + int cents; + char currency[4]; +} amount_t; - if (!field || len <= 0) - return -1; - - for (i = 0; i < len; i++) { - char c = field[i]; - if (c == ' ') /* 선행 공백 허용 */ - continue; - if (!isdigit((unsigned char)c)) - return -1; - v = v * 10 + (c - '0'); +int amount_parse(const char* str, amount_t* out) { + if (!str || !out) return -1; + long long units = 0; + int cents = 0; + char currency[4] = "KRW"; + const char* p = str; + while (*p && !isdigit(*p) && *p != '.' && *p != '-') p++; + if (sscanf(p, "%lld.%2d", &units, ¢s) >= 1) { + out->units = units; + out->cents = cents; + strcpy(out->currency, currency); + return 0; } - return v; + return -1; } -int amount_format(long amount, char *out, int len) -{ - char tmp[32]; - int n; +int amount_format(const amount_t* a, char* buf, size_t len) { + if (!a || !buf) return -1; + return snprintf(buf, len, "%s %lld.%02d", a->currency, a->units, a->cents); +} - if (!out || len <= 0 || amount < 0) - return -1; - - n = snprintf(tmp, sizeof(tmp), "%0*ld", len, amount); - if (n < 0 || n > len) /* 폭 초과 = 오버플로우 */ - return -1; - - memcpy(out, tmp, len); /* 널 종료 없이 고정폭 복사 */ +int amount_add(const amount_t* a, const amount_t* b, amount_t* out) { + if (!a || !b || !out) return -1; + long long total_cents = a->units * 100 + a->cents + b->units * 100 + b->cents; + out->units = total_cents / 100; + out->cents = (int)(total_cents % 100); + strcpy(out->currency, a->currency); return 0; } -void amount_format_won(long amount, char *out, int outlen) -{ - char raw[32]; - int n, i, j, digits, first; - - if (!out || outlen <= 0) - return; - - n = snprintf(raw, sizeof(raw), "%ld", amount); - if (n < 0) { - out[0] = '\0'; - return; - } - - first = (raw[0] == '-') ? 1 : 0; - digits = n - first; - - j = 0; - if (first && j < outlen - 1) - out[j++] = '-'; - - for (i = first; i < n && j < outlen - 1; i++) { - int pos = i - first; /* 0-based 자릿수 위치 */ - if (pos > 0 && (digits - pos) % 3 == 0) - if (j < outlen - 1) - out[j++] = ','; - out[j++] = raw[i]; - } - out[j] = '\0'; +int amount_subtract(const amount_t* a, const amount_t* b, amount_t* out) { + if (!a || !b || !out) return -1; + long long total_cents = (a->units * 100 + a->cents) - (b->units * 100 + b->cents); + out->units = total_cents / 100; + out->cents = (int)(total_cents % 100); + if (total_cents < 0) out->cents = -out->cents; + strcpy(out->currency, a->currency); + return 0; } -int amount_is_valid(long amount) -{ - return (amount >= 1 && amount <= AMOUNT_MAX) ? 1 : 0; +int amount_multiply(const amount_t* a, int factor, amount_t* out) { + if (!a || !out) return -1; + long long total_cents = (a->units * 100 + a->cents) * factor; + out->units = total_cents / 100; + out->cents = (int)(total_cents % 100); + strcpy(out->currency, a->currency); + return 0; }