/// 字符串工具类 /// /// 提供字符串转换和格式化功能 class StringHelper { /// 私有构造函数,防止实例化 StringHelper._(); /// 下划线转驼峰命名 /// /// 例如:icon_32_clean -> icon32Clean static String toCamelCase(String input) { // 预处理:将常见特殊字符转换 final processedInput = input .replaceAll('-', '_') .replaceAll('+', 'plus') .replaceAll('(', '') .replaceAll(')', '') .replaceAll(' ', ''); final parts = processedInput.split('_'); if (parts.isEmpty) return input; final firstPart = parts[0]; final remainingParts = parts.skip(1).map((part) { if (part.isEmpty) return ''; return part[0].toUpperCase() + part.substring(1); }).join(); return firstPart + remainingParts; } /// 转换为合法的 Dart 标识符 /// /// 确保首字符不是数字,只包含字母、数字和下划线 static String toLegalDartName(String input) { var name = toCamelCase(input); // 首字符为数字,前面加下划线 if (name.isNotEmpty && RegExp('^[0-9]').hasMatch(name[0])) { name = '_$name'; } // 只保留字母、数字和下划线 return name.replaceAll(RegExp('[^a-zA-Z0-9_]'), ''); } /// 转换为 PascalCase(首字母大写的驼峰命名) /// /// 例如:icon_class -> IconClass static String toPascalCase(String input) { final camelCase = toCamelCase(input); if (camelCase.isEmpty) return camelCase; return camelCase[0].toUpperCase() + camelCase.substring(1); } /// 格式化时间长度 static String formatDuration(Duration duration) { if (duration.inMinutes > 0) { return '${duration.inMinutes}m ${duration.inSeconds % 60}s'; } else if (duration.inSeconds > 0) { return '${duration.inSeconds}.${(duration.inMilliseconds % 1000) ~/ 100}s'; } else { return '${duration.inMilliseconds}ms'; } } }