diff --git a/src/field/index.js b/src/field/index.js index 819c9eec4..81d01eb12 100644 --- a/src/field/index.js +++ b/src/field/index.js @@ -1,6 +1,6 @@ // Utils -import { formatNumber } from './utils'; import { preventDefault } from '../utils/dom/event'; +import { formatNumber } from '../utils/format/number'; import { resetScroll } from '../utils/dom/reset-scroll'; import { createNamespace, diff --git a/src/field/utils.ts b/src/field/utils.ts deleted file mode 100644 index d9fe3de4d..000000000 --- a/src/field/utils.ts +++ /dev/null @@ -1,16 +0,0 @@ -export function formatNumber(value: string, allowDot: boolean) { - if (allowDot) { - const dotIndex = value.indexOf('.'); - - if (dotIndex > -1) { - value = - value.slice(0, dotIndex + 1) + value.slice(dotIndex).replace(/\./g, ''); - } - } else { - value = value.split('.')[0]; - } - - const regExp = allowDot ? /[^0-9.]/g : /\D/g; - - return value.replace(regExp, ''); -} diff --git a/src/stepper/index.js b/src/stepper/index.js index 2868fae77..e06b13940 100644 --- a/src/stepper/index.js +++ b/src/stepper/index.js @@ -1,8 +1,8 @@ import { createNamespace, isDef, addUnit } from '../utils'; import { resetScroll } from '../utils/dom/reset-scroll'; import { preventDefault } from '../utils/dom/event'; +import { formatNumber } from '../utils/format/number'; import { FieldMixin } from '../mixins/field'; -import { formatNumber } from '../field/utils'; const [createComponent, bem] = createNamespace('stepper'); diff --git a/src/utils/format/number.ts b/src/utils/format/number.ts index 5401d691b..4a6004ad5 100644 --- a/src/utils/format/number.ts +++ b/src/utils/format/number.ts @@ -1,3 +1,27 @@ export function range(num: number, min: number, max: number): number { return Math.min(Math.max(num, min), max); } + +function trimExtraChar(value: string, char: string, regExp: RegExp) { + const index = value.indexOf(char); + + if (index > -1) { + return value.slice(0, index + 1) + value.slice(index).replace(regExp, ''); + } + + return value; +} + +export function formatNumber(value: string, allowDot?: boolean) { + if (allowDot) { + value = trimExtraChar(value, '.', /\./g); + } else { + value = value.split('.')[0]; + } + + value = trimExtraChar(value, '-', /-/g); + + const regExp = allowDot ? /[^-0-9.]/g : /[^-0-9]/g; + + return value.replace(regExp, ''); +} diff --git a/src/utils/test/index.spec.js b/src/utils/test/index.spec.js index 64fe13786..8ce27efbe 100644 --- a/src/utils/test/index.spec.js +++ b/src/utils/test/index.spec.js @@ -8,6 +8,7 @@ import { isMobile } from '../validate/mobile'; import { isNumeric } from '../validate/number'; import { isAndroid } from '../validate/system'; import { camelize } from '../format/string'; +import { formatNumber } from '../format/number'; test('deepClone', () => { const a = { foo: 0 }; @@ -95,3 +96,21 @@ test('isNumeric', () => { expect(isNumeric('abc')).toBeFalsy(); expect(isNumeric('1b2')).toBeFalsy(); }); + +test('formatNumber', () => { + expect(formatNumber('abc')).toEqual(''); + expect(formatNumber('1.2')).toEqual('1'); + expect(formatNumber('abc1.2')).toEqual('1'); + expect(formatNumber('123.4.')).toEqual('123'); + + // with dot + expect(formatNumber('abc', true)).toEqual(''); + expect(formatNumber('1.2', true)).toEqual('1.2'); + expect(formatNumber('abc1.2', true)).toEqual('1.2'); + expect(formatNumber('123.4.', true)).toEqual('123.4'); + + // minus + expect(formatNumber('-1.2')).toEqual('-1'); + expect(formatNumber('-1.2', true)).toEqual('-1.2'); + expect(formatNumber('-1.2-', true)).toEqual('-1.2'); +});