From 7135f82bcf7a6314b47285fc240aa70a982ed20b Mon Sep 17 00:00:00 2001 From: rk_zhang <40221744+qmhc@users.noreply.github.com> Date: Sat, 28 May 2022 10:07:54 +0800 Subject: [PATCH] fix(utils): using string schema to process toFixed --- common/icons/package.json | 2 ++ common/utils/src/number.ts | 49 ++++++++++++++++++++++++++++++-------- 2 files changed, 41 insertions(+), 10 deletions(-) diff --git a/common/icons/package.json b/common/icons/package.json index 66f089240..0fc520e58 100644 --- a/common/icons/package.json +++ b/common/icons/package.json @@ -1,5 +1,7 @@ { "name": "@vexip-ui/icons", + "version": "1.0.0", + "license": "MIT", "anchor": "qmhc", "scripts": { "build": "ts-node scripts/build.ts" diff --git a/common/utils/src/number.ts b/common/utils/src/number.ts index d2c856f8f..1b41ad5da 100644 --- a/common/utils/src/number.ts +++ b/common/utils/src/number.ts @@ -1,10 +1,18 @@ -export function toNumber(value: unknown): number { +/** + * 将任意值转成数字,NaN 的情况将会处理成 0 + * @param value - 需要转化的值 + */ +export function toNumber(value: unknown) { const number = parseFloat(value as string) return Number.isNaN(number) ? 0 : number } -export function doubleDigits(number: number): string { +/** + * 讲小于 10 整数 N 变成 `0N` 的字符串,方法不会对入参校验 + * @param number - 需要处理的整数 + */ +export function doubleDigits(number: number) { return number < 10 ? `0${number}` : number.toString() } @@ -34,20 +42,41 @@ export function segmentNumber(number: number | string, segment = 3, separator = return `${integer}${decimal}` } +/** + * 讲一个实数保留一定的小数 + * @param number - 需要处理的实数 + * @param decimal - 需要保留的小数 + */ +export function toFixed(number: number, decimal: number) { + if (decimal === 0) return Math.round(number) + + let snum = String(number) + const pointPos = snum.indexOf('.') + + if (pointPos === -1) return number + + const nums = snum.replace('.', '').split('') + const datum = nums[pointPos + decimal] + + if (!datum) return number + + const length = snum.length + + if (snum.charAt(length - 1) === '5') { + snum = snum.substring(0, length - 1) + '6' + } + + return parseFloat(Number(snum).toFixed(decimal)) +} + /** * 将一个实数扩大一定的倍数并保留一定的小数 * @param number - 要处理的实数 * @param multiple - 要扩大的倍数 * @param decimal - 要保留的小数 */ -export function multipleFixed(number: number, multiple: number, decimal: number): number { - const fixed = 10 ** decimal - - return Math.round(number * multiple * fixed) / fixed -} - -export function toFixed(number: number, decimal: number): number { - return multipleFixed(number, 1, decimal) +export function multipleFixed(number: number, multiple: number, decimal: number) { + return toFixed(number * multiple, decimal) } /**