[ZOD] validation(1,000,000 string)

Darcy Daeseok YU ·2026년 4월 2일

export const yesNoSchema = z.enum(YES_NO);

export const optionalDayjsSchema = z.custom<Dayjs>().optional();

export const bizNoSchema = z
  .string()
  // .optional()
  // .nullable()
  .refine(
    (val) => !val || REGEX_BIZ_NO.test(val),
    '사업자번호 형식이 올바르지 않습니다. (예: 123-12-12345)'
  );

export const vatTypeSchema = z.enum(['NONE', 'INCLUDE', 'EXCLUDE']);
export const orderTypeSchema = z.enum(['SALE', 'PURCHASE']);

export const nonNegativeNumber = (message: string) =>
  z.preprocess(coerceNumber, z.number({ message }).min(0, message));

export const nonNegativeInt = (message: string) =>
  z.preprocess(
    coerceNumber,
    z.number({ message }).int(message).min(0, message)
  );

// (money) 1,000,000 string -> 1000000 변환 및 유효성 검증 
totalAmount  : z.string().or(z.number()).transform(toNumber)   .pipe(z.number())
    .optional()
    .default(0), 

/**
 * Zod preprocess용: 다양한 입력을 숫자로 변환
 */
export const coerceNumber = (value: unknown): number | undefined => {
  if (typeof value === 'number') return value;
  if (typeof value === 'string') {
    const trimmed = value.trim();
    if (trimmed === '') return undefined;
    const n = Number(trimmed.replace(/,/g, ''));
    return Number.isNaN(n) ? undefined : n;
  }
  return undefined;
};

/** 콤마 포함 문자열 → number 변환, 빈값은 0 (e.g. "1,000" → 1000) */
export const toNumber = (value: string | number | undefined): number =>
  coerceNumber(value) ?? 0;
profile
React, React-Native https://darcyu83.netlify.app/

0개의 댓글