function formatName(name: string, max: number, includeMaxChar: boolean): string {
let charCount = 0;
let result = '';
// 计算字符长度的函数
const getCharSize = (char: string): number => {
const charCode = char.charCodeAt(0);
// 中文字符 (UNICODE 范围) 或大写英文字符
if ((charCode >= 0x4e00 && charCode <= 0x9fff) || (charCode >= 65 && charCode <= 90)) {
return 1; // 中文字符和大写英文字符计作 1 个字符大小
}
// 小写英文字符和数字
else if ((charCode >= 97 && charCode <= 122) || (charCode >= 48 && charCode <= 57)) {
return 0.5; // 小写英文字符和数字计作 0.5 个字符大小
}
return 0; // 其他字符不计算
};
// 遍历每个字符,计算长度并构建结果
for (const char of name) {
const size = getCharSize(char);
// 判断是否超过了 max 或 max-2
if (includeMaxChar) {
if (charCount + size > max) {
return result + '...'; // 如果超过了 max,则加省略号
}
} else {
if (charCount + size > max - 2) {
return result + '...'; // 如果不包含最长字符,则按照 max-2 个字符进行截取
}
}
result += char;
charCount += size;
}
// 如果最终字符长度满足要求
if (includeMaxChar) {
return charCount <= max ? name : result + '...';
} else {
return charCount < max ? name : result + '...';
}
}
// 测试用例
console.log(formatName('测试测试测试测试', 8, true)); // 包含最长字符 max
console.log(formatName('111测试测试测试测11111', 8, true)); // 包含最长字符 max
console.log(formatName('测试测试测试测a', 8, true)); // 包含最长字符 max
console.log(formatName('a测试测试测试七', 8, true)); // 包含最长字符 max
console.log(formatName('aa测试测试测试七', 8, true)); // 包含最长字符 max
console.log(formatName('aa测试测试a测a试', 8, true)); // 包含最长字符 max
console.log('===================='); // 不包含最长字符 max
console.log(formatName('测试测试测试测试', 8, false)); // 包含最长字符 max
console.log(formatName('测试测试测试测1', 8, false)); // 包含最长字符 max
console.log(formatName('测试测试测试测a', 8, false)); // 包含最长字符 max
console.log(formatName('a测试测试测试七', 8, false)); // 包含最长字符 max
console.log(formatName('aa测试测试测试七', 8, false)); // 包含最长字符 max
console.log(formatName('aa测试测试a测a试', 8, false)); // 包含最长字符 max
function formatName(name: string, max: number, includeMaxChar: boolean): string {
let charCount = 0;
let result = '';
// 根据字符类型计算字符大小
const getCharSize = (char: string): number =>
/[\u4e00-\u9fffA-Z]/.test(char) ? 1 : /[a-z0-9]/.test(char) ? 0.5 : 0;
// 实际允许的字符总长度
const maxAllowedLength = includeMaxChar ? max : max - 2;
// 遍历字符串并计算长度
for (const char of name) {
const size = getCharSize(char);
if (charCount + size > maxAllowedLength) {
return result + '...'; // 超过最大长度时加省略号
}
result += char;
charCount += size;
}
return result; // 未超出最大长度则直接返回结果
}
// 测试用例
console.log(formatName('测试测试测试测试', 8, true)); // 包含最长字符 max
console.log(formatName('111测试测试测试测11111', 8, true)); // 包含最长字符 max
console.log(formatName('测试测试测试测aA', 8, true)); // 包含最长字符 max
console.log(formatName('a测试测试测试七', 8, true)); // 包含最长字符 max
console.log(formatName('aa测试测试测试七', 8, true)); // 包含最长字符 max
console.log(formatName('aa测试测试a测a试', 8, true)); // 包含最长字符 max
console.log('===================='); // 不包含最长字符 max
console.log(formatName('测试测试测试测试', 8, false)); // 包含最长字符 max
console.log(formatName('测试测试测试测1', 8, false)); // 包含最长字符 max
console.log(formatName('测试测试测试测a', 8, false)); // 包含最长字符 max
console.log(formatName('a测试测试测试七', 8, false)); // 包含最长字符 max
console.log(formatName('aa测试测试测试七', 8, false)); // 包含最长字符 max
console.log(formatName('aa测试测试a测a试', 8, false)); // 包含最长字符 max
function formatName(name: string, max: number, includeMaxChar: boolean): string {
let charCount = 0;
let result = '';
const maxAllowedLength = includeMaxChar ? max : max - 2;
// 计算字符大小的简化版函数
const getCharSize = (char: string): number => /[\u4e00-\u9fffA-Z]/.test(char) ? 1 : 0.5;
// 遍历字符,计算长度并生成结果
for (const char of name) {
const size = getCharSize(char);
if (charCount + size > maxAllowedLength) {
return result + '...'; // 超出最大长度,加省略号
}
result += char;
charCount += size;
}
return result; // 未超出最大长度,返回完整字符串
}
// 测试用例
console.log(formatName('测试测试测试测试', 8, true)); // 包含最长字符 max
console.log(formatName('111测试测试测试测11111', 8, true)); // 包含最长字符 max
console.log(formatName('测试测试测试测aA', 8, true)); // 包含最长字符 max
console.log(formatName('a测试测试测试七', 8, true)); // 包含最长字符 max
console.log(formatName('aa测试测试测试七', 8, true)); // 包含最长字符 max
console.log(formatName('aa测试测试a测a试', 8, true)); // 包含最长字符 max
console.log('===================='); // 不包含最长字符 max
console.log(formatName('测试测试测试测试', 8, false)); // 包含最长字符 max
console.log(formatName('测试测试测试测1', 8, false)); // 包含最长字符 max
console.log(formatName('测试测试测试测a', 8, false)); // 包含最长字符 max
console.log(formatName('a测试测试测试七', 8, false)); // 包含最长字符 max
console.log(formatName('aa测试测试测试七', 8, false)); // 包含最长字符 max
console.log(formatName('aa测试测试a测a试', 8, false)); // 包含最长字符 max
function formatName(name: string, max: number, includeMaxChar: boolean): string {
let charCount = 0;
let result = '';
const maxAllowedLength = includeMaxChar ? max : max - 2;
// 计算字符大小的简化版函数
const getCharSize = (char: string): number => /[\u4e00-\u9fffA-Z]/.test(char) ? 1 : 0.5;
// 遍历字符,计算长度并生成结果
for (const char of name) {
const size = getCharSize(char);
if (charCount + size > maxAllowedLength) {
return result + '...'; // 超出最大长度,加省略号
}
result += char;
charCount += size;
}
return result; // 未超出最大长度,返回完整字符串
}
// 测试用例
console.log(formatName('一二三四五六七八九十', 8, true)); // 包含最长字符 max
console.log(formatName('一二三四五六七八', 8, true)); // 包含最长字符 max
console.log(formatName('一二三四五六七八1', 8, true)); // 包含最长字符 max
console.log(formatName('一二三四五六七八a', 8, true)); // 包含最长字符 max
console.log(formatName('一二三四五六七A', 8, true)); // 包含最长字符 max
console.log(formatName('一二三四五六七a', 8, true)); // 包含最长字符 max
console.log(formatName('一二三四五六Aa', 8, true)); // 包含最长字符 max
console.log(formatName('一二三四五六Aaa', 8, true)); // 包含最长字符 max
console.log(formatName('一二三四五六Aaa1', 8, true)); // 包含最长字符 max
console.log(formatName('一二三四五六1aa', 8, true)); // 包含最长字符 max
console.log(formatName('一二', 8, true)); // 包含最长字符 max
console.log(formatName('a一二三四五六1aa', 8, true)); // 包含最长字符 max
console.log(formatName('aaa一二三四五六七baa', 8, true)); // 包含最长字符 max
console.log('===================='); // 不包含最长字符 max
// 测试用例
console.log(formatName('一二三四五六七八九十', 8, false)); // 包含最长字符 max
console.log(formatName('一二三四五六', 8, false)); // 包含最长字符 max
console.log(formatName('一二三四五六1', 8, false)); // 包含最长字符 max
console.log(formatName('一二三四五六a', 8, false)); // 包含最长字符 max
console.log(formatName('一二三四五六A', 8, false)); // 包含最长字符 max
console.log(formatName('一二三四五a', 8, false)); // 包含最长字符 max
console.log(formatName('一二三四五Aa', 8, false)); // 包含最长字符 max
console.log(formatName('一二三四五Aaa', 8, false)); // 包含最长字符 max
console.log(formatName('一二三四Aaa1', 8, false)); // 包含最长字符 max
console.log(formatName('一二三四五六1aa', 8, false)); // 包含最长字符 max
console.log(formatName('一二', 8, false)); // 包含最长字符 max
console.log(formatName('a一二三四五六1aa', 8, false)); // 包含最长字符 max
console.log(formatName('aaa一二三四五六七baa', 8, false)); // 包含最长字符 max