/** * 分数格式化工具 * * 用于在前端显示分数时进行格式化,避免显示过长的小数 */ /** * 格式化分数显示 * * @param score 分数 * @param decimalPlaces 小数位数,默认1位 * @returns 格式化后的分数字符串 * * @example * formatScore(16.666666) // "16.7" * formatScore(17) // "17" * formatScore(16.5, 0) // "17" */ export function formatScore(score: number, decimalPlaces: number = 1): string { // 如果是整数,直接返回 if (Number.isInteger(score)) { return score.toString() } // 四舍五入到指定小数位 const rounded = Number(score.toFixed(decimalPlaces)) // 如果四舍五入后是整数,去掉小数点 if (Number.isInteger(rounded)) { return rounded.toString() } return rounded.toFixed(decimalPlaces) } /** * 格式化分数显示(带单位) * * @param score 分数 * @param unit 单位,默认"分" * @returns 格式化后的分数字符串 * * @example * formatScoreWithUnit(16.7) // "16.7分" * formatScoreWithUnit(100) // "100分" */ export function formatScoreWithUnit(score: number, unit: string = '分'): string { return `${formatScore(score)}${unit}` } /** * 格式化百分比 * * @param value 值(0-1 或 0-100) * @param isPercent 是否已经是百分比形式(0-100),默认false * @returns 格式化后的百分比字符串 * * @example * formatPercent(0.8567) // "85.7%" * formatPercent(85.67, true) // "85.7%" */ export function formatPercent(value: number, isPercent: boolean = false): string { const percent = isPercent ? value : value * 100 return `${formatScore(percent)}%` } /** * 计算及格分数 * * @param totalScore 总分 * @param passRate 及格率,默认0.6 * @returns 及格分数(向上取整) */ export function calculatePassScore(totalScore: number, passRate: number = 0.6): number { return Math.ceil(totalScore * passRate) } /** * 判断是否及格 * * @param score 得分 * @param passScore 及格分数 * @returns 是否及格 */ export function isPassed(score: number, passScore: number): boolean { return score >= passScore } /** * 获取分数等级 * * @param score 得分 * @param totalScore 总分 * @returns 等级: 'excellent' | 'good' | 'pass' | 'fail' */ export function getScoreLevel(score: number, totalScore: number): 'excellent' | 'good' | 'pass' | 'fail' { const ratio = score / totalScore if (ratio >= 0.9) return 'excellent' if (ratio >= 0.75) return 'good' if (ratio >= 0.6) return 'pass' return 'fail' } /** * 获取分数等级对应的颜色 * * @param level 等级 * @returns 颜色值 */ export function getScoreLevelColor(level: 'excellent' | 'good' | 'pass' | 'fail'): string { const colors = { excellent: '#67c23a', // 绿色 good: '#409eff', // 蓝色 pass: '#e6a23c', // 橙色 fail: '#f56c6c', // 红色 } return colors[level] } /** * 智能分配分数(前端预览用) * * @param totalScore 总分 * @param questionCount 题目数量 * @returns 分数数组 * * @example * distributeScores(100, 6) // [17, 17, 17, 17, 16, 16] */ export function distributeScores(totalScore: number, questionCount: number): number[] { if (questionCount <= 0) return [] const baseScore = Math.floor(totalScore / questionCount) const extraCount = totalScore % questionCount const scores: number[] = [] for (let i = 0; i < questionCount; i++) { scores.push(i < extraCount ? baseScore + 1 : baseScore) } return scores } export default { formatScore, formatScoreWithUnit, formatPercent, calculatePassScore, isPassed, getScoreLevel, getScoreLevelColor, distributeScores, }