Changes
This commit is contained in:
78
src/lib/format.ts
Normal file
78
src/lib/format.ts
Normal file
@@ -0,0 +1,78 @@
|
||||
/**
|
||||
* Format duration in seconds to HH:mm:ss or mm:ss
|
||||
*/
|
||||
export function formatDuration(seconds: number | string | null | undefined): string {
|
||||
if (seconds === null || seconds === undefined) return '';
|
||||
|
||||
// If it's already formatted (contains :), return as-is
|
||||
if (typeof seconds === 'string' && seconds.includes(':')) {
|
||||
return seconds;
|
||||
}
|
||||
|
||||
const numSeconds = typeof seconds === 'string' ? parseInt(seconds, 10) : seconds;
|
||||
if (isNaN(numSeconds) || numSeconds < 0) return '';
|
||||
|
||||
const hours = Math.floor(numSeconds / 3600);
|
||||
const minutes = Math.floor((numSeconds % 3600) / 60);
|
||||
const secs = numSeconds % 60;
|
||||
|
||||
if (hours > 0) {
|
||||
return `${hours}:${minutes.toString().padStart(2, '0')}:${secs.toString().padStart(2, '0')}`;
|
||||
}
|
||||
return `${minutes}:${secs.toString().padStart(2, '0')}`;
|
||||
}
|
||||
|
||||
/**
|
||||
* Format price in IDR
|
||||
*/
|
||||
export function formatIDR(amount: number): string {
|
||||
return new Intl.NumberFormat('id-ID', {
|
||||
style: 'currency',
|
||||
currency: 'IDR',
|
||||
minimumFractionDigits: 0,
|
||||
maximumFractionDigits: 0,
|
||||
}).format(amount).replace('IDR', 'Rp');
|
||||
}
|
||||
|
||||
/**
|
||||
* Parse duration string (HH:mm:ss or mm:ss) to seconds
|
||||
*/
|
||||
export function parseDurationToSeconds(duration: string): number {
|
||||
if (!duration) return 0;
|
||||
|
||||
// If it's already a number string, return as seconds
|
||||
if (/^\d+$/.test(duration.trim())) {
|
||||
return parseInt(duration, 10);
|
||||
}
|
||||
|
||||
const parts = duration.split(':').map(p => parseInt(p, 10));
|
||||
|
||||
if (parts.length === 3) {
|
||||
// HH:mm:ss
|
||||
return parts[0] * 3600 + parts[1] * 60 + parts[2];
|
||||
} else if (parts.length === 2) {
|
||||
// mm:ss
|
||||
return parts[0] * 60 + parts[1];
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Format date to Indonesian locale
|
||||
*/
|
||||
export function formatDate(date: string | Date): string {
|
||||
return new Intl.DateTimeFormat('id-ID', {
|
||||
dateStyle: 'long',
|
||||
}).format(new Date(date));
|
||||
}
|
||||
|
||||
/**
|
||||
* Format datetime to Indonesian locale
|
||||
*/
|
||||
export function formatDateTime(date: string | Date): string {
|
||||
return new Intl.DateTimeFormat('id-ID', {
|
||||
dateStyle: 'long',
|
||||
timeStyle: 'short',
|
||||
}).format(new Date(date));
|
||||
}
|
||||
Reference in New Issue
Block a user