string.extensions.ts 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. /**
  2. * 字符串扩展工具类(UniApp/微信小程序兼容版)
  3. * 由于微信小程序环境限制,不直接修改String原型,而是提供工具函数
  4. */
  5. // 匹配所有字符(包括中文、标点、符号、数字、字母等)
  6. const ALL_CHARS_REGEX = /([\u4e00-\u9fa5\uFF00-\uFFEF\w\s.,!?;:'"\-+*/=@#$%^&])/g;
  7. /**
  8. * 安全截断字符串
  9. * @param str 原始字符串
  10. * @param start 开始位置
  11. * @param length 截取长度
  12. * @param suffix 后缀,默认为'...'
  13. * @returns 截断后的字符串
  14. */
  15. export function safeTruncate(str: string, start: number, length: number, suffix: string = '...'): string {
  16. if (length <= 0) return '';
  17. const chars = Array.from(str.match(ALL_CHARS_REGEX) || []);
  18. if (chars.length <= length) {
  19. return chars.join('');
  20. }
  21. return chars.slice(start, start + length).join('') + suffix;
  22. }
  23. /**
  24. * 计算字符串的显示长度(考虑多字节字符)
  25. * @param str 原始字符串
  26. * @returns 显示长度
  27. */
  28. export function displayLength(str: string): number {
  29. const chars = Array.from(str.match(ALL_CHARS_REGEX) || []);
  30. return chars.length;
  31. }
  32. /**
  33. * 增强版空值检查
  34. * @param val 要检查的值
  35. * @returns 是否为空
  36. */
  37. export const isEmpty = (val: any): boolean => {
  38. // 处理 null 和 undefined
  39. if (val === null || val === undefined) return true;
  40. // 处理基本类型
  41. switch (typeof val) {
  42. case 'string':
  43. return val.trim() === '';
  44. case 'number':
  45. case 'bigint':
  46. return val === 0;
  47. case 'boolean':
  48. return val === false;
  49. }
  50. // 处理数组
  51. if (Array.isArray(val)) return val.length === 0;
  52. // 处理日期对象
  53. if (val instanceof Date) return false;
  54. // 处理普通对象
  55. if (typeof val === 'object') {
  56. // 处理 Map 和 Set
  57. if (val instanceof Map || val instanceof Set) return val.size === 0;
  58. return Object.keys(val).length === 0;
  59. }
  60. return false;
  61. };
  62. /**
  63. * 字符串扩展工具集合
  64. */
  65. export const StringExtensions = {
  66. safeTruncate,
  67. displayLength,
  68. isEmpty
  69. };
  70. // 可选:如果需要全局使用,可以在应用启动时注入到uni对象中
  71. export function installStringExtensions() {
  72. // @ts-ignore
  73. if (!uni.$string) {
  74. // @ts-ignore
  75. uni.$string = StringExtensions;
  76. }
  77. }