UNPKG

@fast-china/utils

Version:

Fast 工具库.

1 lines 16.3 kB
{"version":3,"file":"index.mjs","sources":["../../../../src/string/index.ts"],"sourcesContent":["import { isNumber, isString, merge } from \"lodash-unified\";\n\nlet language: string;\nconst languageMap = {\n\tzh: \"zh-CN\",\n\ten: \"en-US\",\n\tzh_CN: \"zh-CN\",\n\tzh_TW: \"zh-TW\",\n};\n\n/**\n * 字符串工具类\n */\nexport const stringUtil = {\n\t/**\n\t * 深度解码\n\t */\n\tdeepDecodeURIComponent(str: string, maxDepth = 10): string {\n\t\tif (!str) return str;\n\t\tlet decoded = str;\n\t\tfor (let i = 0; i < maxDepth; i++) {\n\t\t\tconst next = decodeURIComponent(decoded);\n\t\t\tif (next === decoded) {\n\t\t\t\t// 已经无法继续解码,提前退出\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tdecoded = next;\n\t\t}\n\t\treturn decoded;\n\t},\n\t/**\n\t * 获取Url参数\n\t */\n\tgetUrlParams(url: string): Record<string, any> {\n\t\tconst regex = /[?&][^=?&]+=[^?&]+/g;\n\t\tconst params: Record<string, any> = {};\n\n\t\tlet match;\n\t\twhile ((match = regex.exec(url)) !== null) {\n\t\t\tconst [key, value] = match[0].substring(1).split(\"=\");\n\t\t\tparams[key] = decodeURIComponent(value);\n\t\t}\n\n\t\treturn params;\n\t},\n\t/**\n\t * 是否为JSON字符串\n\t */\n\tisJson(value: string): boolean {\n\t\tif (!isString(value)) return false;\n\n\t\tvalue = value.replace(/\\s/g, \"\").replace(/\\n|\\r/, \"\");\n\n\t\tif (/^\\{.*?\\}$/.test(value)) return /\".*?\":/.test(value);\n\n\t\tif (/^\\[.*?\\]$/.test(value)) {\n\t\t\treturn value\n\t\t\t\t.replace(/^\\[/, \"\")\n\t\t\t\t.replace(/\\]$/, \"\")\n\t\t\t\t.replace(/\\},\\{/g, \"}\\n{\")\n\t\t\t\t.split(/\\n/)\n\t\t\t\t.map((s) => {\n\t\t\t\t\treturn stringUtil.isJson(s);\n\t\t\t\t})\n\t\t\t\t.reduce((prev, curr) => {\n\t\t\t\t\treturn !!curr;\n\t\t\t\t});\n\t\t}\n\n\t\treturn false;\n\t},\n\t/**\n\t * 切割骆驼命名式字符串\n\t */\n\tsplitCamelCase(value: string): string[] {\n\t\tif (!value) return [];\n\n\t\tif (value.length === 1) return [value];\n\n\t\treturn value.split(/(?=\\p{Lu}\\p{Ll})|(?<=\\p{Ll})(?=\\p{Lu})/u).filter((token) => token.length > 0);\n\t},\n\t/**\n\t * 将字符串转为 camelCase 格式,支持 - 或 _ 分隔的字符串\n\t * 例如:'hello-world' 或 'hello_world' => 'helloWorld'\n\t */\n\ttoCamelCase(value: string): string {\n\t\tif (!value) return \"\";\n\t\treturn value.replace(/[-_](\\w)/g, (_, c) => (c ? c.toUpperCase() : \"\"));\n\t},\n\t/**\n\t * 字符串首字母大写\n\t */\n\tfirstCharToUpper(value: string): string {\n\t\tif (!value) return \"\";\n\t\treturn value.charAt(0).toUpperCase() + value.slice(1);\n\t},\n\t/**\n\t * 字符串首字母小写\n\t */\n\tfirstCharToLower(value: string): string {\n\t\tif (!value) return \"\";\n\t\treturn value.charAt(0).toLowerCase() + value.slice(1);\n\t},\n\t/**\n\t * 截取指定长度的字符串\n\t */\n\tsubStringWithEllipsis(value: string, length: number, suffix = \"...\"): string {\n\t\tif (!value) return \"\";\n\t\treturn value.length > length ? value.substring(0, length) + suffix : value;\n\t},\n\t/**\n\t * 生成随机字符串\n\t */\n\tgenerateRandomString(length: number): string {\n\t\tconst characters = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789\";\n\t\tlet randomString = \"\";\n\t\tfor (let i = 0; i < length; i++) {\n\t\t\tconst randomIndex = Math.floor(Math.random() * characters.length);\n\t\t\trandomString += characters.charAt(randomIndex);\n\t\t}\n\t\treturn randomString;\n\t},\n\t/**\n\t * @description 生成唯一 uuid\n\t */\n\tgenerateUUID(): string {\n\t\tlet uuid = \"\";\n\t\tfor (let i = 0; i < 32; i++) {\n\t\t\tconst random = (Math.random() * 16) | 0;\n\t\t\tif (i === 8 || i === 12 || i === 16 || i === 20) uuid += \"-\";\n\t\t\tuuid += (i === 12 ? 4 : i === 16 ? (random & 3) | 8 : random).toString(16);\n\t\t}\n\t\treturn uuid;\n\t},\n\t/**\n\t * 复制\n\t */\n\tasync copy(value: string): Promise<void> {\n\t\tif (typeof uni !== \"undefined\") {\n\t\t\treturn new Promise((resolve, reject) => {\n\t\t\t\tuni.setClipboardData({\n\t\t\t\t\tdata: value,\n\t\t\t\t\tsuccess: () => {\n\t\t\t\t\t\tresolve();\n\t\t\t\t\t},\n\t\t\t\t\tfail: () => {\n\t\t\t\t\t\treject();\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t});\n\t\t} else {\n\t\t\t// navigator.clipboard 需要https等安全上下文\n\t\t\tif (navigator?.clipboard && window.isSecureContext) {\n\t\t\t\tawait navigator.clipboard.writeText(value);\n\t\t\t} else {\n\t\t\t\tconst textareaEl = document.createElement(\"textarea\");\n\t\t\t\ttextareaEl.value = value;\n\t\t\t\t// 使文本域不显示\n\t\t\t\ttextareaEl.style.position = \"absolute\";\n\t\t\t\ttextareaEl.style.opacity = \"0\";\n\t\t\t\ttextareaEl.style.left = \"-999999px\";\n\t\t\t\ttextareaEl.style.top = \"-999999px\";\n\t\t\t\tdocument.body.appendChild(textareaEl);\n\t\t\t\ttextareaEl.focus();\n\t\t\t\ttextareaEl.select();\n\t\t\t\tdocument.execCommand(\"copy\");\n\t\t\t\ttextareaEl.remove();\n\t\t\t}\n\t\t}\n\t},\n\t/**\n\t * 使用程序运行的语言将Number转为特定格式的字符串\n\t */\n\ttoLocaleString(value: string | number, options?: Intl.NumberFormatOptions): string {\n\t\tif (value) {\n\t\t\tif (isNumber(value)) {\n\t\t\t\tif (typeof uni !== \"undefined\") {\n\t\t\t\t\tif (!language) {\n\t\t\t\t\t\tlanguage = uni.getAppBaseInfo().language;\n\t\t\t\t\t}\n\t\t\t\t\treturn value.toLocaleString(languageMap[language] || \"zh-CN\", options);\n\t\t\t\t} else {\n\t\t\t\t\treturn value.toLocaleString(navigator.language || \"zh-CN\", options);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn value as string;\n\t},\n\t/**\n\t * 使用程序运行的语言将Number转为特定格式的字符串\n\t * @description 默认保留2位小数,补齐2位,不显示千分位\n\t */\n\ttoLocaleString_i2x2(value: string | number, options?: Intl.NumberFormatOptions): string {\n\t\toptions = merge(options || {}, {\n\t\t\tminimumFractionDigits: 2,\n\t\t\tmaximumFractionDigits: 2,\n\t\t\tuseGrouping: false,\n\t\t});\n\t\treturn this.toLocaleString(value, options);\n\t},\n\t/**\n\t * 使用程序运行的语言将Number转为特定格式的字符串\n\t * @description 默认保留2位小数,补齐2位,显示千分位\n\t */\n\ttoLocaleString_i2x2g(value: string | number, options?: Intl.NumberFormatOptions): string {\n\t\toptions = merge(options || {}, {\n\t\t\tminimumFractionDigits: 2,\n\t\t\tmaximumFractionDigits: 2,\n\t\t\tuseGrouping: true,\n\t\t});\n\t\treturn this.toLocaleString(value, options);\n\t},\n\t/**\n\t * 使用程序运行的语言将Number转为特定格式的字符串\n\t * @description 默认保留4位小数,补齐2位,不显示千分位\n\t */\n\ttoLocaleString_i2x4(value: string | number, options?: Intl.NumberFormatOptions): string {\n\t\toptions = merge(options || {}, {\n\t\t\tminimumFractionDigits: 2,\n\t\t\tmaximumFractionDigits: 4,\n\t\t\tuseGrouping: false,\n\t\t});\n\t\treturn this.toLocaleString(value, options);\n\t},\n\t/**\n\t * 使用程序运行的语言将Number转为特定格式的字符串\n\t * @description 默认保留4位小数,补齐2位,显示千分位\n\t */\n\ttoLocaleString_i2x4g(value: string | number, options?: Intl.NumberFormatOptions): string {\n\t\toptions = merge(options || {}, {\n\t\t\tminimumFractionDigits: 2,\n\t\t\tmaximumFractionDigits: 4,\n\t\t\tuseGrouping: true,\n\t\t});\n\t\treturn this.toLocaleString(value, options);\n\t},\n\t/**\n\t * 使用程序运行的语言将Number转为特定格式的字符串\n\t * @description 默认保留6位小数,补齐2位,不显示千分位\n\t */\n\ttoLocaleString_i2x6(value: string | number, options?: Intl.NumberFormatOptions): string {\n\t\toptions = merge(options || {}, {\n\t\t\tminimumFractionDigits: 2,\n\t\t\tmaximumFractionDigits: 6,\n\t\t\tuseGrouping: false,\n\t\t});\n\t\treturn this.toLocaleString(value, options);\n\t},\n\t/**\n\t * 使用程序运行的语言将Number转为特定格式的字符串\n\t * @description 默认保留6位小数,补齐2位,显示千分位\n\t */\n\ttoLocaleString_i2x6g(value: string | number, options?: Intl.NumberFormatOptions): string {\n\t\toptions = merge(options || {}, {\n\t\t\tminimumFractionDigits: 2,\n\t\t\tmaximumFractionDigits: 6,\n\t\t\tuseGrouping: true,\n\t\t});\n\t\treturn this.toLocaleString(value, options);\n\t},\n\t/**\n\t * 使用程序运行的语言将Number转为特定格式的字符串\n\t * @description 默认保留4位小数,补齐4位,不显示千分位\n\t */\n\ttoLocaleString_i4x4(value: string | number, options?: Intl.NumberFormatOptions): string {\n\t\toptions = merge(options || {}, {\n\t\t\tminimumFractionDigits: 4,\n\t\t\tmaximumFractionDigits: 4,\n\t\t\tuseGrouping: false,\n\t\t});\n\t\treturn this.toLocaleString(value, options);\n\t},\n\t/**\n\t * 使用程序运行的语言将Number转为特定格式的字符串\n\t * @description 默认保留4位小数,补齐4位,显示千分位\n\t */\n\ttoLocaleString_i4x4g(value: string | number, options?: Intl.NumberFormatOptions): string {\n\t\toptions = merge(options || {}, {\n\t\t\tminimumFractionDigits: 4,\n\t\t\tmaximumFractionDigits: 4,\n\t\t\tuseGrouping: true,\n\t\t});\n\t\treturn this.toLocaleString(value, options);\n\t},\n\t/**\n\t * 使用程序运行的语言将Number转为特定格式的字符串\n\t * @description 默认保留6位小数,补齐4位,不显示千分位\n\t */\n\ttoLocaleString_i4x6(value: string | number, options?: Intl.NumberFormatOptions): string {\n\t\toptions = merge(options || {}, {\n\t\t\tminimumFractionDigits: 4,\n\t\t\tmaximumFractionDigits: 6,\n\t\t\tuseGrouping: false,\n\t\t});\n\t\treturn this.toLocaleString(value, options);\n\t},\n\t/**\n\t * 使用程序运行的语言将Number转为特定格式的字符串\n\t * @description 默认保留6位小数,补齐4位,显示千分位\n\t */\n\ttoLocaleString_i4x6g(value: string | number, options?: Intl.NumberFormatOptions): string {\n\t\toptions = merge(options || {}, {\n\t\t\tminimumFractionDigits: 4,\n\t\t\tmaximumFractionDigits: 6,\n\t\t\tuseGrouping: true,\n\t\t});\n\t\treturn this.toLocaleString(value, options);\n\t},\n\t/**\n\t * 使用程序运行的语言将Number转为特定格式的字符串\n\t * @description 默认保留6位小数,补齐6位,不显示千分位\n\t */\n\ttoLocaleString_i6x6(value: string | number, options?: Intl.NumberFormatOptions): string {\n\t\toptions = merge(options || {}, {\n\t\t\tminimumFractionDigits: 6,\n\t\t\tmaximumFractionDigits: 6,\n\t\t\tuseGrouping: false,\n\t\t});\n\t\treturn this.toLocaleString(value, options);\n\t},\n\t/**\n\t * 使用程序运行的语言将Number转为特定格式的字符串\n\t * @description 默认保留6位小数,补齐6位,显示千分位\n\t */\n\ttoLocaleString_i6x6g(value: string | number, options?: Intl.NumberFormatOptions): string {\n\t\toptions = merge(options || {}, {\n\t\t\tminimumFractionDigits: 6,\n\t\t\tmaximumFractionDigits: 6,\n\t\t\tuseGrouping: true,\n\t\t});\n\t\treturn this.toLocaleString(value, options);\n\t},\n};\n"],"names":[],"mappings":"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"}