rwadurian/frontend/admin-web/src/utils/formatters.ts

105 lines
2.7 KiB
TypeScript

import dayjs from 'dayjs';
import relativeTime from 'dayjs/plugin/relativeTime';
import 'dayjs/locale/zh-cn';
// 配置 dayjs
dayjs.extend(relativeTime);
dayjs.locale('zh-cn');
/**
* 格式化数字,添加千位分隔符
*/
export function formatNumber(num: number | string, decimals = 0): string {
const n = typeof num === 'string' ? parseFloat(num) : num;
if (isNaN(n)) return '0';
return n.toLocaleString('zh-CN', {
minimumFractionDigits: decimals,
maximumFractionDigits: decimals,
});
}
/**
* 格式化货币
*/
export function formatCurrency(amount: number, currency = 'CNY'): string {
const symbols: Record<string, string> = {
CNY: '¥',
USD: '$',
USDT: '积分 ',
BTC: 'BTC ',
};
const symbol = symbols[currency] || '';
return `${symbol}${formatNumber(amount, 2)}`;
}
/**
* 格式化百分比
*/
export function formatPercentage(value: number, decimals = 1): string {
return `${value >= 0 ? '+' : ''}${value.toFixed(decimals)}%`;
}
/**
* 格式化日期
*/
export function formatDate(date: string | Date, format = 'YYYY-MM-DD'): string {
return dayjs(date).format(format);
}
/**
* 格式化日期时间
*/
export function formatDateTime(date: string | Date, format = 'YYYY-MM-DD HH:mm:ss'): string {
return dayjs(date).format(format);
}
/**
* 格式化相对时间 (如: 5分钟前, 2小时前)
*/
export function formatRelativeTime(date: string | Date): string {
return dayjs(date).fromNow();
}
/**
* 格式化文件大小
*/
export function formatFileSize(bytes: number): string {
if (bytes === 0) return '0 B';
const k = 1024;
const sizes = ['B', 'KB', 'MB', 'GB', 'TB'];
const i = Math.floor(Math.log(bytes) / Math.log(k));
return `${parseFloat((bytes / Math.pow(k, i)).toFixed(2))} ${sizes[i]}`;
}
/**
* 截断文本
*/
export function truncateText(text: string, maxLength: number): string {
if (text.length <= maxLength) return text;
return `${text.slice(0, maxLength)}...`;
}
/**
* 格式化手机号 (隐藏中间4位)
*/
export function formatPhone(phone: string): string {
if (!phone || phone.length !== 11) return phone;
return `${phone.slice(0, 3)}****${phone.slice(7)}`;
}
/**
* 格式化钱包地址 (显示前后几位)
*/
export function formatWalletAddress(address: string, startLen = 6, endLen = 4): string {
if (!address || address.length <= startLen + endLen) return address;
return `${address.slice(0, startLen)}...${address.slice(-endLen)}`;
}
/**
* 格式化排名显示
*/
export function formatRanking(rank: number | null): string {
if (rank === null || rank === 0) return '-';
return `#${rank}`;
}