Skip to content

Commit 52abecb

Browse files
committed
[Fix] no prefix and precision issue
1 parent 7fbe46c commit 52abecb

13 files changed

+182
-173
lines changed

src/core.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -149,7 +149,7 @@ export function inputHandler(event: CustomInputEvent) {
149149
positionFromEnd = target.value.length - target.selectionEnd
150150
}
151151

152-
updateValue(target, null, { emit: false })
152+
updateValue(target, null, { emit: false, clean: !options.precision })
153153

154154
// updated cursor position
155155
if (options.suffix) {

src/directive.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,17 +2,20 @@ import { DirectiveBinding, VNode } from 'vue'
22
import * as core from './core'
33
import defaultOptions from './options'
44
import NumberFormat from './number-format'
5+
56
export default {
67
beforeMount: (el: core.CustomInputElement, { value, modifiers }: DirectiveBinding, vnode: VNode) => {
78
el = core.getInputElement(el)
89
const options = Object.assign(core.cloneDeep(defaultOptions), value, modifiers)
9-
const { reverseFill, precision } = options
10+
const { reverseFill, precision, decimal } = options
1011
el.options = options
1112
if (reverseFill && el.value) {
1213
el.value = parseFloat(new NumberFormat({ ...options, reverseFill: false }).unformat(el.value)).toFixed(precision)
1314
if (vnode?.props?.value) {
1415
vnode.props.value = el.value
1516
}
17+
} else if (el.value && !isNaN(Number(el.value))) {
18+
el.value = el.value.replace('.', decimal)
1619
}
1720
// set initial value
1821
core.updateValue(el, vnode, { force: options.prefill, clean: true, emit: false })

src/number-format.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ export default class NumberFormat {
3333
input: Input
3434
number: Input
3535
isClean: boolean
36+
isCustomDecimal: boolean
3637
preSurRegExp: RegExp
3738
numberRegExp: RegExp
3839
cleanRegExp: RegExp
@@ -50,6 +51,7 @@ export default class NumberFormat {
5051
this.numberRegExp = new RegExp(`[^0-9\\${decimal}]+`, 'gi')
5152
this.cleanRegExp = new RegExp('[^0-9]+', 'gi')
5253
this.negativeRegExp = new RegExp('[^0-9\\-]+', 'gi')
54+
this.isCustomDecimal = decimal !== '.'
5355
}
5456

5557
isNull() {
@@ -95,11 +97,13 @@ export default class NumberFormat {
9597

9698
numbers() {
9799
const { reverseFill, decimal } = this.options
100+
const hasDeciaml = this.input.toString().indexOf(decimal) >= 0
101+
const input = !hasDeciaml && this.isCustomDecimal ? this.input + decimal : this.input
98102
if (reverseFill) {
99103
this.number = this.toFixed().replace('.', decimal)
100104
} else if (typeof this.input === 'number') {
101105
this.number = this.parts(this.input.toString().replace('-', ''), '.').join(decimal)
102-
} else if (!isNaN(this.toNumber(this.input))) {
106+
} else if (!isNaN(this.toNumber(input))) {
103107
this.number = this.parts(this.input.replace('-', ''), '.').join(decimal)
104108
} else {
105109
this.number = this.parts(this.numberOnly()).join(decimal)

tests/component/component.custom.spec.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ describe('VueNumber', () => {
1515

1616
const input = wrapper.find('input')
1717
expect(input.element.value).toBe('Rs.123.456,89%')
18-
wrapper.setProps({ modelValue: '1234.568' })
18+
wrapper.setProps({ modelValue: '1234,568' })
1919
await input.trigger('input')
2020
await input.trigger('change')
2121

tests/directive/directive.custom.spec.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ describe('v-number directive', () => {
2727
await input.trigger('blur')
2828
expect(input.element.value).toBe('Rs.123.456,89%')
2929

30-
input.setValue(1234.568)
30+
input.setValue('1234,568')
3131
expect(input.element.value).toBe('Rs.1.234,568%')
3232

3333
await input.trigger('blur')
Lines changed: 24 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -1,58 +1,34 @@
11
import { NumberFormat } from '../../src'
2+
import { expect, test } from 'vitest'
23

3-
test('when the value is invalid with custom config', () => {
4-
const numberFormat = new NumberFormat({
5-
prefix: '$',
6-
separator: '.',
7-
decimal: ',',
8-
nullValue: '0'
9-
})
10-
test('should return as follows', () => {
11-
expect(numberFormat.format('')).toEqual('')
12-
expect(numberFormat.format('foo')).toEqual('')
13-
expect(numberFormat.format('-foo')).toEqual('')
14-
expect(numberFormat.format('-fo,o-')).toEqual('')
15-
expect(numberFormat.format('-fo.o-')).toEqual('')
16-
expect(numberFormat.format('!@#$%^&*()')).toEqual('')
17-
})
18-
test('should return as follows', () => {
19-
expect(numberFormat.unformat('')).toEqual('')
20-
expect(numberFormat.unformat('foo')).toEqual('')
21-
expect(numberFormat.unformat('-foo')).toEqual('')
22-
expect(numberFormat.unformat('-fo.o-')).toEqual('')
23-
expect(numberFormat.unformat('!@#$%^&*()')).toEqual('')
24-
})
25-
})
264
test('format when options are custom', () => {
275
const numberFormat = new NumberFormat({
286
prefix: '$',
297
separator: '.',
308
decimal: ',',
319
nullValue: ''
3210
})
33-
test('format string value', () => {
34-
expect(numberFormat.format('')).toEqual('')
35-
expect(numberFormat.format('0')).toEqual('$0')
36-
expect(numberFormat.format('0,')).toEqual('$0')
37-
expect(numberFormat.format('-0,0')).toEqual('$0')
38-
expect(numberFormat.format('0,10')).toEqual('$0,1')
39-
expect(numberFormat.format('0,0-')).toEqual('$0')
40-
expect(numberFormat.format('0,10-')).toEqual('-$0,1')
41-
expect(numberFormat.format('12.345,54921')).toEqual('$12.345,55')
42-
expect(numberFormat.format('--12.345,12345')).toEqual('-$12.345,12')
43-
expect(numberFormat.format('12.345.54321,12945')).toEqual('$1.234.554.321,13')
44-
expect(numberFormat.format('-12.345,,54321-')).toEqual('-$12.345,54')
45-
})
46-
test('format numerical value', () => {
47-
expect(numberFormat.format(0)).toEqual('$0')
48-
expect(numberFormat.format(0)).toEqual('$0')
49-
expect(numberFormat.format(0.0)).toEqual('$0')
50-
expect(numberFormat.format(-0.1)).toEqual('-$0,1')
51-
expect(numberFormat.format(-0.0)).toEqual('$0')
52-
expect(numberFormat.format(0.1)).toEqual('$0,1')
53-
expect(numberFormat.format(12345.54921)).toEqual('$12.345,55')
54-
expect(numberFormat.format(12345.12345)).toEqual('$12.345,12')
55-
expect(numberFormat.format(12345.54321)).toEqual('$12.345,54')
56-
expect(numberFormat.format(12345.54321)).toEqual('$12.345,54')
57-
})
11+
12+
expect(numberFormat.format('')).toEqual('')
13+
expect(numberFormat.format('0')).toEqual('$0')
14+
expect(numberFormat.format('0,')).toEqual('$0')
15+
expect(numberFormat.format('-0,0')).toEqual('$0')
16+
expect(numberFormat.format('0,10')).toEqual('$0,1')
17+
expect(numberFormat.format('0,0-')).toEqual('$0')
18+
expect(numberFormat.format('0,10-')).toEqual('-$0,1')
19+
expect(numberFormat.format('12.345,54921')).toEqual('$12.345,55')
20+
expect(numberFormat.format('--12.345,12345')).toEqual('-$12.345,12')
21+
expect(numberFormat.format('12.345.54321,12945')).toEqual('$1.234.554.321,13')
22+
expect(numberFormat.format('-12.345,,54321-')).toEqual('-$12.345,54')
23+
24+
expect(numberFormat.format(0)).toEqual('$0')
25+
expect(numberFormat.format(0)).toEqual('$0')
26+
expect(numberFormat.format(0.0)).toEqual('$0')
27+
expect(numberFormat.format(-0.1)).toEqual('-$0,1')
28+
expect(numberFormat.format(-0.0)).toEqual('$0')
29+
expect(numberFormat.format(0.1)).toEqual('$0,1')
30+
expect(numberFormat.format(12345.54921)).toEqual('$12.345,55')
31+
expect(numberFormat.format(12345.12345)).toEqual('$12.345,12')
32+
expect(numberFormat.format(12345.54321)).toEqual('$12.345,54')
33+
expect(numberFormat.format(12345.54321)).toEqual('$12.345,54')
5834
})
Lines changed: 23 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import { NumberFormat } from '../../src'
2+
import { expect, test } from 'vitest'
23

34
test('unformat when options are default', () => {
45
const numberFormat = new NumberFormat({
@@ -7,29 +8,26 @@ test('unformat when options are default', () => {
78
decimal: ',',
89
nullValue: ''
910
})
10-
test('unformat string value', () => {
11-
expect(numberFormat.unformat('')).toEqual('')
12-
expect(numberFormat.unformat('0')).toEqual('0')
13-
expect(numberFormat.unformat('0,')).toEqual('0')
14-
expect(numberFormat.unformat('-0,0')).toEqual('0')
15-
expect(numberFormat.unformat('0,10')).toEqual('0.1')
16-
expect(numberFormat.unformat('0,0-')).toEqual('0')
17-
expect(numberFormat.unformat('0,10-')).toEqual('-0.1')
18-
expect(numberFormat.unformat('12.345,54921')).toEqual('12345.55')
19-
expect(numberFormat.unformat('--12.345,12345')).toEqual('-12345.12')
20-
expect(numberFormat.unformat('12.345.54321,12345')).toEqual('1234554321.12')
21-
expect(numberFormat.unformat('-12.345,,54321-')).toEqual('-12345.54')
22-
})
23-
test('unformat numerical value', () => {
24-
expect(numberFormat.unformat(0)).toEqual('0')
25-
expect(numberFormat.unformat(0)).toEqual('0')
26-
expect(numberFormat.unformat(0.0)).toEqual('0')
27-
expect(numberFormat.unformat(-0.1)).toEqual('-0.1')
28-
expect(numberFormat.unformat(-0.0)).toEqual('0')
29-
expect(numberFormat.unformat(0.1)).toEqual('0.1')
30-
expect(numberFormat.unformat(12345.54921)).toEqual('12345.55')
31-
expect(numberFormat.unformat(12345.12345)).toEqual('12345.12')
32-
expect(numberFormat.unformat(12345.54321)).toEqual('12345.54')
33-
expect(numberFormat.unformat(12345.54321)).toEqual('12345.54')
34-
})
11+
expect(numberFormat.unformat('')).toEqual('')
12+
expect(numberFormat.unformat('0')).toEqual('0')
13+
expect(numberFormat.unformat('0,')).toEqual('0')
14+
expect(numberFormat.unformat('-0,0')).toEqual('0')
15+
expect(numberFormat.unformat('0,10')).toEqual('0.1')
16+
expect(numberFormat.unformat('0,0-')).toEqual('0')
17+
expect(numberFormat.unformat('0,10-')).toEqual('-0.1')
18+
expect(numberFormat.unformat('12.345,54921')).toEqual('12345.55')
19+
expect(numberFormat.unformat('--12.345,12345')).toEqual('-12345.12')
20+
expect(numberFormat.unformat('12.345.54321,12345')).toEqual('1234554321.12')
21+
expect(numberFormat.unformat('-12.345,,54321-')).toEqual('-12345.54')
22+
23+
expect(numberFormat.unformat(0)).toEqual('0')
24+
expect(numberFormat.unformat(0)).toEqual('0')
25+
expect(numberFormat.unformat(0.0)).toEqual('0')
26+
expect(numberFormat.unformat(-0.1)).toEqual('-0.1')
27+
expect(numberFormat.unformat(-0.0)).toEqual('0')
28+
expect(numberFormat.unformat(0.1)).toEqual('0.1')
29+
expect(numberFormat.unformat(12345.54921)).toEqual('12345.55')
30+
expect(numberFormat.unformat(12345.12345)).toEqual('12345.12')
31+
expect(numberFormat.unformat(12345.54321)).toEqual('12345.54')
32+
expect(numberFormat.unformat(12345.54321)).toEqual('12345.54')
3533
})
Lines changed: 40 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -1,54 +1,48 @@
11
import { NumberFormat } from '../../src'
2+
import { expect, test } from 'vitest'
23

34
test('when the value is invalid with default config', () => {
45
const numberFormat = new NumberFormat({})
5-
test('should return as follows', () => {
6-
expect(numberFormat.format('')).toEqual('')
7-
expect(numberFormat.format('foo')).toEqual('')
8-
expect(numberFormat.format('-foo')).toEqual('')
9-
expect(numberFormat.format('-fo,o-')).toEqual('')
10-
expect(numberFormat.format('!@#$%^&*()')).toEqual('')
11-
})
12-
test('should return as follows', () => {
13-
expect(numberFormat.format('')).toEqual('')
14-
expect(numberFormat.format('foo')).toEqual('')
15-
expect(numberFormat.format('-foo')).toEqual('')
16-
expect(numberFormat.format('-fo,o-')).toEqual('')
17-
expect(numberFormat.format('!@#$%^&*()')).toEqual('')
18-
})
19-
test('should return as follows', () => {
20-
expect(numberFormat.unformat('')).toEqual('')
21-
expect(numberFormat.unformat('foo')).toEqual('')
22-
expect(numberFormat.unformat('-foo')).toEqual('')
23-
expect(numberFormat.unformat('-fo,o-')).toEqual('')
24-
expect(numberFormat.unformat('!@#$%^&*()')).toEqual('')
25-
})
6+
expect(numberFormat.format('')).toEqual('')
7+
expect(numberFormat.format('foo')).toEqual('')
8+
expect(numberFormat.format('-foo')).toEqual('')
9+
expect(numberFormat.format('-fo,o-')).toEqual('')
10+
expect(numberFormat.format('!@#$%^&*()')).toEqual('')
11+
12+
expect(numberFormat.format('')).toEqual('')
13+
expect(numberFormat.format('foo')).toEqual('')
14+
expect(numberFormat.format('-foo')).toEqual('')
15+
expect(numberFormat.format('-fo,o-')).toEqual('')
16+
expect(numberFormat.format('!@#$%^&*()')).toEqual('')
17+
18+
expect(numberFormat.unformat('')).toEqual('')
19+
expect(numberFormat.unformat('foo')).toEqual('')
20+
expect(numberFormat.unformat('-foo')).toEqual('')
21+
expect(numberFormat.unformat('-fo,o-')).toEqual('')
22+
expect(numberFormat.unformat('!@#$%^&*()')).toEqual('')
2623
})
2724
test('format when options are default', () => {
2825
const numberFormat = new NumberFormat({})
29-
test('format string value', () => {
30-
expect(numberFormat.format('')).toEqual('')
31-
expect(numberFormat.format('0')).toEqual('0')
32-
expect(numberFormat.format('0.')).toEqual('0')
33-
expect(numberFormat.format('-0.0')).toEqual('0')
34-
expect(numberFormat.format('0.10')).toEqual('0.1')
35-
expect(numberFormat.format('0.0-')).toEqual('0')
36-
expect(numberFormat.format('0.10-')).toEqual('-0.1')
37-
expect(numberFormat.format('12,345.54921')).toEqual('12,345.55')
38-
expect(numberFormat.format('--12,345.12345')).toEqual('-12,345.12')
39-
expect(numberFormat.format('12,345.54321.12345')).toEqual('12,345.54')
40-
expect(numberFormat.format('-12,345..54321-')).toEqual('-12,345.54')
41-
})
42-
test('format numerical value', () => {
43-
expect(numberFormat.format(0)).toEqual('0')
44-
expect(numberFormat.format(0)).toEqual('0')
45-
expect(numberFormat.format(0.0)).toEqual('0')
46-
expect(numberFormat.format(-0.1)).toEqual('-0.1')
47-
expect(numberFormat.format(-0.0)).toEqual('0')
48-
expect(numberFormat.format(0.1)).toEqual('0.1')
49-
expect(numberFormat.format(12345.54921)).toEqual('12,345.55')
50-
expect(numberFormat.format(12345.12345)).toEqual('12,345.12')
51-
expect(numberFormat.format(12345.54321)).toEqual('12,345.54')
52-
expect(numberFormat.format(12345.54321)).toEqual('12,345.54')
53-
})
26+
expect(numberFormat.format('')).toEqual('')
27+
expect(numberFormat.format('0')).toEqual('0')
28+
expect(numberFormat.format('0.')).toEqual('0')
29+
expect(numberFormat.format('-0.0')).toEqual('0')
30+
expect(numberFormat.format('0.10')).toEqual('0.1')
31+
expect(numberFormat.format('0.0-')).toEqual('0')
32+
expect(numberFormat.format('0.10-')).toEqual('-0.1')
33+
expect(numberFormat.format('12,345.54921')).toEqual('12,345.55')
34+
expect(numberFormat.format('--12,345.12345')).toEqual('-12,345.12')
35+
expect(numberFormat.format('12,345.54321.12345')).toEqual('12,345.54')
36+
expect(numberFormat.format('-12,345..54321-')).toEqual('-12,345.54')
37+
38+
expect(numberFormat.format(0)).toEqual('0')
39+
expect(numberFormat.format(0)).toEqual('0')
40+
expect(numberFormat.format(0.0)).toEqual('0')
41+
expect(numberFormat.format(-0.1)).toEqual('-0.1')
42+
expect(numberFormat.format(-0.0)).toEqual('0')
43+
expect(numberFormat.format(0.1)).toEqual('0.1')
44+
expect(numberFormat.format(12345.54921)).toEqual('12,345.55')
45+
expect(numberFormat.format(12345.12345)).toEqual('12,345.12')
46+
expect(numberFormat.format(12345.54321)).toEqual('12,345.54')
47+
expect(numberFormat.format(12345.54321)).toEqual('12,345.54')
5448
})
Lines changed: 23 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,30 +1,28 @@
11
import { NumberFormat } from '../../src'
2+
import { expect, test } from 'vitest'
23

34
test('unformat when options are default', () => {
45
const numberFormat = new NumberFormat({})
5-
test('unformat string value', () => {
6-
expect(numberFormat.unformat('')).toEqual('')
7-
expect(numberFormat.unformat('0')).toEqual('0')
8-
expect(numberFormat.unformat('0.')).toEqual('0')
9-
expect(numberFormat.unformat('-0.0')).toEqual('0')
10-
expect(numberFormat.unformat('0.10')).toEqual('0.1')
11-
expect(numberFormat.unformat('0.0-')).toEqual('0')
12-
expect(numberFormat.unformat('0.10-')).toEqual('-0.1')
13-
expect(numberFormat.unformat('12,345.54921')).toEqual('12345.55')
14-
expect(numberFormat.unformat('--12,345.12345')).toEqual('-12345.12')
15-
expect(numberFormat.unformat('12,345.54321.12345')).toEqual('12345.54')
16-
expect(numberFormat.unformat('-12,345..54321-')).toEqual('-12345.54')
17-
})
18-
test('unformat numerical value', () => {
19-
expect(numberFormat.unformat(0)).toEqual('0')
20-
expect(numberFormat.unformat(0)).toEqual('0')
21-
expect(numberFormat.unformat(0.0)).toEqual('0')
22-
expect(numberFormat.unformat(-0.1)).toEqual('-0.1')
23-
expect(numberFormat.unformat(-0.0)).toEqual('0')
24-
expect(numberFormat.unformat(0.1)).toEqual('0.1')
25-
expect(numberFormat.unformat(12345.54921)).toEqual('12345.55')
26-
expect(numberFormat.unformat(12345.12345)).toEqual('12345.12')
27-
expect(numberFormat.unformat(12345.54321)).toEqual('12345.54')
28-
expect(numberFormat.unformat(12345.54321)).toEqual('12345.54')
29-
})
6+
expect(numberFormat.unformat('')).toEqual('')
7+
expect(numberFormat.unformat('0')).toEqual('0')
8+
expect(numberFormat.unformat('0.')).toEqual('0')
9+
expect(numberFormat.unformat('-0.0')).toEqual('0')
10+
expect(numberFormat.unformat('0.10')).toEqual('0.1')
11+
expect(numberFormat.unformat('0.0-')).toEqual('0')
12+
expect(numberFormat.unformat('0.10-')).toEqual('-0.1')
13+
expect(numberFormat.unformat('12,345.54921')).toEqual('12345.55')
14+
expect(numberFormat.unformat('--12,345.12345')).toEqual('-12345.12')
15+
expect(numberFormat.unformat('12,345.54321.12345')).toEqual('12345.54')
16+
expect(numberFormat.unformat('-12,345..54321-')).toEqual('-12345.54')
17+
18+
expect(numberFormat.unformat(0)).toEqual('0')
19+
expect(numberFormat.unformat(0)).toEqual('0')
20+
expect(numberFormat.unformat(0.0)).toEqual('0')
21+
expect(numberFormat.unformat(-0.1)).toEqual('-0.1')
22+
expect(numberFormat.unformat(-0.0)).toEqual('0')
23+
expect(numberFormat.unformat(0.1)).toEqual('0.1')
24+
expect(numberFormat.unformat(12345.54921)).toEqual('12345.55')
25+
expect(numberFormat.unformat(12345.12345)).toEqual('12345.12')
26+
expect(numberFormat.unformat(12345.54321)).toEqual('12345.54')
27+
expect(numberFormat.unformat(12345.54321)).toEqual('12345.54')
3028
})
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
import { NumberFormat } from '../../src'
2+
import { expect, test } from 'vitest'
3+
4+
test('format when options are custom', () => {
5+
const numberFormat = new NumberFormat({
6+
prefix: '',
7+
separator: '.',
8+
decimal: ',',
9+
nullValue: ''
10+
})
11+
expect(numberFormat.format(0)).toEqual('0')
12+
expect(numberFormat.format(0)).toEqual('0')
13+
expect(numberFormat.format(0.0)).toEqual('0')
14+
expect(numberFormat.format(-0.1)).toEqual('-0,1')
15+
expect(numberFormat.format(-0.0)).toEqual('0')
16+
expect(numberFormat.format(0.1)).toEqual('0,1')
17+
expect(numberFormat.format(12345.54921)).toEqual('12.345,55')
18+
expect(numberFormat.format(12345.12345)).toEqual('12.345,12')
19+
expect(numberFormat.format(12345.54321)).toEqual('12.345,54')
20+
expect(numberFormat.format(12345.54321)).toEqual('12.345,54')
21+
expect(numberFormat.format('12345,54921')).toEqual('12.345,55')
22+
expect(numberFormat.format('12345,12345')).toEqual('12.345,12')
23+
expect(numberFormat.format('12345,54321')).toEqual('12.345,54')
24+
expect(numberFormat.format('12345,54321')).toEqual('12.345,54')
25+
})

0 commit comments

Comments
 (0)