Files
012-kaopeilian/frontend/src/utils/scoreFormatter.ts
yuliang_guo 0b7c07eb7f
All checks were successful
continuous-integration/drone/push Build is passing
feat: 添加请求验证错误详细日志
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-01-31 10:03:54 +08:00

155 lines
3.7 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/**
* 分数格式化工具
*
* 用于在前端显示分数时进行格式化,避免显示过长的小数
*/
/**
* 格式化分数显示
*
* @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,
}