105 lines
2.7 KiB
TypeScript
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}`;
|
|
}
|