Skip to content

Commit 23717e3

Browse files
committed
fix no prefix issue
1 parent b56c763 commit 23717e3

File tree

6 files changed

+83
-5
lines changed

6 files changed

+83
-5
lines changed

src/directive.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,13 +8,15 @@ export default {
88
bind: (el: core.CustomInputElement, { value, modifiers }: DirectiveBinding, vnode: VNode) => {
99
el = core.getInputElement(el)
1010
const options = Object.assign(core.cloneDeep(defaultOptions), value, modifiers)
11-
const { reverseFill, precision } = options
11+
const { reverseFill, precision, decimal } = options
1212
el.options = options
1313
if (reverseFill && el.value) {
1414
el.value = parseFloat(new NumberFormat({ ...options, reverseFill: false }).unformat(el.value)).toFixed(precision)
1515
if (vnode && vnode.data && vnode.data.domProps) {
1616
vnode.data.domProps.value = el.value
1717
}
18+
} else if (el.value && !isNaN(Number(el.value))) {
19+
el.value = el.value.replace('.', decimal)
1820
}
1921
// set initial value
2022
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: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ describe('VueNumber custom config', () => {
1616
const input = wrapper.find('input')
1717
expect(input.element.value).toBe('Rs.123.456,89%')
1818

19-
input.element.value = 123456.893
19+
input.element.value = '123456,893'
2020
await input.trigger('input')
2121
expect(wrapper.vm.unmaskedValue).toBe('123456.89')
2222
expect(wrapper.vm.maskedValue).toBe('Rs.123.456,893%')
@@ -25,7 +25,7 @@ describe('VueNumber custom config', () => {
2525
expect(wrapper.vm.unmaskedValue).toBe('123456.89')
2626
expect(wrapper.vm.maskedValue).toBe('Rs.123.456,89%')
2727

28-
input.element.value = 1234.568
28+
input.element.value = '1234,568'
2929
await input.trigger('input')
3030
expect(wrapper.vm.unmaskedValue).toBe('1234.57')
3131
expect(wrapper.vm.maskedValue).toBe('Rs.1.234,568%')
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
import { mount } from '@vue/test-utils'
2+
import VueNumber from '../../src/component.vue'
3+
4+
describe('VueNumber custom config', () => {
5+
test('should emit input event with the new maskedValue and unmaskedValue on input', async () => {
6+
const wrapper = mount(VueNumber, {
7+
propsData: {
8+
value: 123456.893,
9+
decimal: ',',
10+
separator: '.',
11+
prefix: '',
12+
suffix: '%'
13+
}
14+
})
15+
16+
const input = wrapper.find('input')
17+
expect(input.element.value).toBe('123.456,89%')
18+
19+
input.element.value = '123.456'
20+
await input.trigger('input')
21+
expect(wrapper.vm.unmaskedValue).toBe('123456')
22+
expect(wrapper.vm.maskedValue).toBe('123.456%')
23+
24+
await input.trigger('blur')
25+
expect(wrapper.vm.unmaskedValue).toBe('123456')
26+
expect(wrapper.vm.maskedValue).toBe('123.456%')
27+
28+
input.element.value = '1234,568'
29+
await input.trigger('input')
30+
expect(wrapper.vm.unmaskedValue).toBe('1234.57')
31+
expect(wrapper.vm.maskedValue).toBe('1.234,568%')
32+
33+
await input.trigger('blur')
34+
expect(wrapper.vm.unmaskedValue).toBe('1234.57')
35+
expect(wrapper.vm.maskedValue).toBe('1.234,57%')
36+
})
37+
})

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.element.value = 1234.568
30+
input.element.value = '1234,568'
3131
await input.trigger('input')
3232
expect(input.element.value).toBe('Rs.1.234,568%')
3333

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
import { mount } from '@vue/test-utils'
2+
import directive from '../../src/directive'
3+
4+
describe('v-number directive', () => {
5+
it('should emit input event with the new value on input', async () => {
6+
const wrapper = mount({
7+
template: `<input v-number="options" type="text" v-model="value" />`,
8+
directives: {
9+
number: directive
10+
},
11+
data() {
12+
return {
13+
value: 123456.893,
14+
options: {
15+
decimal: ',',
16+
separator: '.'
17+
}
18+
}
19+
}
20+
})
21+
22+
const input = wrapper.find('input')
23+
expect(input.element.value).toBe('123.456,89')
24+
25+
await input.trigger('blur')
26+
expect(input.element.value).toBe('123.456,89')
27+
28+
input.element.value = '1234,568'
29+
await input.trigger('input')
30+
expect(input.element.value).toBe('1.234,568')
31+
32+
await input.trigger('blur')
33+
expect(input.element.value).toBe('1.234,57')
34+
})
35+
})

0 commit comments

Comments
 (0)