diff --git a/src/field/index.js b/src/field/index.js index 8e74a921c..eff30d6ba 100644 --- a/src/field/index.js +++ b/src/field/index.js @@ -301,8 +301,8 @@ export default createComponent({ } if (this.type === 'number' || this.type === 'digit') { - const allowDot = this.type === 'number'; - value = formatNumber(value, allowDot); + const isNumber = this.type === 'number'; + value = formatNumber(value, isNumber, isNumber); } if (this.formatter && trigger === this.formatTrigger) { diff --git a/src/utils/format/number.ts b/src/utils/format/number.ts index e1c71567b..79317a359 100644 --- a/src/utils/format/number.ts +++ b/src/utils/format/number.ts @@ -4,26 +4,34 @@ export function range(num: number, min: number, max: number): number { function trimExtraChar(value: string, char: string, regExp: RegExp) { const index = value.indexOf(char); - + if (index === -1) { - return value; + return value; } if (char === '-' && index !== 0) { - return value.slice(0, index); + return value.slice(0, index); } return value.slice(0, index + 1) + value.slice(index).replace(regExp, ''); } -export function formatNumber(value: string, allowDot?: boolean) { +export function formatNumber( + value: string, + allowDot = true, + allowMinus = true +) { if (allowDot) { value = trimExtraChar(value, '.', /\./g); } else { value = value.split('.')[0]; } - value = trimExtraChar(value, '-', /-/g); + if (allowMinus) { + value = trimExtraChar(value, '-', /-/g); + } else { + value = value.replace(/-/, ''); + } const regExp = allowDot ? /[^-0-9.]/g : /[^-0-9]/g; diff --git a/src/utils/test/index.spec.js b/src/utils/test/index.spec.js index a9d6bea10..2dd16e4d4 100644 --- a/src/utils/test/index.spec.js +++ b/src/utils/test/index.spec.js @@ -99,19 +99,20 @@ test('isNumeric', () => { }); 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'); + expect(formatNumber('abc')).toEqual(''); + expect(formatNumber('1.2')).toEqual('1.2'); + expect(formatNumber('abc1.2')).toEqual('1.2'); + expect(formatNumber('123.4.')).toEqual('123.4'); + + // without dot + expect(formatNumber('1.2', false)).toEqual('1'); + expect(formatNumber('abc1.2', false)).toEqual('1'); + expect(formatNumber('123.4.', false)).toEqual('123'); // minus - expect(formatNumber('-1.2')).toEqual('-1'); + expect(formatNumber('-1.2', false)).toEqual('-1'); + expect(formatNumber('-1.2', false, false)).toEqual('1'); expect(formatNumber('-1.2', true)).toEqual('-1.2'); expect(formatNumber('-1.2-', true)).toEqual('-1.2'); expect(formatNumber('123-')).toEqual('123');