From 1d43f75580873dd54c9138db0d42e969d3c3d31e Mon Sep 17 00:00:00 2001 From: chaishi Date: Mon, 1 Aug 2022 20:49:30 +0800 Subject: [PATCH] =?UTF-8?q?feat(web):=20input-number=20=E7=BB=9F=E4=B8=80?= =?UTF-8?q?=E9=80=BB=E8=BE=91=E4=BC=98=E5=8C=96=20add=20canInputNumber?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/web/api/input-number.md | 2 +- js/input-number/number.ts | 36 +++++++++++++------ style/web/components/input-number/_index.less | 2 +- .../input-number/compareLargeNumber.test.js | 3 -- .../input-number/largeIntNumberAdd.test.js | 3 -- 5 files changed, 27 insertions(+), 19 deletions(-) diff --git a/docs/web/api/input-number.md b/docs/web/api/input-number.md index 138fa9648e..696556fb78 100644 --- a/docs/web/api/input-number.md +++ b/docs/web/api/input-number.md @@ -56,6 +56,6 @@ spline: form {{ auto-width }} -### 支持大数的输入框 +### 大数字输入框 {{ large-number }} diff --git a/js/input-number/number.ts b/js/input-number/number.ts index ea8b8b587c..8585b53e24 100644 --- a/js/input-number/number.ts +++ b/js/input-number/number.ts @@ -11,6 +11,8 @@ import { } from './large-number'; import log from '../log'; +export * from './large-number'; + export type NumberType = number | string; // 小于最大值,才允许继续添加 @@ -33,16 +35,15 @@ export function canReduceNumber(num: NumberType, min: NumberType, largeNumber = * 格式化数字,如:2e3 转换为 2000 * 如果不是数字,则不允许输入 * decimalPlaces 小数点处理 - * format 自定义格式化函数 */ export function formatToNumber( num: string, extra?: { decimalPlaces?: number, largeNumber?: boolean, - format?: (value: NumberType, context: { fixedNumber: NumberType }) => NumberType, } ): string | number { + if (num === undefined || num === null || num === '') return num; if (num === '-') return 0; if (num[num.length - 1] === '.') return num.slice(0, -1); const isLargeNumber = extra?.largeNumber && isString(num); @@ -50,13 +51,9 @@ export function formatToNumber( if ((isString(num) && num.includes('e')) || isNumber(num)) { newNumber = isLargeNumber ? formatENumber(num) : Number(num); } - const storeNumber = newNumber; if (extra?.decimalPlaces) { newNumber = largeNumberToFixed(newNumber, extra.decimalPlaces); } - if (extra.format) { - newNumber = extra.format(storeNumber, { fixedNumber: newNumber }); - } return isLargeNumber ? newNumber : Number(newNumber); } @@ -160,23 +157,40 @@ export function getStepValue(p: { return largeNumber ? r : Number(r); } +/** + * 最大值和最小值校验 + */ export function getMaxOrMinValidateResult(p: { largeNumber: boolean, - number: NumberType, + value: NumberType, max: NumberType, min: NumberType, }): 'exceed-maximum' | 'below-minimum' | undefined { - const { largeNumber, number, max, min } = p; - if (largeNumber && isNumber(number)) { + const { largeNumber, value, max, min } = p; + if (largeNumber === undefined) return undefined; + if (largeNumber && isNumber(value)) { log.warn('InputNumber', 'largeNumber value must be a string.'); } let error; - if (compareLargeNumber(number, max) > 0) { + if (compareLargeNumber(value, max) > 0) { error = 'exceed-maximum'; - } else if (compareLargeNumber(number, min) < 0) { + } else if (compareLargeNumber(value, min) < 0) { error = 'below-minimum'; } else { error = undefined; } return error; } + +/** + * 是否允许输入当前字符,输入字符校验 + */ +export function canInputNumber( + number: string, + largeNumber: boolean, +) { + if (!number && typeof number === 'string') return true; + const isNumber = (largeNumber && isInputNumber(number)) || !Number.isNaN(Number(number)); + if (!isNumber && !['-', '.', 'e', 'E'].includes(number.slice(-1))) return false; + return true; +} diff --git a/style/web/components/input-number/_index.less b/style/web/components/input-number/_index.less index b40c1ad65a..786a1094db 100644 --- a/style/web/components/input-number/_index.less +++ b/style/web/components/input-number/_index.less @@ -38,7 +38,7 @@ appearance: textfield; } - .@{prefix}-input__tips { + > .@{prefix}-input__tips { // stylelint-disable-next-line length-zero-no-unit margin: 0 -@input-number-button-width; position: absolute; diff --git a/test/unit/input-number/compareLargeNumber.test.js b/test/unit/input-number/compareLargeNumber.test.js index fad94a30db..fc349b8378 100644 --- a/test/unit/input-number/compareLargeNumber.test.js +++ b/test/unit/input-number/compareLargeNumber.test.js @@ -1,8 +1,5 @@ import { compareLargeNumber, isInputNumber, formatENumber } from '../../../js/input-number/large-number'; -/** - * 仅支持正整数 - */ describe('compareLargeNumber', () => { it('0.1, 0.2', () => { expect(compareLargeNumber('0.1', '0.2')).toBe(-1); diff --git a/test/unit/input-number/largeIntNumberAdd.test.js b/test/unit/input-number/largeIntNumberAdd.test.js index f8dddd33a9..8bbc6860ad 100644 --- a/test/unit/input-number/largeIntNumberAdd.test.js +++ b/test/unit/input-number/largeIntNumberAdd.test.js @@ -1,8 +1,5 @@ import { largeIntNumberAdd } from '../../../js/input-number/large-number'; -/** - * 仅支持正整数 - */ describe('largeIntNumberAdd', () => { it('0 + 0', () => { expect(largeIntNumberAdd('0', '0')).toBe(String(0 + 0));