Some checks failed
ci / build (push) Failing after 2s
TxCore/ECPG legacy 매입·정산 C 슬라이스(빌드검증) + Spring Boot 멀티모듈 골격(mvn test green) + MIGRATION.md 전환룰 + CI(boot 빌드).
82 lines
1.7 KiB
C
82 lines
1.7 KiB
C
/*
|
|
* util_amount.c - 금액/통화 유틸리티 (plain C)
|
|
*/
|
|
#include "acq_util.h"
|
|
|
|
#include <string.h>
|
|
#include <ctype.h>
|
|
#include <stdio.h>
|
|
|
|
/* 거래금액 상한 (원). 건당 1억원 */
|
|
#define AMOUNT_MAX 100000000L
|
|
|
|
long amount_parse(const char *field, int len)
|
|
{
|
|
long v = 0;
|
|
int i;
|
|
|
|
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');
|
|
}
|
|
return v;
|
|
}
|
|
|
|
int amount_format(long amount, char *out, int len)
|
|
{
|
|
char tmp[32];
|
|
int n;
|
|
|
|
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); /* 널 종료 없이 고정폭 복사 */
|
|
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_is_valid(long amount)
|
|
{
|
|
return (amount >= 1 && amount <= AMOUNT_MAX) ? 1 : 0;
|
|
}
|