lyb-js 1.0.3 → 1.0.4

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.
Files changed (90) hide show
  1. package/README.md +102 -1
  2. package/package.json +1 -1
  3. package/dist/Base/LibGetDataType/index.d.ts +0 -10
  4. package/dist/Base/LibGetDataType/index.js +0 -15
  5. package/dist/Base/LibJsGetDataType/index.d.ts +0 -7
  6. package/dist/Base/LibJsGetDataType/index.js +0 -11
  7. package/dist/Base/LibPromiseTimeout/index.d.ts +0 -10
  8. package/dist/Base/LibPromiseTimeout/index.js +0 -40
  9. package/dist/Browser/LibColorConsole/index.d.ts +0 -15
  10. package/dist/Browser/LibColorConsole/index.js +0 -38
  11. package/dist/Browser/LibIsMobile/index.d.ts +0 -6
  12. package/dist/Browser/LibIsMobile/index.js +0 -9
  13. package/dist/Browser/LibIsPad/index.d.ts +0 -6
  14. package/dist/Browser/LibIsPad/index.js +0 -15
  15. package/dist/Browser/LibPathParams/index.d.ts +0 -6
  16. package/dist/Browser/LibPathParams/index.js +0 -16
  17. package/dist/Browser/LibSetTitleIcon/index.d.ts +0 -7
  18. package/dist/Browser/LibSetTitleIcon/index.js +0 -14
  19. package/dist/Browser/LibTagTitleTip/index.d.ts +0 -7
  20. package/dist/Browser/LibTagTitleTip/index.js +0 -24
  21. package/dist/Data/LibChunkArray/index.d.ts +0 -9
  22. package/dist/Data/LibChunkArray/index.js +0 -15
  23. package/dist/Data/LibDeepJSONParse/index.d.ts +0 -6
  24. package/dist/Data/LibDeepJSONParse/index.js +0 -32
  25. package/dist/Data/LibGroupArrayByKey/index.d.ts +0 -10
  26. package/dist/Data/LibGroupArrayByKey/index.js +0 -20
  27. package/dist/Data/LibMatchEmail/index.d.ts +0 -10
  28. package/dist/Data/LibMatchEmail/index.js +0 -16
  29. package/dist/Data/LibSearch/index.d.ts +0 -8
  30. package/dist/Data/LibSearch/index.js +0 -45
  31. package/dist/Data/LibShuffleArray/index.d.ts +0 -7
  32. package/dist/Data/LibShuffleArray/index.js +0 -14
  33. package/dist/Data/LibStepArray/index.d.ts +0 -8
  34. package/dist/Data/LibStepArray/index.js +0 -14
  35. package/dist/File/LibDownloadImageLink/index.d.ts +0 -7
  36. package/dist/File/LibDownloadImageLink/index.js +0 -17
  37. package/dist/File/LibFileSize/index.d.ts +0 -5
  38. package/dist/File/LibFileSize/index.js +0 -11
  39. package/dist/File/LibImageOptimizer/index.d.ts +0 -32
  40. package/dist/File/LibImageOptimizer/index.js +0 -83
  41. package/dist/File/LibImageOptimizerOptions/index.d.ts +0 -18
  42. package/dist/File/LibImageOptimizerOptions/index.js +0 -69
  43. package/dist/File/LibSaveExcel/index.d.ts +0 -11
  44. package/dist/File/LibSaveExcel/index.js +0 -17
  45. package/dist/File/LibSaveJson/index.d.ts +0 -9
  46. package/dist/File/LibSaveJson/index.js +0 -17
  47. package/dist/Formatter/LibFormatterByte/index.d.ts +0 -9
  48. package/dist/Formatter/LibFormatterByte/index.js +0 -17
  49. package/dist/Formatter/LibMaskPhoneNumber/index.d.ts +0 -8
  50. package/dist/Formatter/LibMaskPhoneNumber/index.js +0 -11
  51. package/dist/Formatter/LibNumComma/index.d.ts +0 -9
  52. package/dist/Formatter/LibNumComma/index.js +0 -13
  53. package/dist/Formatter/LibNumberUnit/index.d.ts +0 -12
  54. package/dist/Formatter/LibNumberUnit/index.js +0 -23
  55. package/dist/Formatter/LibSecondsFormatterChinese/index.d.ts +0 -11
  56. package/dist/Formatter/LibSecondsFormatterChinese/index.js +0 -42
  57. package/dist/Math/LibCalculateExpression/index.d.ts +0 -9
  58. package/dist/Math/LibCalculateExpression/index.js +0 -107
  59. package/dist/Math/LibConvertAngle/index.d.ts +0 -12
  60. package/dist/Math/LibConvertAngle/index.js +0 -22
  61. package/dist/Math/LibCoordsAngle/index.d.ts +0 -15
  62. package/dist/Math/LibCoordsAngle/index.js +0 -24
  63. package/dist/Math/LibCoordsDistance/index.d.ts +0 -15
  64. package/dist/Math/LibCoordsDistance/index.js +0 -16
  65. package/dist/Math/LibDecimal/index.d.ts +0 -10
  66. package/dist/Math/LibDecimal/index.js +0 -25
  67. package/dist/Misc/LibRegFormValidate/index.d.ts +0 -32
  68. package/dist/Misc/LibRegFormValidate/index.js +0 -34
  69. package/dist/Misc/LibRetryRequest/index.d.ts +0 -24
  70. package/dist/Misc/LibRetryRequest/index.js +0 -37
  71. package/dist/Random/LibProbabilityResult/index.d.ts +0 -8
  72. package/dist/Random/LibProbabilityResult/index.js +0 -8
  73. package/dist/Random/LibRandom/index.d.ts +0 -9
  74. package/dist/Random/LibRandom/index.js +0 -11
  75. package/dist/Random/LibRandomColor/index.d.ts +0 -7
  76. package/dist/Random/LibRandomColor/index.js +0 -12
  77. package/dist/Random/LibUniqueRandomNumbers/index.d.ts +0 -9
  78. package/dist/Random/LibUniqueRandomNumbers/index.js +0 -16
  79. package/dist/Time/LibSameTimeCheck/index.d.ts +0 -12
  80. package/dist/Time/LibSameTimeCheck/index.js +0 -24
  81. package/dist/Time/LibSecondsFormatterChinese/index.d.ts +0 -11
  82. package/dist/Time/LibSecondsFormatterChinese/index.js +0 -42
  83. package/dist/Time/LibTimeAgo/index.d.ts +0 -9
  84. package/dist/Time/LibTimeAgo/index.js +0 -27
  85. package/dist/Time/LibTimeGreeting/index.d.ts +0 -17
  86. package/dist/Time/LibTimeGreeting/index.js +0 -23
  87. package/dist/index.d.ts +0 -1
  88. package/dist/index.js +0 -1
  89. package/dist/lib.d.ts +0 -394
  90. package/dist/lib.js +0 -404
@@ -1,17 +0,0 @@
1
- /** @description 将链接图片下载到本地
2
- * @param link 图片链接
3
- * @param name 图片名称
4
- * @example
5
- * libDownloadImageLink("https://example.com/image.jpg", "图片.jpg");
6
- */
7
- export const libDownloadImageLink = (link, name) => {
8
- fetch(link)
9
- .then((res) => res.blob())
10
- .then((blob) => {
11
- const a = document.createElement("a");
12
- const url = window.URL.createObjectURL(blob);
13
- a.href = url;
14
- a.download = name;
15
- a.click();
16
- });
17
- };
@@ -1,5 +0,0 @@
1
- /** @description 计算文件大小
2
- * @param file 文件对象
3
- * @returns 文件大小KB
4
- */
5
- export declare const libFileSize: (file: any) => number;
@@ -1,11 +0,0 @@
1
- /** @description 计算文件大小
2
- * @param file 文件对象
3
- * @returns 文件大小KB
4
- */
5
- export const libFileSize = (file) => {
6
- const str = JSON.stringify(file, null, 2);
7
- const blob = new Blob([str]);
8
- const fileSizeInBytes = blob.size;
9
- const fileSizeInKB = (fileSizeInBytes / 1024).toFixed(2);
10
- return Number(fileSizeInKB);
11
- };
@@ -1,32 +0,0 @@
1
- /** @description 图片压缩参数 */
2
- export type LibImageOptimizerOptionsParams = {
3
- file?: File;
4
- /** 压缩尺寸 */
5
- width?: number;
6
- /** 压缩率 */
7
- ratio?: number;
8
- /** 超过多大进行压缩 */
9
- maxSize?: number;
10
- /** 成功回调 */
11
- success: (formData: FormData, file: File, url: string) => void;
12
- /** 失败回调 */
13
- fail?: (error: ErrorEvent) => void;
14
- };
15
- /** @description 图片压缩,支持png压缩,保留透明背景
16
- * @param obj 压缩参数
17
- * @example
18
- * //图片压缩使用示例
19
- * libImageOptimizerOptionsParams({
20
- * file: myFile,
21
- * ratio: 0.8,
22
- * width: 800,
23
- * maxSize: 1024,
24
- * success: (formData, file, url) => {
25
- * console.log('压缩成功', formData, file, url);
26
- * },
27
- * fail: (error) => {
28
- * console.error('压缩失败', error);
29
- * }
30
- * });
31
- */
32
- export declare const libImageOptimizer: (obj: LibImageOptimizerOptionsParams) => void;
@@ -1,83 +0,0 @@
1
- /** @description 图片压缩,支持png压缩,保留透明背景
2
- * @param obj 压缩参数
3
- * @example
4
- * //图片压缩使用示例
5
- * libImageOptimizerOptionsParams({
6
- * file: myFile,
7
- * ratio: 0.8,
8
- * width: 800,
9
- * maxSize: 1024,
10
- * success: (formData, file, url) => {
11
- * console.log('压缩成功', formData, file, url);
12
- * },
13
- * fail: (error) => {
14
- * console.error('压缩失败', error);
15
- * }
16
- * });
17
- */
18
- export const libImageOptimizer = (obj) => {
19
- const canvas = document.createElement("canvas");
20
- canvas.classList.add("imageOptimizer");
21
- document.body.appendChild(canvas);
22
- const files = obj.file;
23
- if (!files)
24
- return;
25
- const name = files.name;
26
- const extension = name.split(".").pop().toLowerCase();
27
- const ratio = obj.ratio || 1;
28
- const maxSize = obj.maxSize || 1024;
29
- const width = obj.width || 10000;
30
- const mimeType = files.type;
31
- function dataURLtoFile(dataURL, filename) {
32
- const arr = dataURL.split(",");
33
- const mime = arr[0].match(/:(.*?);/)[1];
34
- const bstr = window.atob(arr[1]);
35
- const n = bstr.length;
36
- const u8arr = new Uint8Array(n);
37
- for (let i = 0; i < n; i++) {
38
- u8arr[i] = bstr.charCodeAt(i);
39
- }
40
- return new File([u8arr], filename, { type: mime });
41
- }
42
- function formData(file) {
43
- const data = new FormData();
44
- data.append("file", file);
45
- return data;
46
- }
47
- const reader = new FileReader();
48
- reader.readAsDataURL(files);
49
- reader.onload = (e) => {
50
- const result = e.target.result;
51
- if (e.total / 1024 > maxSize) {
52
- const image = new Image();
53
- image.src = result;
54
- image.onload = () => {
55
- const context = canvas.getContext("2d");
56
- const scale = width / image.width;
57
- if (scale < 1) {
58
- canvas.width = image.width * scale;
59
- canvas.height = image.height * scale;
60
- context.drawImage(image, 0, 0, image.width * scale, image.height * scale);
61
- }
62
- else {
63
- canvas.width = image.width;
64
- canvas.height = image.height;
65
- context.drawImage(image, 0, 0, image.width, image.height);
66
- }
67
- const dataUrl = canvas.toDataURL(mimeType, ratio);
68
- const newName = `${name.split(".")[0]}.${extension}`;
69
- const file = dataURLtoFile(dataUrl, newName);
70
- obj.success(formData(file), file, dataUrl);
71
- canvas.remove();
72
- };
73
- image.onerror = obj.fail;
74
- }
75
- else {
76
- const newName = `${name.split(".")[0]}.${extension}`;
77
- const file = dataURLtoFile(result, newName);
78
- obj.success(formData(file), file, result);
79
- canvas.remove();
80
- }
81
- };
82
- reader.onerror = obj.fail;
83
- };
@@ -1,18 +0,0 @@
1
- /** @description 图片压缩参数 */
2
- export type libImageOptimizerOptionsParams = {
3
- file?: File;
4
- /** 压缩尺寸 */
5
- width?: number;
6
- /** 压缩率 */
7
- ratio?: number;
8
- /** 超过多大进行压缩 */
9
- maxSize?: number;
10
- /** 成功回调 */
11
- success: (data: FormData, file: File, url: string) => void;
12
- /** 失败回调 */
13
- fail?: (error: ErrorEvent) => void;
14
- };
15
- /** @description 图片压缩
16
- * @param obj 压缩参数
17
- */
18
- export declare const liblibImageOptimizerOptionsParams: (obj: libImageOptimizerOptionsParams) => void;
@@ -1,69 +0,0 @@
1
- /** @description 图片压缩
2
- * @param obj 压缩参数
3
- */
4
- export const liblibImageOptimizerOptionsParams = (obj) => {
5
- const canvas = document.createElement("canvas");
6
- canvas.classList.add("imageOptimizer");
7
- document.body.appendChild(canvas);
8
- const files = obj.file;
9
- if (!files)
10
- return;
11
- const name = files.name;
12
- const extension = name.split(".").pop().toLowerCase();
13
- const ratio = obj.ratio || 1;
14
- const maxSize = obj.maxSize || 1024;
15
- const width = obj.width || 10000;
16
- const mimeType = files.type;
17
- function dataURLtoFile(dataURL, filename) {
18
- const arr = dataURL.split(",");
19
- const mime = arr[0].match(/:(.*?);/)[1];
20
- const bstr = window.atob(arr[1]);
21
- const n = bstr.length;
22
- const u8arr = new Uint8Array(n);
23
- for (let i = 0; i < n; i++) {
24
- u8arr[i] = bstr.charCodeAt(i);
25
- }
26
- return new File([u8arr], filename, { type: mime });
27
- }
28
- function formData(file) {
29
- const data = new FormData();
30
- data.append("file", file);
31
- return data;
32
- }
33
- const reader = new FileReader();
34
- reader.readAsDataURL(files);
35
- reader.onload = (e) => {
36
- const result = e.target.result;
37
- if (e.total / 1024 > maxSize) {
38
- const image = new Image();
39
- image.src = result;
40
- image.onload = () => {
41
- const context = canvas.getContext("2d");
42
- const scale = width / image.width;
43
- if (scale < 1) {
44
- canvas.width = image.width * scale;
45
- canvas.height = image.height * scale;
46
- context.drawImage(image, 0, 0, image.width * scale, image.height * scale);
47
- }
48
- else {
49
- canvas.width = image.width;
50
- canvas.height = image.height;
51
- context.drawImage(image, 0, 0, image.width, image.height);
52
- }
53
- const dataUrl = canvas.toDataURL(mimeType, ratio);
54
- const newName = `${name.split(".")[0]}.${extension}`;
55
- const file = dataURLtoFile(dataUrl, newName);
56
- obj.success(formData(file), file, dataUrl);
57
- canvas.remove();
58
- };
59
- image.onerror = obj.fail;
60
- }
61
- else {
62
- const newName = `${name.split(".")[0]}.${extension}`;
63
- const file = dataURLtoFile(result, newName);
64
- obj.success(formData(file), file, result);
65
- canvas.remove();
66
- }
67
- };
68
- reader.onerror = obj.fail;
69
- };
@@ -1,11 +0,0 @@
1
- interface libSaveExcelParams {
2
- name?: string;
3
- data?: any[];
4
- format?: Record<string, string>;
5
- }
6
- /**
7
- * @description 将对象数据转换为Excel文件并导出。
8
- * @param obj 包含name、data和format的对象。
9
- */
10
- export declare const libSaveExcel: (obj?: libSaveExcelParams) => void;
11
- export {};
@@ -1,17 +0,0 @@
1
- import XLSX from "xlsx";
2
- /**
3
- * @description 将对象数据转换为Excel文件并导出。
4
- * @param obj 包含name、data和format的对象。
5
- */
6
- export const libSaveExcel = (obj = {}) => {
7
- let { name = "未命名表格", data = [], format = {} } = obj;
8
- function _fmtObj(data, format) {
9
- return data.map((i) => Object.assign(Object.keys(format).map((j) => ({
10
- [format[j]]: i[j],
11
- }))));
12
- }
13
- const ws = XLSX.utils.json_to_sheet(JSON.stringify(format) === "{}" ? data : _fmtObj(data, format));
14
- const wb = XLSX.utils.book_new();
15
- XLSX.utils.book_append_sheet(wb, ws, name);
16
- XLSX.writeFile(wb, `${name}.xlsx`);
17
- };
@@ -1,9 +0,0 @@
1
- /**
2
- * @description 保存文件到本地
3
- * @param data 要保存的数据
4
- * @param name 文件名
5
- * @example
6
- * libSaveJson(JSON.stringify({ key: "value" }), "example.json");
7
- * libSaveJson("Hellow World!", "example.txt");
8
- */
9
- export declare const libSaveJson: (data: BlobPart, name: string) => void;
@@ -1,17 +0,0 @@
1
- /**
2
- * @description 保存文件到本地
3
- * @param data 要保存的数据
4
- * @param name 文件名
5
- * @example
6
- * libSaveJson(JSON.stringify({ key: "value" }), "example.json");
7
- * libSaveJson("Hellow World!", "example.txt");
8
- */
9
- export const libSaveJson = (data, name) => {
10
- const urlObject = window.URL || window.webkitURL;
11
- const exportBlob = new Blob([data]);
12
- const saveLink = document.createElement("a");
13
- saveLink.href = urlObject.createObjectURL(exportBlob);
14
- saveLink.download = name;
15
- saveLink.click();
16
- urlObject.revokeObjectURL(saveLink.href);
17
- };
@@ -1,9 +0,0 @@
1
- /**
2
- * @description 格式化字节大小
3
- * @param bytes 字节数
4
- * @returns ['大小', '单位', '大小及单位']
5
- * @example
6
- * const [size, unit, formatted] = libFormatterByte(2048);
7
- * console.log(size, unit, formatted); //2.00 KB 2.00 KB
8
- */
9
- export declare const libFormatterByte: (bytes: number) => (string | number)[];
@@ -1,17 +0,0 @@
1
- /**
2
- * @description 格式化字节大小
3
- * @param bytes 字节数
4
- * @returns ['大小', '单位', '大小及单位']
5
- * @example
6
- * const [size, unit, formatted] = libFormatterByte(2048);
7
- * console.log(size, unit, formatted); //2.00 KB 2.00 KB
8
- */
9
- export const libFormatterByte = (bytes) => {
10
- if (bytes <= 0)
11
- return [0, "B", "0 B"];
12
- const k = 1024;
13
- const sizes = ["B", "KB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB"];
14
- const i = Math.min(Math.floor(Math.log(bytes) / Math.log(k)), sizes.length - 1);
15
- const size = (bytes / k ** i).toFixed(2);
16
- return [size, sizes[i], `${size} ${sizes[i]}`];
17
- };
@@ -1,8 +0,0 @@
1
- /**
2
- * @description 隐藏手机号码中间的四位数字
3
- * @param mobile 需要处理的手机号码
4
- * @example
5
- * const masked = libMaskPhoneNumber("13812345678");
6
- * console.log(masked); //138****5678
7
- */
8
- export declare const libMaskPhoneNumber: (mobile: number | string) => string;
@@ -1,11 +0,0 @@
1
- /**
2
- * @description 隐藏手机号码中间的四位数字
3
- * @param mobile 需要处理的手机号码
4
- * @example
5
- * const masked = libMaskPhoneNumber("13812345678");
6
- * console.log(masked); //138****5678
7
- */
8
- export const libMaskPhoneNumber = (mobile) => {
9
- const m = mobile.toString();
10
- return m.replace(/^(\d{3})\d{4}(\d{4})$/, "$1****$2");
11
- };
@@ -1,9 +0,0 @@
1
- /**
2
- * @description 数字每三位添加逗号
3
- * @param num 需要格式化的数字
4
- * @param reserve 保留小数位数
5
- * @example
6
- * const formatted = libNumComma(1234567.89);
7
- * console.log(formatted); //1,234,567.89
8
- */
9
- export declare const libNumComma: (num: number, reserve?: number) => string;
@@ -1,13 +0,0 @@
1
- /**
2
- * @description 数字每三位添加逗号
3
- * @param num 需要格式化的数字
4
- * @param reserve 保留小数位数
5
- * @example
6
- * const formatted = libNumComma(1234567.89);
7
- * console.log(formatted); //1,234,567.89
8
- */
9
- export const libNumComma = (num, reserve = 2) => {
10
- const str = num.toFixed(reserve).toString();
11
- const reg = str.indexOf(".") > -1 ? /(\d)(?=(\d{3})+\.)/g : /(\d)(?=(?:\d{3})+$)/g;
12
- return str.replace(reg, "$1,");
13
- };
@@ -1,12 +0,0 @@
1
- export interface LibNumberUnitParams {
2
- [unit: string]: number;
3
- }
4
- /** @description 将大于1000的数字使用k为单位
5
- * @param num 数字
6
- * @param units 单位组,key为单位,value为格式化阈值
7
- * @returns [数字, 单位]
8
- * @example
9
- * const [value, unit] = libNumberUnit(1500, { K: 1000, M: 1000000 });
10
- * console.log(value, unit); //1.50 K
11
- */
12
- export declare const libNumberUnit: (num: number, units: LibNumberUnitParams) => string[];
@@ -1,23 +0,0 @@
1
- import Decimal from "decimal.js";
2
- /** @description 将大于1000的数字使用k为单位
3
- * @param num 数字
4
- * @param units 单位组,key为单位,value为格式化阈值
5
- * @returns [数字, 单位]
6
- * @example
7
- * const [value, unit] = libNumberUnit(1500, { K: 1000, M: 1000000 });
8
- * console.log(value, unit); //1.50 K
9
- */
10
- export const libNumberUnit = (num, units) => {
11
- const decimalValue = new Decimal(num);
12
- const sortedUnits = Object.entries(units).sort(([, a], [, b]) => b - a);
13
- for (const [unit, threshold] of sortedUnits) {
14
- const decimalThreshold = new Decimal(threshold);
15
- if (decimalValue.greaterThanOrEqualTo(decimalThreshold)) {
16
- const formattedValue = decimalValue
17
- .dividedBy(decimalThreshold)
18
- .toFixed(2);
19
- return [formattedValue, unit];
20
- }
21
- }
22
- return [decimalValue.toFixed(2), ""];
23
- };
@@ -1,11 +0,0 @@
1
- /**
2
- * @description 将秒数格式化为中文时间描述,支持扩展到年
3
- * @param seconds 秒数
4
- * @returns 格式化后的中文时间
5
- * @example
6
- * libSecondsFormatterChinese(100000); //"1天3小时46分40秒"
7
- * libSecondsFormatterChinese(31536000); //"1年"
8
- * libSecondsFormatterChinese(3600); //"1小时"
9
- * libSecondsFormatterChinese(90); //"1分30秒"
10
- */
11
- export declare const libSecondsFormatterChinese: (seconds: number) => string;
@@ -1,42 +0,0 @@
1
- import dayjs from "dayjs";
2
- import duration from "dayjs/plugin/duration";
3
- dayjs.extend(duration);
4
- /**
5
- * @description 将秒数格式化为中文时间描述,支持扩展到年
6
- * @param seconds 秒数
7
- * @returns 格式化后的中文时间
8
- * @example
9
- * libSecondsFormatterChinese(100000); //"1天3小时46分40秒"
10
- * libSecondsFormatterChinese(31536000); //"1年"
11
- * libSecondsFormatterChinese(3600); //"1小时"
12
- * libSecondsFormatterChinese(90); //"1分30秒"
13
- */
14
- export const libSecondsFormatterChinese = (seconds) => {
15
- const duration = dayjs.duration(seconds, "seconds");
16
- const years = Math.floor(duration.asYears());
17
- const months = Math.floor(duration.asMonths() % 12);
18
- const days = Math.floor(duration.asDays() % 30);
19
- const hours = duration.hours();
20
- const minutes = duration.minutes();
21
- const remainingSeconds = duration.seconds();
22
- const timeParts = [];
23
- if (years > 0) {
24
- timeParts.push(`${years}年`);
25
- }
26
- if (months > 0) {
27
- timeParts.push(`${months}月`);
28
- }
29
- if (days > 0) {
30
- timeParts.push(`${days}天`);
31
- }
32
- if (hours > 0) {
33
- timeParts.push(`${hours}小时`);
34
- }
35
- if (minutes > 0) {
36
- timeParts.push(`${minutes}分`);
37
- }
38
- if (timeParts.length === 0 || remainingSeconds > 0) {
39
- timeParts.push(`${remainingSeconds}秒`);
40
- }
41
- return timeParts.join("");
42
- };
@@ -1,9 +0,0 @@
1
- /** @description 计算表达式字符串
2
- * @param expression 表达式字符串
3
- * @param point 小数点精度
4
- * @returns 计算结果
5
- * @example
6
- * const result = libCalculateExpression("(1+2)-(3*4)/5");
7
- * console.log(result); //0.6
8
- */
9
- export declare const libCalculateExpression: (expression: string, point?: number) => number;
@@ -1,107 +0,0 @@
1
- import Decimal from 'decimal.js';
2
- /** @description 计算表达式字符串
3
- * @param expression 表达式字符串
4
- * @param point 小数点精度
5
- * @returns 计算结果
6
- * @example
7
- * const result = libCalculateExpression("(1+2)-(3*4)/5");
8
- * console.log(result); //0.6
9
- */
10
- export const libCalculateExpression = (expression, point = 2) => {
11
- //清除所有空格
12
- expression = expression.replace(/\s+/g, '');
13
- //支持的运算符和优先级
14
- const operators = {
15
- "+": 1,
16
- "-": 1,
17
- "*": 2,
18
- "/": 2,
19
- };
20
- //支持的小数点精度
21
- const toDecimal = (value) => new Decimal(value);
22
- //判断字符是否是运算符
23
- const isOperator = (char) => ['+', '-', '*', '/'].includes(char);
24
- //判断字符是否是数字(包括小数点)
25
- const isNumber = (char) => /[0-9.]/.test(char);
26
- //解析表达式并计算
27
- const evaluate = (expression) => {
28
- const outputQueue = []; //输出队列
29
- const operatorStack = []; //操作符栈
30
- let i = 0;
31
- while (i < expression.length) {
32
- const char = expression[i];
33
- if (isNumber(char)) {
34
- let numStr = '';
35
- //处理多位数字(支持小数)
36
- while (i < expression.length && isNumber(expression[i])) {
37
- numStr += expression[i];
38
- i++;
39
- }
40
- outputQueue.push(toDecimal(numStr));
41
- }
42
- else if (char === '(') {
43
- operatorStack.push(char);
44
- i++;
45
- }
46
- else if (char === ')') {
47
- //处理右括号,直到遇到左括号
48
- while (operatorStack.length > 0 && operatorStack[operatorStack.length - 1] !== '(') {
49
- outputQueue.push(operatorStack.pop());
50
- }
51
- operatorStack.pop(); //弹出左括号
52
- i++;
53
- }
54
- else if (isOperator(char)) {
55
- //运算符
56
- while (operatorStack.length > 0 && operators[operatorStack[operatorStack.length - 1]] >= operators[char]) {
57
- outputQueue.push(operatorStack.pop());
58
- }
59
- operatorStack.push(char);
60
- i++;
61
- }
62
- else {
63
- throw new Error(`无效字符: ${char}`);
64
- }
65
- }
66
- //把所有剩余的操作符添加到输出队列
67
- while (operatorStack.length > 0) {
68
- outputQueue.push(operatorStack.pop());
69
- }
70
- //执行运算
71
- const calcStack = [];
72
- for (let token of outputQueue) {
73
- if (typeof token === 'string') {
74
- const b = calcStack.pop();
75
- const a = calcStack.pop();
76
- switch (token) {
77
- case '+':
78
- calcStack.push(a.add(b));
79
- break;
80
- case '-':
81
- calcStack.push(a.sub(b));
82
- break;
83
- case '*':
84
- calcStack.push(a.mul(b));
85
- break;
86
- case '/':
87
- if (b.eq(0))
88
- throw new Error("除数不能为零");
89
- calcStack.push(a.div(b));
90
- break;
91
- }
92
- }
93
- else {
94
- calcStack.push(token);
95
- }
96
- }
97
- return calcStack.pop();
98
- };
99
- try {
100
- //调用计算器并返回结果
101
- const result = evaluate(expression);
102
- return Number(result.toFixed(point)); //保留指定的小数位数
103
- }
104
- catch (error) {
105
- throw new Error("表达式计算失败:" + error.message);
106
- }
107
- };
@@ -1,12 +0,0 @@
1
- /**
2
- * @description 角度和弧度互相转换
3
- * @param value 角度值或弧度值
4
- * @param type 角度类型或弧度类型
5
- * @example
6
- * //角度转弧度
7
- * libConvertAngle(90, "rad"); //返回 1.5708... (π/2)
8
- *
9
- * //弧度转角度
10
- * libConvertAngle(Math.PI, "deg"); //返回 180
11
- */
12
- export declare const libConvertAngle: (value: number, type: "rad" | "deg") => number;
@@ -1,22 +0,0 @@
1
- /**
2
- * @description 角度和弧度互相转换
3
- * @param value 角度值或弧度值
4
- * @param type 角度类型或弧度类型
5
- * @example
6
- * //角度转弧度
7
- * libConvertAngle(90, "rad"); //返回 1.5708... (π/2)
8
- *
9
- * //弧度转角度
10
- * libConvertAngle(Math.PI, "deg"); //返回 180
11
- */
12
- export const libConvertAngle = (value, type) => {
13
- if (type === "rad") {
14
- return value * (Math.PI / 180);
15
- }
16
- else if (type === "deg") {
17
- return value * (180 / Math.PI);
18
- }
19
- else {
20
- throw new Error("请使用正确类型");
21
- }
22
- };
@@ -1,15 +0,0 @@
1
- /** @description 计算两点角度
2
- * @param coord1 起点坐标
3
- * @param coord2 终点坐标
4
- * @example
5
- * libCoordsAngle({ x: 0, y: 0 }, { x: 1, y: 0 }); //0
6
- * libCoordsAngle({ x: 0, y: 0 }, { x: 1, y: 1 }); //45
7
- * libCoordsAngle({ x: 0, y: 0 }, { x: 0, y: 1 }); //90
8
- */
9
- export declare const libCoordsAngle: (coord1: {
10
- x: number;
11
- y: number;
12
- }, coord2: {
13
- x: number;
14
- y: number;
15
- }) => number;
@@ -1,24 +0,0 @@
1
- /** @description 计算两点角度
2
- * @param coord1 起点坐标
3
- * @param coord2 终点坐标
4
- * @example
5
- * libCoordsAngle({ x: 0, y: 0 }, { x: 1, y: 0 }); //0
6
- * libCoordsAngle({ x: 0, y: 0 }, { x: 1, y: 1 }); //45
7
- * libCoordsAngle({ x: 0, y: 0 }, { x: 0, y: 1 }); //90
8
- */
9
- export const libCoordsAngle = (coord1, coord2) => {
10
- //计算相对于第一个坐标的水平和垂直距离
11
- const deltaX = coord2.x - coord1.x;
12
- const deltaY = coord2.y - coord1.y;
13
- //使用反三角函数计算角度(以弧度为单位)
14
- const angleRad = Math.atan2(deltaY, deltaX);
15
- //将弧度转换为角度
16
- let angleDeg = angleRad * (180 / Math.PI);
17
- //将角度转换为顺时针方向为正方向的角度
18
- angleDeg = -angleDeg + 90;
19
- //调整角度使得右边成为 360 度的位置变为 0 度
20
- if (angleDeg < 0) {
21
- angleDeg += 360;
22
- }
23
- return angleDeg;
24
- };