/** * 字符串扩展工具类(UniApp/微信小程序兼容版) * 由于微信小程序环境限制,不直接修改String原型,而是提供工具函数 */ // 匹配所有字符(包括中文、标点、符号、数字、字母等) const ALL_CHARS_REGEX = /([\u4e00-\u9fa5\uFF00-\uFFEF\w\s.,!?;:'"\-+*/=@#$%^&])/g; /** * 安全截断字符串 * @param str 原始字符串 * @param start 开始位置 * @param length 截取长度 * @param suffix 后缀,默认为'...' * @returns 截断后的字符串 */ export function safeTruncate(str: string, start: number, length: number, suffix: string = '...'): string { if (length <= 0) return ''; const chars = Array.from(str.match(ALL_CHARS_REGEX) || []); if (chars.length <= length) { return chars.join(''); } return chars.slice(start, start + length).join('') + suffix; } /** * 计算字符串的显示长度(考虑多字节字符) * @param str 原始字符串 * @returns 显示长度 */ export function displayLength(str: string): number { const chars = Array.from(str.match(ALL_CHARS_REGEX) || []); return chars.length; } /** * 增强版空值检查 * @param val 要检查的值 * @returns 是否为空 */ export const isEmpty = (val: any): boolean => { // 处理 null 和 undefined if (val === null || val === undefined) return true; // 处理基本类型 switch (typeof val) { case 'string': return val.trim() === ''; case 'number': case 'bigint': return val === 0; case 'boolean': return val === false; } // 处理数组 if (Array.isArray(val)) return val.length === 0; // 处理日期对象 if (val instanceof Date) return false; // 处理普通对象 if (typeof val === 'object') { // 处理 Map 和 Set if (val instanceof Map || val instanceof Set) return val.size === 0; return Object.keys(val).length === 0; } return false; }; /** * 字符串扩展工具集合 */ export const StringExtensions = { safeTruncate, displayLength, isEmpty }; // 可选:如果需要全局使用,可以在应用启动时注入到uni对象中 export function installStringExtensions() { // @ts-ignore if (!uni.$string) { // @ts-ignore uni.$string = StringExtensions; } }