@canvas-components/utils 0.2.1 → 0.2.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +130 -103
- package/dist/date/index.cjs +162 -0
- package/dist/date/index.cjs.map +1 -0
- package/dist/date/index.d.cts +13 -0
- package/dist/date/index.d.ts +13 -0
- package/dist/date/index.js +158 -0
- package/dist/date/index.js.map +1 -0
- package/dist/index.cjs +553 -0
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +2 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +537 -1
- package/dist/index.js.map +1 -1
- package/dist/number/index.cjs +399 -0
- package/dist/number/index.cjs.map +1 -0
- package/dist/number/index.d.cts +44 -0
- package/dist/number/index.d.ts +44 -0
- package/dist/number/index.js +384 -0
- package/dist/number/index.js.map +1 -0
- package/package.json +11 -1
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/clipboard/index.ts","../src/export/index.ts","../src/data/index.ts","../src/geometry/index.ts"],"names":["XLSX"],"mappings":"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","file":"index.cjs","sourcesContent":["export type ClipboardCellValue = string | number | boolean | null | undefined;\n\n/**\n * 写入纯文本到系统剪贴板。\n */\nexport async function copyText(text: string, ownerDocument = document) {\n const clipboard = ownerDocument.defaultView?.navigator.clipboard;\n try {\n if (clipboard?.writeText) {\n await clipboard.writeText(text);\n return true;\n }\n } catch {\n // 非安全上下文或权限拒绝时回退到同步 DOM 复制。\n }\n\n return copyTextSync(text, ownerDocument);\n}\n\n/** 在当前用户激活事件中同步复制纯文本。 */\nexport function copyTextSync(text: string, ownerDocument = document) {\n const activeElement = ownerDocument.activeElement;\n const textarea = ownerDocument.createElement(\"textarea\");\n textarea.value = text;\n textarea.setAttribute(\"readonly\", \"true\");\n textarea.style.position = \"fixed\";\n textarea.style.left = \"-9999px\";\n textarea.style.top = \"0\";\n textarea.style.opacity = \"0\";\n\n ownerDocument.body.appendChild(textarea);\n textarea.focus({ preventScroll: true });\n textarea.select();\n textarea.setSelectionRange(0, textarea.value.length);\n\n let copied = false;\n try {\n copied = ownerDocument.execCommand?.(\"copy\") ?? false;\n } catch {\n copied = false;\n } finally {\n textarea.remove();\n const HTMLElementConstructor = ownerDocument.defaultView?.HTMLElement;\n if (\n HTMLElementConstructor &&\n activeElement instanceof HTMLElementConstructor\n ) {\n activeElement.focus({ preventScroll: true });\n }\n }\n return copied;\n}\n\n/**\n * 写入二维表格文本到系统剪贴板。\n */\nexport async function copyRows(rows: ClipboardCellValue[][]) {\n await copyText(formatRowsForClipboard(rows));\n}\n\n/**\n * 写入 JSON 文本到系统剪贴板。\n */\nexport async function copyJson(value: unknown, space = 2) {\n await copyText(JSON.stringify(value, null, space) ?? \"\");\n}\n\n/**\n * 格式化二维数据为剪贴板友好的文本。\n */\nexport function formatRowsForClipboard(rows: ClipboardCellValue[][]) {\n return rows.map((row) => row.map(formatClipboardCell).join(\"\\t\")).join(\"\\n\");\n}\n\nfunction formatClipboardCell(value: ClipboardCellValue) {\n if (value == null) {\n return \"\";\n }\n\n return String(value);\n}\n","import * as XLSX from \"xlsx\";\n\nconst EXPORT_CHUNK_SIZE = 2_000;\n\nexport interface ExportTableColumn<Row> {\n key: string;\n title: string;\n value: (row: Row, index: number) => unknown;\n}\n\n/**\n * 将表格行映射为适合导出的对象数组。\n */\nexport function mapRowsToExportRecords<Row>(params: {\n rows: Row[];\n columns: ExportTableColumn<Row>[];\n}) {\n const { rows, columns } = params;\n return rows.map((row, rowIndex) =>\n columns.reduce<Record<string, unknown>>((record, column) => {\n record[column.title] = column.value(row, rowIndex);\n return record;\n }, {}),\n );\n}\n\n/**\n * 生成 CSV 文本内容。\n */\nexport function buildCsvContent<Row>(params: {\n rows: Row[];\n columns: ExportTableColumn<Row>[];\n}) {\n const { rows, columns } = params;\n return serializeCsvRows([\n columns.map((column) => column.title),\n ...rows.map((row, rowIndex) =>\n columns.map((column) => column.value(row, rowIndex)),\n ),\n ]);\n}\n\n/**\n * 将二维数据序列化为 CSV 文本。\n */\nexport function serializeCsvRows(\n rows: readonly (readonly unknown[])[],\n lineBreak = \"\\n\",\n) {\n return rows\n .map((row) => row.map((value) => escapeCsvCell(value)).join(\",\"))\n .join(lineBreak);\n}\n\n/**\n * 生成 TXT 文本内容。\n */\nexport function buildTxtContent<Row>(params: {\n rows: Row[];\n columns: ExportTableColumn<Row>[];\n}) {\n const { rows, columns } = params;\n const header = columns\n .map((column) => normalizeTextCell(column.title))\n .join(\"\\t\");\n const body = rows.map((row, rowIndex) =>\n columns\n .map((column) => normalizeTextCell(column.value(row, rowIndex)))\n .join(\"\\t\"),\n );\n\n return [header, ...body].join(\"\\n\");\n}\n\n/**\n * 下载 JSON 文件。\n */\nexport async function downloadJsonFile(params: {\n fileName: string;\n data: unknown;\n space?: number;\n}) {\n const { data, fileName, space = 2 } = params;\n const content = await buildJsonContentAsync({ data, space });\n downloadTextFile({\n fileName: ensureExtension(fileName, \"json\"),\n content,\n type: \"application/json;charset=utf-8\",\n });\n}\n\n/**\n * 导出表格 CSV 文件。\n */\nexport async function exportTableToCsv<Row>(params: {\n fileName: string;\n rows: Row[];\n columns: ExportTableColumn<Row>[];\n}) {\n const { fileName, rows, columns } = params;\n const content = await buildCsvContentAsync({ rows, columns });\n downloadTextFile({\n fileName: ensureExtension(fileName, \"csv\"),\n content,\n type: \"text/csv;charset=utf-8\",\n });\n}\n\n/**\n * 导出表格 TXT 文件。\n */\nexport async function exportTableToTxt<Row>(params: {\n fileName: string;\n rows: Row[];\n columns: ExportTableColumn<Row>[];\n}) {\n const { fileName, rows, columns } = params;\n const content = await buildTxtContentAsync({ rows, columns });\n downloadTextFile({\n fileName: ensureExtension(fileName, \"txt\"),\n content,\n type: \"text/plain;charset=utf-8\",\n });\n}\n\n/**\n * 导出表格 XLSX 文件。\n */\nexport async function exportTableToXlsx<Row>(params: {\n fileName: string;\n rows: Row[];\n columns: ExportTableColumn<Row>[];\n sheetName?: string;\n}) {\n const { fileName, rows, columns, sheetName = \"Sheet1\" } = params;\n const worksheet = await buildXlsxWorksheet({ rows, columns });\n const workbook = XLSX.utils.book_new();\n XLSX.utils.book_append_sheet(workbook, worksheet, sheetName);\n await yieldToMainThread();\n XLSX.writeFile(workbook, ensureExtension(fileName, \"xlsx\"));\n}\n\n/**\n * 构建适合大数据量导出的 XLSX 工作表。\n */\nasync function buildXlsxWorksheet<Row>(params: {\n rows: Row[];\n columns: ExportTableColumn<Row>[];\n}) {\n const { rows, columns } = params;\n const header = columns.map((column) => column.title);\n const denseOptions = { dense: true } as unknown as XLSX.AOA2SheetOpts;\n const appendOptions = {\n origin: -1,\n dense: true,\n } as unknown as XLSX.SheetAOAOpts;\n const worksheet = XLSX.utils.aoa_to_sheet([header], denseOptions);\n const chunkSize = EXPORT_CHUNK_SIZE;\n\n for (let start = 0; start < rows.length; start += chunkSize) {\n const chunk = rows\n .slice(start, start + chunkSize)\n .map((row, rowIndex) =>\n columns.map((column) =>\n normalizeXlsxCell(column.value(row, start + rowIndex)),\n ),\n );\n\n XLSX.utils.sheet_add_aoa(worksheet, chunk, appendOptions);\n\n await yieldToMainThread();\n }\n\n return worksheet;\n}\n\nasync function buildJsonContentAsync(params: { data: unknown; space: number }) {\n const { data, space } = params;\n if (!Array.isArray(data)) {\n return JSON.stringify(data, null, space) ?? \"\";\n }\n\n if (data.length === 0) {\n return \"[]\";\n }\n\n const lineBreak = space > 0 ? \"\\n\" : \"\";\n const indent = space > 0 ? \" \".repeat(space) : \"\";\n const parts = [\"[\", lineBreak];\n\n for (let start = 0; start < data.length; start += EXPORT_CHUNK_SIZE) {\n const chunk = data.slice(start, start + EXPORT_CHUNK_SIZE);\n for (let index = 0; index < chunk.length; index += 1) {\n const itemIndex = start + index;\n const prefix = itemIndex === 0 ? \"\" : `,${lineBreak}`;\n const content = JSON.stringify(chunk[index], null, space) ?? \"null\";\n parts.push(prefix, indent, content);\n }\n\n await yieldToMainThread();\n }\n\n parts.push(lineBreak, \"]\");\n return parts.join(\"\");\n}\n\nasync function buildCsvContentAsync<Row>(params: {\n rows: Row[];\n columns: ExportTableColumn<Row>[];\n}) {\n const { rows, columns } = params;\n const header = columns.map((column) => escapeCsvCell(column.title)).join(\",\");\n const parts = [header];\n\n for (let start = 0; start < rows.length; start += EXPORT_CHUNK_SIZE) {\n const chunk = rows.slice(start, start + EXPORT_CHUNK_SIZE);\n for (let rowIndex = 0; rowIndex < chunk.length; rowIndex += 1) {\n const row = chunk[rowIndex];\n const line = columns\n .map((column) => escapeCsvCell(column.value(row, start + rowIndex)))\n .join(\",\");\n parts.push(\"\\n\", line);\n }\n\n await yieldToMainThread();\n }\n\n return parts.join(\"\");\n}\n\nasync function buildTxtContentAsync<Row>(params: {\n rows: Row[];\n columns: ExportTableColumn<Row>[];\n}) {\n const { rows, columns } = params;\n const header = columns\n .map((column) => normalizeTextCell(column.title))\n .join(\"\\t\");\n const parts = [header];\n\n for (let start = 0; start < rows.length; start += EXPORT_CHUNK_SIZE) {\n const chunk = rows.slice(start, start + EXPORT_CHUNK_SIZE);\n for (let rowIndex = 0; rowIndex < chunk.length; rowIndex += 1) {\n const row = chunk[rowIndex];\n const line = columns\n .map((column) => normalizeTextCell(column.value(row, start + rowIndex)))\n .join(\"\\t\");\n parts.push(\"\\n\", line);\n }\n\n await yieldToMainThread();\n }\n\n return parts.join(\"\");\n}\n\nfunction escapeCsvCell(value: unknown) {\n const normalized = value == null ? \"\" : String(value);\n if (\n normalized.includes(\",\") ||\n normalized.includes('\"') ||\n normalized.includes(\"\\n\")\n ) {\n return `\"${normalized.split('\"').join('\"\"')}\"`;\n }\n return normalized;\n}\n\nfunction normalizeTextCell(value: unknown) {\n return value == null ? \"\" : String(value);\n}\n\nfunction normalizeXlsxCell(value: unknown) {\n if (value == null) {\n return \"\";\n }\n\n if (\n typeof value === \"string\" ||\n typeof value === \"number\" ||\n typeof value === \"boolean\"\n ) {\n return value;\n }\n\n if (value instanceof Date) {\n return value;\n }\n\n return String(value);\n}\n\nfunction ensureExtension(fileName: string, extension: string) {\n return fileName.toLowerCase().endsWith(`.${extension}`)\n ? fileName\n : `${fileName}.${extension}`;\n}\n\nfunction yieldToMainThread() {\n return new Promise<void>((resolve) => {\n if (\n typeof window !== \"undefined\" &&\n typeof window.requestAnimationFrame === \"function\"\n ) {\n window.requestAnimationFrame(() => {\n resolve();\n });\n return;\n }\n\n setTimeout(resolve, 0);\n });\n}\n\nfunction downloadTextFile(params: {\n fileName: string;\n content: string;\n type: string;\n}) {\n const { fileName, content, type } = params;\n const blob = new Blob([content], { type });\n const url = URL.createObjectURL(blob);\n const anchor = document.createElement(\"a\");\n anchor.href = url;\n anchor.download = fileName;\n anchor.click();\n URL.revokeObjectURL(url);\n}\n","/**\n * 支持对象属性路径的数据索引。\n */\nexport type ValueDataIndex = string | number | Array<string | number>;\n\n/**\n * 将 dataIndex 转换为稳定字符串。\n */\nexport function stringifyDataIndex(dataIndex: ValueDataIndex) {\n return (Array.isArray(dataIndex) ? dataIndex : [dataIndex])\n .map((item) => String(item))\n .join(\".\");\n}\n\n/**\n * 判断两个 dataIndex 是否指向相同属性路径。\n */\nexport function isSameDataIndex(left: ValueDataIndex, right: ValueDataIndex) {\n const leftPath = Array.isArray(left) ? left : [left];\n const rightPath = Array.isArray(right) ? right : [right];\n return (\n leftPath.length === rightPath.length &&\n leftPath.every((key, index) => key === rightPath[index])\n );\n}\n\n/**\n * 通过 dataIndex 安全读取值。\n *\n * @param source 数据记录。\n * @param dataIndex 属性路径。\n * @returns 读取结果。\n */\nexport function getValueByDataIndex(\n source: unknown,\n dataIndex?: ValueDataIndex,\n) {\n if (dataIndex == null) {\n return undefined;\n }\n\n const path = Array.isArray(dataIndex) ? dataIndex : [dataIndex];\n let current: unknown = source;\n\n for (const key of path) {\n if (\n current == null ||\n (typeof current !== \"object\" && typeof current !== \"function\")\n ) {\n return undefined;\n }\n current = (current as Record<string | number, unknown>)[key];\n }\n\n return current;\n}\n","/**\n * 将数值限制在指定闭区间内。\n */\nexport function clamp(value: number, minimum: number, maximum: number) {\n return Math.min(Math.max(value, minimum), maximum);\n}\n\n/**\n * 判断坐标是否位于矩形范围内,矩形边界视为命中。\n */\nexport function isPointInRect(\n x: number,\n y: number,\n rect: { x: number; y: number; width: number; height: number },\n) {\n return (\n x >= rect.x &&\n x <= rect.x + rect.width &&\n y >= rect.y &&\n y <= rect.y + rect.height\n );\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/clipboard/index.ts","../src/export/index.ts","../src/data/index.ts","../src/date/index.ts","../src/geometry/index.ts","../src/number/precise.ts","../src/number/index.ts"],"names":["XLSX","digit"],"mappings":"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","file":"index.cjs","sourcesContent":["export type ClipboardCellValue = string | number | boolean | null | undefined;\n\n/**\n * 写入纯文本到系统剪贴板。\n */\nexport async function copyText(text: string, ownerDocument = document) {\n const clipboard = ownerDocument.defaultView?.navigator.clipboard;\n try {\n if (clipboard?.writeText) {\n await clipboard.writeText(text);\n return true;\n }\n } catch {\n // 非安全上下文或权限拒绝时回退到同步 DOM 复制。\n }\n\n return copyTextSync(text, ownerDocument);\n}\n\n/** 在当前用户激活事件中同步复制纯文本。 */\nexport function copyTextSync(text: string, ownerDocument = document) {\n const activeElement = ownerDocument.activeElement;\n const textarea = ownerDocument.createElement(\"textarea\");\n textarea.value = text;\n textarea.setAttribute(\"readonly\", \"true\");\n textarea.style.position = \"fixed\";\n textarea.style.left = \"-9999px\";\n textarea.style.top = \"0\";\n textarea.style.opacity = \"0\";\n\n ownerDocument.body.appendChild(textarea);\n textarea.focus({ preventScroll: true });\n textarea.select();\n textarea.setSelectionRange(0, textarea.value.length);\n\n let copied = false;\n try {\n copied = ownerDocument.execCommand?.(\"copy\") ?? false;\n } catch {\n copied = false;\n } finally {\n textarea.remove();\n const HTMLElementConstructor = ownerDocument.defaultView?.HTMLElement;\n if (\n HTMLElementConstructor &&\n activeElement instanceof HTMLElementConstructor\n ) {\n activeElement.focus({ preventScroll: true });\n }\n }\n return copied;\n}\n\n/**\n * 写入二维表格文本到系统剪贴板。\n */\nexport async function copyRows(rows: ClipboardCellValue[][]) {\n await copyText(formatRowsForClipboard(rows));\n}\n\n/**\n * 写入 JSON 文本到系统剪贴板。\n */\nexport async function copyJson(value: unknown, space = 2) {\n await copyText(JSON.stringify(value, null, space) ?? \"\");\n}\n\n/**\n * 格式化二维数据为剪贴板友好的文本。\n */\nexport function formatRowsForClipboard(rows: ClipboardCellValue[][]) {\n return rows.map((row) => row.map(formatClipboardCell).join(\"\\t\")).join(\"\\n\");\n}\n\nfunction formatClipboardCell(value: ClipboardCellValue) {\n if (value == null) {\n return \"\";\n }\n\n return String(value);\n}\n","import * as XLSX from \"xlsx\";\n\nconst EXPORT_CHUNK_SIZE = 2_000;\n\nexport interface ExportTableColumn<Row> {\n key: string;\n title: string;\n value: (row: Row, index: number) => unknown;\n}\n\n/**\n * 将表格行映射为适合导出的对象数组。\n */\nexport function mapRowsToExportRecords<Row>(params: {\n rows: Row[];\n columns: ExportTableColumn<Row>[];\n}) {\n const { rows, columns } = params;\n return rows.map((row, rowIndex) =>\n columns.reduce<Record<string, unknown>>((record, column) => {\n record[column.title] = column.value(row, rowIndex);\n return record;\n }, {}),\n );\n}\n\n/**\n * 生成 CSV 文本内容。\n */\nexport function buildCsvContent<Row>(params: {\n rows: Row[];\n columns: ExportTableColumn<Row>[];\n}) {\n const { rows, columns } = params;\n return serializeCsvRows([\n columns.map((column) => column.title),\n ...rows.map((row, rowIndex) =>\n columns.map((column) => column.value(row, rowIndex)),\n ),\n ]);\n}\n\n/**\n * 将二维数据序列化为 CSV 文本。\n */\nexport function serializeCsvRows(\n rows: readonly (readonly unknown[])[],\n lineBreak = \"\\n\",\n) {\n return rows\n .map((row) => row.map((value) => escapeCsvCell(value)).join(\",\"))\n .join(lineBreak);\n}\n\n/**\n * 生成 TXT 文本内容。\n */\nexport function buildTxtContent<Row>(params: {\n rows: Row[];\n columns: ExportTableColumn<Row>[];\n}) {\n const { rows, columns } = params;\n const header = columns\n .map((column) => normalizeTextCell(column.title))\n .join(\"\\t\");\n const body = rows.map((row, rowIndex) =>\n columns\n .map((column) => normalizeTextCell(column.value(row, rowIndex)))\n .join(\"\\t\"),\n );\n\n return [header, ...body].join(\"\\n\");\n}\n\n/**\n * 下载 JSON 文件。\n */\nexport async function downloadJsonFile(params: {\n fileName: string;\n data: unknown;\n space?: number;\n}) {\n const { data, fileName, space = 2 } = params;\n const content = await buildJsonContentAsync({ data, space });\n downloadTextFile({\n fileName: ensureExtension(fileName, \"json\"),\n content,\n type: \"application/json;charset=utf-8\",\n });\n}\n\n/**\n * 导出表格 CSV 文件。\n */\nexport async function exportTableToCsv<Row>(params: {\n fileName: string;\n rows: Row[];\n columns: ExportTableColumn<Row>[];\n}) {\n const { fileName, rows, columns } = params;\n const content = await buildCsvContentAsync({ rows, columns });\n downloadTextFile({\n fileName: ensureExtension(fileName, \"csv\"),\n content,\n type: \"text/csv;charset=utf-8\",\n });\n}\n\n/**\n * 导出表格 TXT 文件。\n */\nexport async function exportTableToTxt<Row>(params: {\n fileName: string;\n rows: Row[];\n columns: ExportTableColumn<Row>[];\n}) {\n const { fileName, rows, columns } = params;\n const content = await buildTxtContentAsync({ rows, columns });\n downloadTextFile({\n fileName: ensureExtension(fileName, \"txt\"),\n content,\n type: \"text/plain;charset=utf-8\",\n });\n}\n\n/**\n * 导出表格 XLSX 文件。\n */\nexport async function exportTableToXlsx<Row>(params: {\n fileName: string;\n rows: Row[];\n columns: ExportTableColumn<Row>[];\n sheetName?: string;\n}) {\n const { fileName, rows, columns, sheetName = \"Sheet1\" } = params;\n const worksheet = await buildXlsxWorksheet({ rows, columns });\n const workbook = XLSX.utils.book_new();\n XLSX.utils.book_append_sheet(workbook, worksheet, sheetName);\n await yieldToMainThread();\n XLSX.writeFile(workbook, ensureExtension(fileName, \"xlsx\"));\n}\n\n/**\n * 构建适合大数据量导出的 XLSX 工作表。\n */\nasync function buildXlsxWorksheet<Row>(params: {\n rows: Row[];\n columns: ExportTableColumn<Row>[];\n}) {\n const { rows, columns } = params;\n const header = columns.map((column) => column.title);\n const denseOptions = { dense: true } as unknown as XLSX.AOA2SheetOpts;\n const appendOptions = {\n origin: -1,\n dense: true,\n } as unknown as XLSX.SheetAOAOpts;\n const worksheet = XLSX.utils.aoa_to_sheet([header], denseOptions);\n const chunkSize = EXPORT_CHUNK_SIZE;\n\n for (let start = 0; start < rows.length; start += chunkSize) {\n const chunk = rows\n .slice(start, start + chunkSize)\n .map((row, rowIndex) =>\n columns.map((column) =>\n normalizeXlsxCell(column.value(row, start + rowIndex)),\n ),\n );\n\n XLSX.utils.sheet_add_aoa(worksheet, chunk, appendOptions);\n\n await yieldToMainThread();\n }\n\n return worksheet;\n}\n\nasync function buildJsonContentAsync(params: { data: unknown; space: number }) {\n const { data, space } = params;\n if (!Array.isArray(data)) {\n return JSON.stringify(data, null, space) ?? \"\";\n }\n\n if (data.length === 0) {\n return \"[]\";\n }\n\n const lineBreak = space > 0 ? \"\\n\" : \"\";\n const indent = space > 0 ? \" \".repeat(space) : \"\";\n const parts = [\"[\", lineBreak];\n\n for (let start = 0; start < data.length; start += EXPORT_CHUNK_SIZE) {\n const chunk = data.slice(start, start + EXPORT_CHUNK_SIZE);\n for (let index = 0; index < chunk.length; index += 1) {\n const itemIndex = start + index;\n const prefix = itemIndex === 0 ? \"\" : `,${lineBreak}`;\n const content = JSON.stringify(chunk[index], null, space) ?? \"null\";\n parts.push(prefix, indent, content);\n }\n\n await yieldToMainThread();\n }\n\n parts.push(lineBreak, \"]\");\n return parts.join(\"\");\n}\n\nasync function buildCsvContentAsync<Row>(params: {\n rows: Row[];\n columns: ExportTableColumn<Row>[];\n}) {\n const { rows, columns } = params;\n const header = columns.map((column) => escapeCsvCell(column.title)).join(\",\");\n const parts = [header];\n\n for (let start = 0; start < rows.length; start += EXPORT_CHUNK_SIZE) {\n const chunk = rows.slice(start, start + EXPORT_CHUNK_SIZE);\n for (let rowIndex = 0; rowIndex < chunk.length; rowIndex += 1) {\n const row = chunk[rowIndex];\n const line = columns\n .map((column) => escapeCsvCell(column.value(row, start + rowIndex)))\n .join(\",\");\n parts.push(\"\\n\", line);\n }\n\n await yieldToMainThread();\n }\n\n return parts.join(\"\");\n}\n\nasync function buildTxtContentAsync<Row>(params: {\n rows: Row[];\n columns: ExportTableColumn<Row>[];\n}) {\n const { rows, columns } = params;\n const header = columns\n .map((column) => normalizeTextCell(column.title))\n .join(\"\\t\");\n const parts = [header];\n\n for (let start = 0; start < rows.length; start += EXPORT_CHUNK_SIZE) {\n const chunk = rows.slice(start, start + EXPORT_CHUNK_SIZE);\n for (let rowIndex = 0; rowIndex < chunk.length; rowIndex += 1) {\n const row = chunk[rowIndex];\n const line = columns\n .map((column) => normalizeTextCell(column.value(row, start + rowIndex)))\n .join(\"\\t\");\n parts.push(\"\\n\", line);\n }\n\n await yieldToMainThread();\n }\n\n return parts.join(\"\");\n}\n\nfunction escapeCsvCell(value: unknown) {\n const normalized = value == null ? \"\" : String(value);\n if (\n normalized.includes(\",\") ||\n normalized.includes('\"') ||\n normalized.includes(\"\\n\")\n ) {\n return `\"${normalized.split('\"').join('\"\"')}\"`;\n }\n return normalized;\n}\n\nfunction normalizeTextCell(value: unknown) {\n return value == null ? \"\" : String(value);\n}\n\nfunction normalizeXlsxCell(value: unknown) {\n if (value == null) {\n return \"\";\n }\n\n if (\n typeof value === \"string\" ||\n typeof value === \"number\" ||\n typeof value === \"boolean\"\n ) {\n return value;\n }\n\n if (value instanceof Date) {\n return value;\n }\n\n return String(value);\n}\n\nfunction ensureExtension(fileName: string, extension: string) {\n return fileName.toLowerCase().endsWith(`.${extension}`)\n ? fileName\n : `${fileName}.${extension}`;\n}\n\nfunction yieldToMainThread() {\n return new Promise<void>((resolve) => {\n if (\n typeof window !== \"undefined\" &&\n typeof window.requestAnimationFrame === \"function\"\n ) {\n window.requestAnimationFrame(() => {\n resolve();\n });\n return;\n }\n\n setTimeout(resolve, 0);\n });\n}\n\nfunction downloadTextFile(params: {\n fileName: string;\n content: string;\n type: string;\n}) {\n const { fileName, content, type } = params;\n const blob = new Blob([content], { type });\n const url = URL.createObjectURL(blob);\n const anchor = document.createElement(\"a\");\n anchor.href = url;\n anchor.download = fileName;\n anchor.click();\n URL.revokeObjectURL(url);\n}\n","/**\n * 支持对象属性路径的数据索引。\n */\nexport type ValueDataIndex = string | number | Array<string | number>;\n\n/**\n * 将 dataIndex 转换为稳定字符串。\n */\nexport function stringifyDataIndex(dataIndex: ValueDataIndex) {\n return (Array.isArray(dataIndex) ? dataIndex : [dataIndex])\n .map((item) => String(item))\n .join(\".\");\n}\n\n/**\n * 判断两个 dataIndex 是否指向相同属性路径。\n */\nexport function isSameDataIndex(left: ValueDataIndex, right: ValueDataIndex) {\n const leftPath = Array.isArray(left) ? left : [left];\n const rightPath = Array.isArray(right) ? right : [right];\n return (\n leftPath.length === rightPath.length &&\n leftPath.every((key, index) => key === rightPath[index])\n );\n}\n\n/**\n * 通过 dataIndex 安全读取值。\n *\n * @param source 数据记录。\n * @param dataIndex 属性路径。\n * @returns 读取结果。\n */\nexport function getValueByDataIndex(\n source: unknown,\n dataIndex?: ValueDataIndex,\n) {\n if (dataIndex == null) {\n return undefined;\n }\n\n const path = Array.isArray(dataIndex) ? dataIndex : [dataIndex];\n let current: unknown = source;\n\n for (const key of path) {\n if (\n current == null ||\n (typeof current !== \"object\" && typeof current !== \"function\")\n ) {\n return undefined;\n }\n current = (current as Record<string | number, unknown>)[key];\n }\n\n return current;\n}\n","/** Day.js 风格日期时间格式中支持识别的 token。 */\nconst DATE_TIME_FORMAT_TOKEN =\n /Y{2,4}|M{1,4}|D{1,2}|d{1,4}|H{1,2}|h{1,2}|m{1,2}|s{1,2}|S{1,3}|A|a/;\n\nconst FORMAT_TOKEN =\n /\\[[^\\]]*\\]|YYYY|MMMM|MMM|dddd|ddd|SSS|YY|MM|DD|dd|HH|hh|mm|ss|SS|M|D|d|H|h|m|s|S|A|a/g;\n\nconst ZH_WEEKDAYS = [\n \"星期日\",\n \"星期一\",\n \"星期二\",\n \"星期三\",\n \"星期四\",\n \"星期五\",\n \"星期六\",\n];\nconst ZH_WEEKDAYS_SHORT = [\n \"周日\",\n \"周一\",\n \"周二\",\n \"周三\",\n \"周四\",\n \"周五\",\n \"周六\",\n];\nconst EN_WEEKDAYS = [\n \"Sunday\",\n \"Monday\",\n \"Tuesday\",\n \"Wednesday\",\n \"Thursday\",\n \"Friday\",\n \"Saturday\",\n];\nconst EN_MONTHS = [\n \"January\",\n \"February\",\n \"March\",\n \"April\",\n \"May\",\n \"June\",\n \"July\",\n \"August\",\n \"September\",\n \"October\",\n \"November\",\n \"December\",\n];\n\n/** 将未知值解析为有效日期。 */\nexport function resolveDateValue(value: unknown): Date | null {\n if (value instanceof Date) {\n return Number.isNaN(value.getTime()) ? null : value;\n }\n if (typeof value !== \"string\" && typeof value !== \"number\") {\n return null;\n }\n if (typeof value === \"string\") {\n const localDate = resolveLocalDateString(value);\n if (localDate) {\n return localDate;\n }\n }\n const resolved = new Date(value);\n return Number.isNaN(resolved.getTime()) ? null : resolved;\n}\n\n/** 判断字符串中是否包含 Day.js 风格的日期时间格式 token。 */\nexport function isDateTimeFormatPattern(pattern: string) {\n return DATE_TIME_FORMAT_TOKEN.test(pattern.replace(/\\[[^\\]]*\\]/g, \"\"));\n}\n\n/**\n * 使用 Day.js 风格的常用 token 格式化日期时间,不依赖 Day.js 运行时。\n *\n * 支持年、月、日、星期、24/12 小时、分、秒、毫秒和上下午标记;\n * 默认使用中文区域设置,值或 pattern 无效时返回 `null`。\n */\nexport function formatDateTimeValue(\n value: unknown,\n pattern: string,\n locale = \"zh-cn\",\n): string | null {\n const date = resolveDateValue(value);\n const normalizedPattern = pattern.trim();\n if (!date || !normalizedPattern) {\n return null;\n }\n const year = date.getFullYear();\n const monthIndex = date.getMonth();\n const month = monthIndex + 1;\n const day = date.getDate();\n const weekdayIndex = date.getDay();\n const hour = date.getHours();\n const hour12 = hour % 12 || 12;\n const minute = date.getMinutes();\n const second = date.getSeconds();\n const millisecond = date.getMilliseconds();\n const chinese = locale.toLowerCase().startsWith(\"zh\");\n const marker =\n hour >= 12 ? (chinese ? \"下午\" : \"PM\") : chinese ? \"上午\" : \"AM\";\n const weekday = chinese\n ? (ZH_WEEKDAYS[weekdayIndex] ?? \"\")\n : (EN_WEEKDAYS[weekdayIndex] ?? \"\");\n const weekdayShort = chinese\n ? (ZH_WEEKDAYS_SHORT[weekdayIndex] ?? \"\")\n : weekday.slice(0, 3);\n const monthName = chinese ? `${month}月` : (EN_MONTHS[monthIndex] ?? \"\");\n const values: Record<string, string> = {\n YYYY: String(year).padStart(4, \"0\"),\n YY: String(year).slice(-2),\n M: String(month),\n MM: padNumber(month),\n MMM: chinese ? monthName : monthName.slice(0, 3),\n MMMM: monthName,\n D: String(day),\n DD: padNumber(day),\n d: String(weekdayIndex),\n dd: chinese ? weekdayShort.slice(-1) : weekday.slice(0, 2),\n ddd: weekdayShort,\n dddd: weekday,\n H: String(hour),\n HH: padNumber(hour),\n h: String(hour12),\n hh: padNumber(hour12),\n m: String(minute),\n mm: padNumber(minute),\n s: String(second),\n ss: padNumber(second),\n S: String(Math.floor(millisecond / 100)),\n SS: String(Math.floor(millisecond / 10)).padStart(2, \"0\"),\n SSS: String(millisecond).padStart(3, \"0\"),\n A: marker,\n a: marker.toLowerCase(),\n };\n\n return normalizedPattern.replace(FORMAT_TOKEN, (token) =>\n token.startsWith(\"[\") && token.endsWith(\"]\")\n ? token.slice(1, -1)\n : (values[token] ?? token),\n );\n}\n\nfunction padNumber(value: number) {\n return String(value).padStart(2, \"0\");\n}\n\nfunction resolveLocalDateString(value: string) {\n const match = value\n .trim()\n .match(\n /^(\\d{4})[-/](\\d{1,2})[-/](\\d{1,2})(?:[ T](\\d{1,2}):?(\\d{2})?(?::?(\\d{2}))?(?:\\.(\\d{1,3}))?)?$/,\n );\n if (!match) {\n return null;\n }\n const [\n ,\n yearText,\n monthText,\n dayText,\n hourText,\n minuteText,\n secondText,\n millisecondText,\n ] = match;\n const year = Number(yearText);\n const monthIndex = Number(monthText) - 1;\n const day = Number(dayText);\n const hour = Number(hourText ?? 0);\n const minute = Number(minuteText ?? 0);\n const second = Number(secondText ?? 0);\n const millisecond = Number((millisecondText ?? \"0\").padEnd(3, \"0\"));\n const resolved = new Date(\n year,\n monthIndex,\n day,\n hour,\n minute,\n second,\n millisecond,\n );\n return resolved.getFullYear() === year &&\n resolved.getMonth() === monthIndex &&\n resolved.getDate() === day &&\n resolved.getHours() === hour &&\n resolved.getMinutes() === minute &&\n resolved.getSeconds() === second\n ? resolved\n : null;\n}\n","/**\n * 将数值限制在指定闭区间内。\n */\nexport function clamp(value: number, minimum: number, maximum: number) {\n return Math.min(Math.max(value, minimum), maximum);\n}\n\n/**\n * 判断坐标是否位于矩形范围内,矩形边界视为命中。\n */\nexport function isPointInRect(\n x: number,\n y: number,\n rect: { x: number; y: number; width: number; height: number },\n) {\n return (\n x >= rect.x &&\n x <= rect.x + rect.width &&\n y >= rect.y &&\n y <= rect.y + rect.height\n );\n}\n","/** 可参与精确十进制计算的值。字符串可保留超出 Number 安全范围的整数精度。 */\r\nexport type PreciseNumberInput = string | number | bigint;\r\nexport type PreciseRoundingMode = \"round\" | \"floor\" | \"ceil\" | \"truncate\";\r\n\r\ninterface DecimalParts {\r\n coefficient: bigint;\r\n scale: number;\r\n}\r\n\r\n/** 精确相加两个十进制数,非法或非有限输入返回 null。 */\r\nexport function addPreciseNumbers(\r\n left: PreciseNumberInput,\r\n right: PreciseNumberInput,\r\n): string | null {\r\n const leftParts = parseDecimal(left);\r\n const rightParts = parseDecimal(right);\r\n if (!leftParts || !rightParts) return null;\r\n return formatDecimal(addParts(leftParts, rightParts));\r\n}\r\n\r\n/** 精确累加一组十进制数,非法值跳过且没有有效值时返回 null。 */\r\nexport function sumPreciseNumbers(\r\n values: Iterable<PreciseNumberInput>,\r\n): string | null {\r\n let result: DecimalParts = { coefficient: 0n, scale: 0 };\r\n let count = 0;\r\n for (const value of values) {\r\n const parts = parseDecimal(value);\r\n if (!parts) continue;\r\n result = addParts(result, parts);\r\n count += 1;\r\n }\r\n return count === 0 ? null : formatDecimal(result);\r\n}\r\n\r\n/** 比较两个十进制数,返回 -1、0、1;非法输入返回 null。 */\r\nexport function comparePreciseNumbers(\r\n left: PreciseNumberInput,\r\n right: PreciseNumberInput,\r\n): -1 | 0 | 1 | null {\r\n const leftParts = parseDecimal(left);\r\n const rightParts = parseDecimal(right);\r\n if (!leftParts || !rightParts) return null;\r\n const scale = Math.max(leftParts.scale, rightParts.scale);\r\n const leftValue =\r\n leftParts.coefficient * 10n ** BigInt(scale - leftParts.scale);\r\n const rightValue =\r\n rightParts.coefficient * 10n ** BigInt(scale - rightParts.scale);\r\n return leftValue < rightValue ? -1 : leftValue > rightValue ? 1 : 0;\r\n}\r\n\r\n/** 精确除法并按指定小数位四舍五入。 */\r\nexport function dividePreciseNumber(\r\n value: PreciseNumberInput,\r\n divisor: PreciseNumberInput,\r\n precision = 20,\r\n): string | null {\r\n const valueParts = parseDecimal(value);\r\n const divisorParts = parseDecimal(divisor);\r\n if (!valueParts || !divisorParts || divisorParts.coefficient === 0n)\r\n return null;\r\n const places = normalizePrecision(precision);\r\n const scale = places + divisorParts.scale - valueParts.scale;\r\n const factor = 10n ** BigInt(Math.max(scale, 0));\r\n const numerator = valueParts.coefficient * factor;\r\n const denominator = divisorParts.coefficient;\r\n const quotient = numerator / denominator;\r\n const remainder = numerator % denominator;\r\n const rounded =\r\n remainder === 0n\r\n ? quotient\r\n : quotient +\r\n (numerator < 0n === denominator < 0n ? 1n : -1n) *\r\n (abs(remainder) * 2n >= abs(denominator) ? 1n : 0n);\r\n return formatDecimal({ coefficient: rounded, scale: Math.max(places, 0) });\r\n}\r\n\r\n/** 对十进制数进行四舍五入并保留指定小数位。 */\r\nexport function roundPreciseNumber(\r\n value: PreciseNumberInput,\r\n precision: number,\r\n mode: PreciseRoundingMode = \"round\",\r\n): string | null {\r\n const parts = parseDecimal(value);\r\n if (!parts) return null;\r\n const places = normalizePrecision(precision);\r\n if (parts.scale <= places)\r\n return formatDecimal(\r\n {\r\n ...parts,\r\n coefficient: parts.coefficient * 10n ** BigInt(places - parts.scale),\r\n },\r\n places,\r\n );\r\n const factor = 10n ** BigInt(parts.scale - places);\r\n let quotient = parts.coefficient / factor;\r\n const remainder = parts.coefficient % factor;\r\n if (remainder !== 0n) {\r\n const isNegative = parts.coefficient < 0n;\r\n const direction = isNegative ? -1n : 1n;\r\n if (\r\n (mode === \"ceil\" && !isNegative) ||\r\n (mode === \"floor\" && isNegative) ||\r\n (mode === \"round\" && abs(remainder) * 2n >= factor)\r\n ) {\r\n quotient += direction;\r\n }\r\n }\r\n return formatDecimal({ coefficient: quotient, scale: places }, places);\r\n}\r\n\r\n/** 格式化十进制数,可选择保留输入值的尾随零。 */\r\nexport function formatPreciseNumber(\r\n value: PreciseNumberInput,\r\n precision?: number,\r\n preserveTrailingZeros = false,\r\n): string | null {\r\n const parts = parseDecimal(value);\r\n if (!parts) return null;\r\n return precision == null\r\n ? formatDecimal(parts, preserveTrailingZeros ? parts.scale : 0)\r\n : roundPreciseNumber(value, precision);\r\n}\r\n\r\nfunction parseDecimal(value: PreciseNumberInput): DecimalParts | null {\r\n if (typeof value === \"number\") {\r\n if (!Number.isFinite(value)) return null;\r\n value = String(value);\r\n } else if (typeof value === \"bigint\") {\r\n return { coefficient: value, scale: 0 };\r\n }\r\n const match = value\r\n .trim()\r\n .match(/^([+-]?)(\\d+)(?:\\.(\\d*))?(?:e([+-]?\\d+))?$/i);\r\n if (!match) return null;\r\n const fraction = match[3] ?? \"\";\r\n const exponent = Number(match[4] ?? 0);\r\n if (!Number.isSafeInteger(exponent)) return null;\r\n const scale = fraction.length - exponent;\r\n const coefficient = BigInt(\r\n `${match[1] === \"-\" ? \"-\" : \"\"}${match[2]}${fraction}`,\r\n );\r\n return scale >= 0\r\n ? { coefficient, scale }\r\n : { coefficient: coefficient * 10n ** BigInt(-scale), scale: 0 };\r\n}\r\n\r\nfunction addParts(left: DecimalParts, right: DecimalParts): DecimalParts {\r\n const scale = Math.max(left.scale, right.scale);\r\n return {\r\n coefficient:\r\n left.coefficient * 10n ** BigInt(scale - left.scale) +\r\n right.coefficient * 10n ** BigInt(scale - right.scale),\r\n scale,\r\n };\r\n}\r\n\r\nfunction formatDecimal(parts: DecimalParts, minimumScale = 0): string {\r\n const negative = parts.coefficient < 0n;\r\n const digits = abs(parts.coefficient)\r\n .toString()\r\n .padStart(parts.scale + 1, \"0\");\r\n const scale = Math.max(parts.scale, minimumScale);\r\n const padded = digits.padStart(scale + 1, \"0\");\r\n const integer = padded.slice(0, -scale || undefined) || \"0\";\r\n const fraction = scale > 0 ? padded.slice(-scale).padEnd(scale, \"0\") : \"\";\r\n const displayFraction =\r\n minimumScale > 0 ? fraction : fraction.replace(/0+$/, \"\");\r\n return `${negative ? \"-\" : \"\"}${integer}${displayFraction ? `.${displayFraction}` : \"\"}`;\r\n}\r\n\r\nfunction normalizePrecision(value: number) {\r\n return Math.min(\r\n 100,\r\n Math.max(0, Math.trunc(Number.isFinite(value) ? value : 20)),\r\n );\r\n}\r\n\r\nfunction abs(value: bigint) {\r\n return value < 0n ? -value : value;\r\n}\r\n","/** 通用数字格式化选项。 */\r\nexport interface NumberFormatOptions {\r\n /** 小数位数;`\"auto\"` 表示保留原始小数位。 */\r\n decimalPlaces?: number | \"auto\";\r\n /** 是否使用千分位分隔符,传入字符串时作为分隔符。 */\r\n thousandsSeparator?: boolean | string;\r\n /** 前置符号,例如 `¥` 或 `$`。 */\r\n symbol?: string;\r\n}\r\n\r\nexport type ChineseNumberStyle = \"common\" | \"financial\";\r\n\r\nconst COMMON_CHINESE_DIGITS = [\r\n \"零\",\r\n \"一\",\r\n \"二\",\r\n \"三\",\r\n \"四\",\r\n \"五\",\r\n \"六\",\r\n \"七\",\r\n \"八\",\r\n \"九\",\r\n];\r\nconst FINANCIAL_CHINESE_DIGITS = [\r\n \"零\",\r\n \"壹\",\r\n \"贰\",\r\n \"叁\",\r\n \"肆\",\r\n \"伍\",\r\n \"陆\",\r\n \"柒\",\r\n \"捌\",\r\n \"玖\",\r\n];\r\nconst COMMON_SECTION_UNITS = [\"\", \"十\", \"百\", \"千\"];\r\nconst FINANCIAL_SECTION_UNITS = [\"\", \"拾\", \"佰\", \"仟\"];\r\nconst LARGE_CHINESE_UNITS = [\"\", \"万\", \"亿\", \"兆\", \"京\"];\r\n\r\nconst CHINESE_DIGIT_VALUES: Record<string, number> = {\r\n 零: 0,\r\n 〇: 0,\r\n 一: 1,\r\n 壹: 1,\r\n 二: 2,\r\n 贰: 2,\r\n 貳: 2,\r\n 两: 2,\r\n 兩: 2,\r\n 三: 3,\r\n 叁: 3,\r\n 參: 3,\r\n 四: 4,\r\n 肆: 4,\r\n 五: 5,\r\n 伍: 5,\r\n 六: 6,\r\n 陆: 6,\r\n 陸: 6,\r\n 七: 7,\r\n 柒: 7,\r\n 八: 8,\r\n 捌: 8,\r\n 九: 9,\r\n 玖: 9,\r\n};\r\n\r\nconst CHINESE_SMALL_UNIT_VALUES: Record<string, number> = {\r\n 十: 10,\r\n 拾: 10,\r\n 百: 100,\r\n 佰: 100,\r\n 千: 1000,\r\n 仟: 1000,\r\n};\r\n\r\nconst CHINESE_LARGE_UNIT_VALUES: Record<string, number> = {\r\n 万: 10_000,\r\n 萬: 10_000,\r\n 亿: 100_000_000,\r\n 億: 100_000_000,\r\n 兆: 1_000_000_000_000,\r\n};\r\n\r\n/** 将数字、带千分位数字字符串解析为有限数字。 */\r\nexport function parseNumberValue(value: unknown): number | null {\r\n if (typeof value === \"number\") return Number.isFinite(value) ? value : null;\r\n if (typeof value !== \"string\") return null;\r\n const normalized = value.trim().replace(/,/g, \"\");\r\n if (!normalized) return null;\r\n const numericValue = Number(normalized);\r\n return Number.isFinite(numericValue) ? numericValue : null;\r\n}\r\n\r\n/** 限制小数位数到 0 到 20。 */\r\nexport function normalizeDecimalPlaces(\r\n decimalPlaces: number | undefined,\r\n fallback = 2,\r\n) {\r\n if (typeof decimalPlaces !== \"number\" || !Number.isFinite(decimalPlaces)) {\r\n return fallback;\r\n }\r\n return Math.min(20, Math.max(Math.trunc(decimalPlaces), 0));\r\n}\r\n\r\n/** 格式化数字、金额和千分位数字。 */\r\nexport function formatNumberValue(\r\n value: unknown,\r\n options: NumberFormatOptions = {},\r\n) {\r\n if (value == null || value === \"\") return \"\";\r\n const numericValue = parseNumberValue(value);\r\n if (numericValue == null) return String(value);\r\n const separator = resolveThousandsSeparator(options.thousandsSeparator);\r\n const decimalPlaces =\r\n options.decimalPlaces === \"auto\"\r\n ? undefined\r\n : normalizeDecimalPlaces(options.decimalPlaces);\r\n const absoluteText =\r\n decimalPlaces == null\r\n ? String(Math.abs(numericValue))\r\n : Math.abs(numericValue).toFixed(decimalPlaces);\r\n const [integerText = \"0\", decimalText] = absoluteText.split(\".\");\r\n const formattedInteger = separator\r\n ? integerText.replace(/\\B(?=(\\d{3})+(?!\\d))/g, separator)\r\n : integerText;\r\n const sign = numericValue < 0 ? \"-\" : \"\";\r\n return `${sign}${options.symbol ?? \"\"}${formattedInteger}${decimalText ? `.${decimalText}` : \"\"}`;\r\n}\r\n\r\n/** 格式化百分比数值,输入 `0.125` 输出 `12.5%`。 */\r\nexport function formatPercentValue(value: unknown, decimalPlaces = 2) {\r\n const numericValue = parseNumberValue(value);\r\n if (numericValue == null) return String(value ?? \"\");\r\n return `${(numericValue * 100).toFixed(normalizeDecimalPlaces(decimalPlaces))}%`;\r\n}\r\n\r\n/** 格式化科学计数法,指数固定补足三位。 */\r\nexport function formatScientificValue(value: unknown, decimalPlaces = 2) {\r\n const numericValue = parseNumberValue(value);\r\n if (numericValue == null) return String(value ?? \"\");\r\n const [mantissa, exponentText] = numericValue\r\n .toExponential(normalizeDecimalPlaces(decimalPlaces))\r\n .split(\"e\");\r\n const exponent = Number(exponentText ?? 0);\r\n return `${mantissa}E${exponent >= 0 ? \"+\" : \"-\"}${String(Math.abs(exponent)).padStart(3, \"0\")}`;\r\n}\r\n\r\n/** 按常见表格数字 pattern 格式化自定义数字。 */\r\nexport function formatCustomNumberPattern(value: unknown, pattern: string) {\r\n if (pattern.includes(\"@\") || pattern.includes(\"通用格式\")) {\r\n return String(value ?? \"\");\r\n }\r\n const literalOnly = pattern.match(/^\"([^\"]*)\"$/);\r\n if (literalOnly) return literalOnly[1] ?? \"\";\r\n const numericValue = parseNumberValue(value);\r\n if (numericValue == null) return String(value ?? \"\");\r\n const percent = pattern.includes(\"%\");\r\n const tenThousands = pattern.includes(\"万\");\r\n const decimalPlaces = pattern.match(/\\.(0+)/)?.[1]?.length ?? 0;\r\n const scaled =\r\n (numericValue * (percent ? 100 : 1)) / (tenThousands ? 10_000 : 1);\r\n const symbol = pattern.includes(\"¥\") ? \"¥\" : pattern.includes(\"$\") ? \"$\" : \"\";\r\n if (/e\\+/i.test(pattern)) return formatScientificValue(scaled, decimalPlaces);\r\n const text = formatNumberValue(scaled, {\r\n decimalPlaces,\r\n thousandsSeparator: pattern.includes(\",\") && !tenThousands,\r\n symbol,\r\n });\r\n return `${text}${tenThousands ? \"万\" : \"\"}${percent ? \"%\" : \"\"}`;\r\n}\r\n\r\n/** 将阿拉伯数字或中文数字转换为中文数字。 */\r\nexport function formatChineseNumber(\r\n value: unknown,\r\n style: ChineseNumberStyle = \"financial\",\r\n): string | null {\r\n const numericValue =\r\n parseNumberValue(value) ??\r\n (typeof value === \"string\" ? parseChineseNumber(value) : null);\r\n if (numericValue == null || !Number.isFinite(numericValue)) return null;\r\n const negative = numericValue < 0;\r\n const absoluteValue = Math.abs(numericValue);\r\n const [integerText, decimalText = \"\"] =\r\n toPlainNumberText(absoluteValue).split(\".\");\r\n const digits =\r\n style === \"financial\" ? FINANCIAL_CHINESE_DIGITS : COMMON_CHINESE_DIGITS;\r\n const sectionUnits =\r\n style === \"financial\" ? FINANCIAL_SECTION_UNITS : COMMON_SECTION_UNITS;\r\n const integerResult = formatChineseInteger(\r\n integerText ?? \"0\",\r\n digits,\r\n sectionUnits,\r\n );\r\n const decimalResult = decimalText\r\n ? `点${Array.from(decimalText, (digit) => digits[Number(digit)] ?? \"\").join(\"\")}`\r\n : \"\";\r\n return `${negative ? \"负\" : \"\"}${integerResult}${decimalResult}`;\r\n}\r\n\r\n/** 将普通中文数字或金融大写数字解析为阿拉伯数字。 */\r\nexport function parseChineseNumber(value: unknown): number | null {\r\n if (typeof value === \"number\") return Number.isFinite(value) ? value : null;\r\n if (typeof value !== \"string\") return null;\r\n let source = value.trim().replace(/[\\s,,]/g, \"\");\r\n if (!source) return null;\r\n const negative = source.startsWith(\"负\") || source.startsWith(\"-\");\r\n if (negative) source = source.slice(1);\r\n const [integerSource = \"\", decimalSource] = source.split(/[点\\.]/, 2);\r\n if (!integerSource) return null;\r\n const integerValue = parseChineseInteger(integerSource);\r\n if (integerValue == null) return null;\r\n let decimalValue = 0;\r\n if (decimalSource) {\r\n let scale = 0.1;\r\n for (const character of decimalSource) {\r\n const digit = resolveChineseDigit(character);\r\n if (digit == null) return null;\r\n decimalValue += digit * scale;\r\n scale /= 10;\r\n }\r\n }\r\n const result = integerValue + decimalValue;\r\n return negative ? -result : result;\r\n}\r\n\r\nfunction formatChineseInteger(\r\n integerText: string,\r\n digits: string[],\r\n sectionUnits: string[],\r\n) {\r\n const normalized = integerText.replace(/^0+(?=\\d)/, \"\");\r\n if (normalized === \"0\") return digits[0] ?? \"零\";\r\n const sections: number[] = [];\r\n for (let end = normalized.length; end > 0; end -= 4) {\r\n sections.push(Number(normalized.slice(Math.max(0, end - 4), end)));\r\n }\r\n let result = \"\";\r\n let pendingZero = false;\r\n for (let index = sections.length - 1; index >= 0; index -= 1) {\r\n const section = sections[index] ?? 0;\r\n if (section === 0) {\r\n if (result) pendingZero = true;\r\n continue;\r\n }\r\n if (result && (pendingZero || section < 1000)) result += digits[0] ?? \"零\";\r\n result += formatChineseSection(section, digits, sectionUnits);\r\n result += LARGE_CHINESE_UNITS[index] ?? \"\";\r\n pendingZero = false;\r\n }\r\n return digits === COMMON_CHINESE_DIGITS && result.startsWith(\"一十\")\r\n ? result.slice(1)\r\n : result;\r\n}\r\n\r\nfunction formatChineseSection(\r\n section: number,\r\n digits: string[],\r\n sectionUnits: string[],\r\n) {\r\n let result = \"\";\r\n let pendingZero = false;\r\n for (let position = 3; position >= 0; position -= 1) {\r\n const unitValue = 10 ** position;\r\n const digit = Math.floor(section / unitValue) % 10;\r\n if (digit === 0) {\r\n if (result && section % unitValue !== 0) pendingZero = true;\r\n continue;\r\n }\r\n if (pendingZero) result += digits[0] ?? \"零\";\r\n result += `${digits[digit] ?? \"\"}${sectionUnits[position] ?? \"\"}`;\r\n pendingZero = false;\r\n }\r\n return result;\r\n}\r\n\r\nfunction parseChineseInteger(source: string) {\r\n const hasUnit = Array.from(source).some(\r\n (character) =>\r\n character in CHINESE_SMALL_UNIT_VALUES ||\r\n character in CHINESE_LARGE_UNIT_VALUES,\r\n );\r\n if (!hasUnit) {\r\n let text = \"\";\r\n for (const character of source) {\r\n const digit = resolveChineseDigit(character);\r\n if (digit == null) return null;\r\n text += String(digit);\r\n }\r\n return text ? Number(text) : null;\r\n }\r\n let total = 0;\r\n let section = 0;\r\n let digit: number | null = null;\r\n for (const character of source) {\r\n const digitValue = resolveChineseDigit(character);\r\n if (digitValue != null) {\r\n digit = digitValue;\r\n continue;\r\n }\r\n const smallUnit = CHINESE_SMALL_UNIT_VALUES[character];\r\n if (smallUnit) {\r\n section += (digit ?? 1) * smallUnit;\r\n digit = null;\r\n continue;\r\n }\r\n const largeUnit = CHINESE_LARGE_UNIT_VALUES[character];\r\n if (largeUnit) {\r\n section += digit ?? 0;\r\n total += section * largeUnit;\r\n section = 0;\r\n digit = null;\r\n continue;\r\n }\r\n return null;\r\n }\r\n return total + section + (digit ?? 0);\r\n}\r\n\r\nfunction resolveChineseDigit(character: string) {\r\n if (/\\d/.test(character)) return Number(character);\r\n return CHINESE_DIGIT_VALUES[character] ?? null;\r\n}\r\n\r\nfunction toPlainNumberText(value: number) {\r\n const source = String(value);\r\n if (!/[eE]/.test(source)) return source;\r\n return value.toLocaleString(\"en-US\", {\r\n useGrouping: false,\r\n maximumFractionDigits: 20,\r\n });\r\n}\r\n\r\nfunction resolveThousandsSeparator(separator: boolean | string | undefined) {\r\n if (separator == null || separator === false) return \"\";\r\n if (typeof separator === \"string\") return separator;\r\n return \",\";\r\n}\r\nexport {\r\n addPreciseNumbers,\r\n comparePreciseNumbers,\r\n dividePreciseNumber,\r\n formatPreciseNumber,\r\n roundPreciseNumber,\r\n sumPreciseNumbers,\r\n} from \"./precise\";\r\nexport type { PreciseNumberInput } from \"./precise\";\r\nexport type { PreciseRoundingMode } from \"./precise\";\r\n"]}
|
package/dist/index.d.cts
CHANGED
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
export { ClipboardCellValue, copyJson, copyRows, copyText, copyTextSync, formatRowsForClipboard } from './clipboard/index.cjs';
|
|
2
2
|
export { ExportTableColumn, buildCsvContent, buildTxtContent, downloadJsonFile, exportTableToCsv, exportTableToTxt, exportTableToXlsx, mapRowsToExportRecords, serializeCsvRows } from './export/index.cjs';
|
|
3
3
|
export { ValueDataIndex, getValueByDataIndex, isSameDataIndex, stringifyDataIndex } from './data/index.cjs';
|
|
4
|
+
export { formatDateTimeValue, isDateTimeFormatPattern, resolveDateValue } from './date/index.cjs';
|
|
4
5
|
export { clamp, isPointInRect } from './geometry/index.cjs';
|
|
6
|
+
export { ChineseNumberStyle, NumberFormatOptions, PreciseNumberInput, PreciseRoundingMode, addPreciseNumbers, comparePreciseNumbers, dividePreciseNumber, formatChineseNumber, formatCustomNumberPattern, formatNumberValue, formatPercentValue, formatPreciseNumber, formatScientificValue, normalizeDecimalPlaces, parseChineseNumber, parseNumberValue, roundPreciseNumber, sumPreciseNumbers } from './number/index.cjs';
|
package/dist/index.d.ts
CHANGED
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
export { ClipboardCellValue, copyJson, copyRows, copyText, copyTextSync, formatRowsForClipboard } from './clipboard/index.js';
|
|
2
2
|
export { ExportTableColumn, buildCsvContent, buildTxtContent, downloadJsonFile, exportTableToCsv, exportTableToTxt, exportTableToXlsx, mapRowsToExportRecords, serializeCsvRows } from './export/index.js';
|
|
3
3
|
export { ValueDataIndex, getValueByDataIndex, isSameDataIndex, stringifyDataIndex } from './data/index.js';
|
|
4
|
+
export { formatDateTimeValue, isDateTimeFormatPattern, resolveDateValue } from './date/index.js';
|
|
4
5
|
export { clamp, isPointInRect } from './geometry/index.js';
|
|
6
|
+
export { ChineseNumberStyle, NumberFormatOptions, PreciseNumberInput, PreciseRoundingMode, addPreciseNumbers, comparePreciseNumbers, dividePreciseNumber, formatChineseNumber, formatCustomNumberPattern, formatNumberValue, formatPercentValue, formatPreciseNumber, formatScientificValue, normalizeDecimalPlaces, parseChineseNumber, parseNumberValue, roundPreciseNumber, sumPreciseNumbers } from './number/index.js';
|