92 lines
3.3 KiB
TypeScript
92 lines
3.3 KiB
TypeScript
type DataFormProps = {
|
|
type: string;
|
|
column: string;
|
|
item: Record<string, unknown>;
|
|
}
|
|
|
|
/**
|
|
* yyyymm 형태의 문자열을 받아 해당 월의 일수를 반환
|
|
* @param {string} yyyymm - 예: "202502", "202412"
|
|
* @returns {number} 해당 월의 일수 (예: 28, 29, 30, 31)
|
|
*/
|
|
export const getDaysInMonth = (yyyymm: string) => {
|
|
if (typeof yyyymm !== 'string' || yyyymm.length !== 6) {
|
|
throw new Error("입력은 'yyyymm' 형식의 문자열이어야 합니다. 예: '202502'");
|
|
}
|
|
|
|
const year = parseInt(yyyymm.slice(0, 4), 10); // "2025" -> 2025
|
|
const month = parseInt(yyyymm.slice(4, 6), 10); // "02" -> 2
|
|
|
|
if (isNaN(year) || isNaN(month) || month < 1 || month > 12) {
|
|
throw new Error("유효한 년/월이 아닙니다.");
|
|
}
|
|
|
|
// Date(year, month, 0) -> 전달의 마지막 날
|
|
// month에 '다음달'을 넣고, 일(day)에 0을 주면 해당 월의 마지막 날짜가 됨
|
|
return new Date(year, month, 0).getDate();
|
|
}
|
|
|
|
export const roundNumber = (value: any, decimals: number) => {
|
|
if (typeof value === 'number') {
|
|
return addCommas((Math.round(value * Math.pow(10, decimals)) / Math.pow(10, decimals)).toFixed(decimals));
|
|
} else if (typeof value === 'string') {
|
|
// 콤마가 포함된 문자열 처리 ('1,083.0' 같은 경우)
|
|
const cleanedValue = value.replace(/,/g, '');
|
|
if (!isNaN(Number(cleanedValue))) {
|
|
return addCommas(Number(cleanedValue).toFixed(decimals));
|
|
}
|
|
}
|
|
return value; // 변환 불가능한 경우 원래 값 반환
|
|
}
|
|
|
|
export const addCommas = (value: string | number): any => {
|
|
if (typeof value === 'number') {
|
|
return value.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",").split('.').map((part, index) =>
|
|
index === 0 ? part : part.replace(/(\d{3})/g, '$1,')
|
|
).join('.');
|
|
} else if (typeof value === 'string') {
|
|
return value.includes('.') ? value.split('.').map((part, index) =>
|
|
index === 0 ? part.replace(/\B(?=(\d{3})+(?!\d))/g, ",") : part
|
|
).join('.') : String(value).replace(/\B(?=(\d{3})+(?!\d))/g, ",");
|
|
}
|
|
}
|
|
|
|
export default function DataForm({ type, column, item }: DataFormProps) {
|
|
if (item) {
|
|
const value = item[column];
|
|
switch (type) {
|
|
case 'date':
|
|
if (value && typeof value === 'string' && value.length >= 8 && !value.includes('-'))
|
|
item[column] = value.substring(0, 4) + "-" + value.substring(4, 6) + "-" + value.substring(6, 8);
|
|
break;
|
|
case 'number':
|
|
if (value && value != '') {
|
|
item[column] = value.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",");
|
|
}
|
|
break;
|
|
case 'float0':
|
|
if (value) {
|
|
item[column] = item[column] = String(value).includes('.') ? String(Math.round(parseFloat(value.toString().replace(/,/g, '')) * 1) / 1).split('.').map((part, index) =>
|
|
index === 0 ? part.replace(/\B(?=(\d{3})+(?!\d))/g, ",") : part
|
|
).join('.')
|
|
: String(value).replace(/\B(?=(\d{3})+(?!\d))/g, ",");
|
|
}
|
|
break;
|
|
case 'float1':
|
|
if (value) {
|
|
item[column] = roundNumber(value, 1);
|
|
}
|
|
break;
|
|
case 'float2':
|
|
if (value) {
|
|
item[column] = roundNumber(value, 2);
|
|
}
|
|
break;
|
|
case 'float3':
|
|
if (value) {
|
|
item[column] = roundNumber(value, 3);
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
} |