Skip to content

Commit d9ef530

Browse files
author
Dipak Sarkar
committed
updated number formating method
1 parent 919d98d commit d9ef530

File tree

4 files changed

+92
-113
lines changed

4 files changed

+92
-113
lines changed

docs/.vuepress/components/Example.vue

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,14 +69,15 @@ export default {
6969
data () {
7070
return {
7171
price: 154.52,
72-
priceDirective: 5432.1,
72+
priceDirective: 0,
7373
priceUnmasked: 6789.10,
7474
config: {
7575
decimal: ',',
7676
separator: '.',
7777
prefix: '$',
7878
suffix: ' %',
7979
precision: 2,
80+
null_value: '',
8081
masked: false
8182
}
8283
}

src/number-format.js

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,10 @@ import options from './options'
66
*/
77
export default function NumberFormat(opt = options) {
88
this.options = Object.assign(options, opt)
9-
this.input = this.options.null_value
10-
this.number = this.options.null_value
9+
this.input = ''
10+
this.number = ''
1111
this.isClean = false
12+
this.isNull = (input = this.input) => !input.toString().replace(new RegExp('[^0-9]+', 'gi'), '')
1213
this.clean = (clean = false) => {
1314
this.isClean = clean
1415
return this
@@ -21,13 +22,12 @@ export default function NumberFormat(opt = options) {
2122
this.isNegative = this.sign() === '-'
2223
this.numbers = () => {
2324
if (typeof this.input === 'number') {
24-
this.number = this.input.toFixed(this.options.precision).toString().replace('-', '').replace('.', this.options.decimal)
25+
this.number = this.toNumber(this.input.toFixed(this.options.precision)).toString().replace('-', '').replace('.', this.options.decimal)
2526
// eslint-disable-next-line no-restricted-globals
2627
} else if (!isNaN(this.toNumber(this.input))) {
2728
this.number = this.input.replace('-', '').replace('.', this.options.decimal)
2829
} else {
29-
const regExp = new RegExp(`[^0-9\\${this.options.decimal}]+`, 'gi')
30-
this.number = this.input.toString().replace(regExp, '')
30+
this.number = this.input.toString().replace(new RegExp(`[^0-9\\${this.options.decimal}]+`, 'gi'), '')
3131
this.number = this.parts(this.number).join(this.options.decimal)
3232
}
3333
return this.number
@@ -40,7 +40,7 @@ export default function NumberFormat(opt = options) {
4040
parts[1] = parts.slice(1, parts.length).join('')
4141
parts = parts.slice(0, 2)
4242
if (parts[1].length > this.options.precision) {
43-
parts[1] = parts[1].slice(0, this.options.precision)
43+
parts[1] = this.toNumber(`.${parts[1]}`).toFixed(this.options.precision).toString().replace('0.', '')
4444
}
4545
}
4646
return parts.slice(0, 2)
@@ -62,6 +62,7 @@ export default function NumberFormat(opt = options) {
6262
this.format = (input) => {
6363
if (input === '') return this.options.null_value
6464
this.input = input
65+
if (this.isNull()) return this.options.null_value
6566
return this.sign() + this.options.prefix + this.addSeparator() + this.options.suffix
6667
}
6768
/**
@@ -72,6 +73,7 @@ export default function NumberFormat(opt = options) {
7273
this.unformat = (input) => {
7374
if (input === '') return this.options.null_value
7475
this.input = input
75-
return this.sign() + this.realNumber()
76+
if (this.isNull()) return this.options.null_value
77+
return this.toNumber(this.sign() + this.realNumber())
7678
}
7779
}

tests/unit/number-format.custom.spec.js

Lines changed: 42 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -17,26 +17,26 @@ describe('when the value is invalid with custom config', () => {
1717
})
1818
it('should return as follows', () => {
1919
expect(numberFormat.format('')).toEqual('')
20-
expect(numberFormat.format('foo')).toEqual('$0')
21-
expect(numberFormat.format('-foo')).toEqual('$0')
22-
expect(numberFormat.format('-fo,o-')).toEqual('$0,')
23-
expect(numberFormat.format('-fo.o-')).toEqual('$0')
24-
expect(numberFormat.format('!@#$%^&*()')).toEqual('$0')
20+
expect(numberFormat.format('foo')).toEqual('')
21+
expect(numberFormat.format('-foo')).toEqual('')
22+
expect(numberFormat.format('-fo,o-')).toEqual('')
23+
expect(numberFormat.format('-fo.o-')).toEqual('')
24+
expect(numberFormat.format('!@#$%^&*()')).toEqual('')
2525
})
2626
it('should return as follows', () => {
2727
expect(numberFormat.clean().format('')).toEqual('')
28-
expect(numberFormat.clean().format('foo')).toEqual('$0')
29-
expect(numberFormat.clean().format('-foo')).toEqual('$0')
30-
expect(numberFormat.clean().format('-fo.o-')).toEqual('$0')
31-
expect(numberFormat.clean().format('-fo,o-')).toEqual('$0')
32-
expect(numberFormat.clean().format('!@#$%^&*()')).toEqual('$0')
28+
expect(numberFormat.clean().format('foo')).toEqual('')
29+
expect(numberFormat.clean().format('-foo')).toEqual('')
30+
expect(numberFormat.clean().format('-fo.o-')).toEqual('')
31+
expect(numberFormat.clean().format('-fo,o-')).toEqual('')
32+
expect(numberFormat.clean().format('!@#$%^&*()')).toEqual('')
3333
})
3434
it('should return as follows', () => {
3535
expect(numberFormat.unformat('')).toEqual('')
36-
expect(numberFormat.unformat('foo')).toEqual('0')
37-
expect(numberFormat.unformat('-foo')).toEqual('0')
38-
expect(numberFormat.unformat('-fo,o-')).toEqual('0')
39-
expect(numberFormat.unformat('!@#$%^&*()')).toEqual('0')
36+
expect(numberFormat.unformat('foo')).toEqual('')
37+
expect(numberFormat.unformat('-foo')).toEqual('')
38+
expect(numberFormat.unformat('-fo.o-')).toEqual('')
39+
expect(numberFormat.unformat('!@#$%^&*()')).toEqual('')
4040
})
4141
})
4242
describe('format when options are custom', () => {
@@ -53,18 +53,18 @@ describe('format when options are custom', () => {
5353
expect(numberFormat.format('0,10')).toEqual('$0,10')
5454
expect(numberFormat.format('0,0-')).toEqual('$0,0')
5555
expect(numberFormat.format('0,10-')).toEqual('-$0,10')
56-
expect(numberFormat.format('12.345,54921')).toEqual('$12.345,54')
56+
expect(numberFormat.format('12.345,54921')).toEqual('$12.345,55')
5757
expect(numberFormat.format('--12.345,12345')).toEqual('-$12.345,12')
58-
expect(numberFormat.format('12.345.54321,12945')).toEqual('$1.234.554.321,12')
58+
expect(numberFormat.format('12.345.54321,12945')).toEqual('$1.234.554.321,13')
5959
expect(numberFormat.format('-12.345,,54321-')).toEqual('-$12.345,54')
6060
})
6161
it('format numerical value', () => {
62-
expect(numberFormat.format(0)).toEqual('$0,00')
63-
expect(numberFormat.format(0.)).toEqual('$0,00')
64-
expect(numberFormat.format(0.0)).toEqual('$0,00')
65-
expect(numberFormat.format(-0.10)).toEqual('-$0,10')
66-
expect(numberFormat.format(-0.0)).toEqual('$0,00')
67-
expect(numberFormat.format(0.10)).toEqual('$0,10')
62+
expect(numberFormat.format(0)).toEqual('$0')
63+
expect(numberFormat.format(0.)).toEqual('$0')
64+
expect(numberFormat.format(0.0)).toEqual('$0')
65+
expect(numberFormat.format(-0.10)).toEqual('-$0,1')
66+
expect(numberFormat.format(-0.0)).toEqual('$0')
67+
expect(numberFormat.format(0.10)).toEqual('$0,1')
6868
expect(numberFormat.format(12345.54921)).toEqual('$12.345,55')
6969
expect(numberFormat.format(12345.12345)).toEqual('$12.345,12')
7070
expect(numberFormat.format(12345.54321)).toEqual('$12.345,54')
@@ -91,40 +91,28 @@ describe('unformat when options are default', () => {
9191
null_value: '',
9292
})
9393
it('unformat string value', () => {
94-
expect(numberFormat.unformat('0')).toEqual('0')
95-
expect(numberFormat.unformat('0,')).toEqual('0')
96-
expect(numberFormat.unformat('-0,0')).toEqual('0')
97-
expect(numberFormat.unformat('0,10')).toEqual('0.1')
98-
expect(numberFormat.unformat('0,0-')).toEqual('0')
99-
expect(numberFormat.unformat('0,10-')).toEqual('-0.1')
100-
expect(numberFormat.unformat('12.345,54921')).toEqual('12345.54')
101-
expect(numberFormat.unformat('--12.345,12345')).toEqual('-12345.12')
102-
expect(numberFormat.unformat('12.345.54321,12345')).toEqual('1234554321.12')
103-
expect(numberFormat.unformat('-12.345,,54321-')).toEqual('-12345.54')
94+
expect(numberFormat.unformat('0')).toEqual(0)
95+
expect(numberFormat.unformat('0,')).toEqual(0)
96+
expect(numberFormat.unformat('-0,0')).toEqual(0)
97+
expect(numberFormat.unformat('0,10')).toEqual(0.1)
98+
expect(numberFormat.unformat('0,0-')).toEqual(0)
99+
expect(numberFormat.unformat('0,10-')).toEqual(-0.1)
100+
expect(numberFormat.unformat('12.345,54921')).toEqual(12345.55)
101+
expect(numberFormat.unformat('--12.345,12345')).toEqual(-12345.12)
102+
expect(numberFormat.unformat('12.345.54321,12345')).toEqual(1234554321.12)
103+
expect(numberFormat.unformat('-12.345,,54321-')).toEqual(-12345.54)
104104
})
105105
it('unformat numerical value', () => {
106-
expect(numberFormat.unformat(0)).toEqual('0')
107-
expect(numberFormat.unformat(0.)).toEqual('0')
108-
expect(numberFormat.unformat(0.0)).toEqual('0')
109-
expect(numberFormat.unformat(-0.10)).toEqual('-0.1')
110-
expect(numberFormat.unformat(-0.0)).toEqual('0')
111-
expect(numberFormat.unformat(0.10)).toEqual('0.1')
112-
expect(numberFormat.unformat(12345.54921)).toEqual('12345.55')
113-
expect(numberFormat.unformat(12345.12345)).toEqual('12345.12')
114-
expect(numberFormat.unformat(12345.54321)).toEqual('12345.54')
115-
expect(numberFormat.unformat(12345.54321)).toEqual('12345.54')
116-
})
117-
it('unformat and clean numerical value', () => {
118-
expect(numberFormat.clean().unformat(0)).toEqual('0')
119-
expect(numberFormat.clean().unformat(0.)).toEqual('0')
120-
expect(numberFormat.clean().unformat(0.0)).toEqual('0')
121-
expect(numberFormat.clean().unformat(0.10)).toEqual('0.1')
122-
expect(numberFormat.clean().unformat(-0.0)).toEqual('0')
123-
expect(numberFormat.clean().unformat(-0.10)).toEqual('-0.1')
124-
expect(numberFormat.clean().unformat(12345.54921)).toEqual('12345.55')
125-
expect(numberFormat.clean().unformat(12345.12345)).toEqual('12345.12')
126-
expect(numberFormat.clean().unformat(12345.54321)).toEqual('12345.54')
127-
expect(numberFormat.clean().unformat(12345.54321)).toEqual('12345.54')
106+
expect(numberFormat.unformat(0)).toEqual(0)
107+
expect(numberFormat.unformat(0.)).toEqual(0)
108+
expect(numberFormat.unformat(0.0)).toEqual(0)
109+
expect(numberFormat.unformat(-0.10)).toEqual(-0.1)
110+
expect(numberFormat.unformat(-0.0)).toEqual(0)
111+
expect(numberFormat.unformat(0.10)).toEqual(0.1)
112+
expect(numberFormat.unformat(12345.54921)).toEqual(12345.55)
113+
expect(numberFormat.unformat(12345.12345)).toEqual(12345.12)
114+
expect(numberFormat.unformat(12345.54321)).toEqual(12345.54)
115+
expect(numberFormat.unformat(12345.54321)).toEqual(12345.54)
128116
})
129117
})
130118

tests/unit/number-format.default.spec.js

Lines changed: 39 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -7,24 +7,24 @@ describe('when the value is invalid with default config', () => {
77
const numberFormat = new NumberFormat({})
88
it('should return as follows', () => {
99
expect(numberFormat.format('')).toEqual(0)
10-
expect(numberFormat.format('foo')).toEqual('0')
11-
expect(numberFormat.format('-foo')).toEqual('0')
12-
expect(numberFormat.format('-fo,o-')).toEqual('0')
13-
expect(numberFormat.format('!@#$%^&*()')).toEqual('0')
10+
expect(numberFormat.format('foo')).toEqual(0)
11+
expect(numberFormat.format('-foo')).toEqual(0)
12+
expect(numberFormat.format('-fo,o-')).toEqual(0)
13+
expect(numberFormat.format('!@#$%^&*()')).toEqual(0)
1414
})
1515
it('should return as follows', () => {
1616
expect(numberFormat.clean().format('')).toEqual(0)
17-
expect(numberFormat.clean().format('foo')).toEqual('0')
18-
expect(numberFormat.clean().format('-foo')).toEqual('0')
19-
expect(numberFormat.clean().format('-fo,o-')).toEqual('0')
20-
expect(numberFormat.clean().format('!@#$%^&*()')).toEqual('0')
17+
expect(numberFormat.clean().format('foo')).toEqual(0)
18+
expect(numberFormat.clean().format('-foo')).toEqual(0)
19+
expect(numberFormat.clean().format('-fo,o-')).toEqual(0)
20+
expect(numberFormat.clean().format('!@#$%^&*()')).toEqual(0)
2121
})
2222
it('should return as follows', () => {
2323
expect(numberFormat.unformat('')).toEqual(0)
24-
expect(numberFormat.unformat('foo')).toEqual('0')
25-
expect(numberFormat.unformat('-foo')).toEqual('0')
26-
expect(numberFormat.unformat('-fo,o-')).toEqual('0')
27-
expect(numberFormat.unformat('!@#$%^&*()')).toEqual('0')
24+
expect(numberFormat.unformat('foo')).toEqual(0)
25+
expect(numberFormat.unformat('-foo')).toEqual(0)
26+
expect(numberFormat.unformat('-fo,o-')).toEqual(0)
27+
expect(numberFormat.unformat('!@#$%^&*()')).toEqual(0)
2828
})
2929
})
3030
describe('format when options are default', () => {
@@ -36,18 +36,18 @@ describe('format when options are default', () => {
3636
expect(numberFormat.format('0.10')).toEqual('0.10')
3737
expect(numberFormat.format('0.0-')).toEqual('0.0')
3838
expect(numberFormat.format('0.10-')).toEqual('-0.10')
39-
expect(numberFormat.format('12,345.54921')).toEqual('12,345.54')
39+
expect(numberFormat.format('12,345.54921')).toEqual('12,345.55')
4040
expect(numberFormat.format('--12,345.12345')).toEqual('-12,345.12')
4141
expect(numberFormat.format('12,345.54321.12345')).toEqual('12,345.54')
4242
expect(numberFormat.format('-12,345..54321-')).toEqual('-12,345.54')
4343
})
4444
it('format numerical value', () => {
45-
expect(numberFormat.format(0)).toEqual('0.00')
46-
expect(numberFormat.format(0.)).toEqual('0.00')
47-
expect(numberFormat.format(0.0)).toEqual('0.00')
48-
expect(numberFormat.format(-0.10)).toEqual('-0.10')
49-
expect(numberFormat.format(-0.0)).toEqual('0.00')
50-
expect(numberFormat.format(0.10)).toEqual('0.10')
45+
expect(numberFormat.format(0)).toEqual('0')
46+
expect(numberFormat.format(0.)).toEqual('0')
47+
expect(numberFormat.format(0.0)).toEqual('0')
48+
expect(numberFormat.format(-0.10)).toEqual('-0.1')
49+
expect(numberFormat.format(-0.0)).toEqual('0')
50+
expect(numberFormat.format(0.10)).toEqual('0.1')
5151
expect(numberFormat.format(12345.54921)).toEqual('12,345.55')
5252
expect(numberFormat.format(12345.12345)).toEqual('12,345.12')
5353
expect(numberFormat.format(12345.54321)).toEqual('12,345.54')
@@ -69,40 +69,28 @@ describe('format when options are default', () => {
6969
describe('unformat when options are default', () => {
7070
const numberFormat = new NumberFormat({})
7171
it('unformat string value', () => {
72-
expect(numberFormat.unformat('0')).toEqual('0')
73-
expect(numberFormat.unformat('0.')).toEqual('0')
74-
expect(numberFormat.unformat('-0.0')).toEqual('0')
75-
expect(numberFormat.unformat('0.10')).toEqual('0.1')
76-
expect(numberFormat.unformat('0.0-')).toEqual('0')
77-
expect(numberFormat.unformat('0.10-')).toEqual('-0.1')
78-
expect(numberFormat.unformat('12,345.54921')).toEqual('12345.54')
79-
expect(numberFormat.unformat('--12,345.12345')).toEqual('-12345.12')
80-
expect(numberFormat.unformat('12,345.54321.12345')).toEqual('12345.54')
81-
expect(numberFormat.unformat('-12,345..54321-')).toEqual('-12345.54')
72+
expect(numberFormat.unformat('0')).toEqual(0)
73+
expect(numberFormat.unformat('0.')).toEqual(0)
74+
expect(numberFormat.unformat('-0.0')).toEqual(0)
75+
expect(numberFormat.unformat('0.10')).toEqual(0.1)
76+
expect(numberFormat.unformat('0.0-')).toEqual(0)
77+
expect(numberFormat.unformat('0.10-')).toEqual(-0.1)
78+
expect(numberFormat.unformat('12,345.54921')).toEqual(12345.55)
79+
expect(numberFormat.unformat('--12,345.12345')).toEqual(-12345.12)
80+
expect(numberFormat.unformat('12,345.54321.12345')).toEqual(12345.54)
81+
expect(numberFormat.unformat('-12,345..54321-')).toEqual(-12345.54)
8282
})
8383
it('unformat numerical value', () => {
84-
expect(numberFormat.unformat(0)).toEqual('0')
85-
expect(numberFormat.unformat(0.)).toEqual('0')
86-
expect(numberFormat.unformat(0.0)).toEqual('0')
87-
expect(numberFormat.unformat(-0.10)).toEqual('-0.1')
88-
expect(numberFormat.unformat(-0.0)).toEqual('0')
89-
expect(numberFormat.unformat(0.10)).toEqual('0.1')
90-
expect(numberFormat.unformat(12345.54921)).toEqual('12345.55')
91-
expect(numberFormat.unformat(12345.12345)).toEqual('12345.12')
92-
expect(numberFormat.unformat(12345.54321)).toEqual('12345.54')
93-
expect(numberFormat.unformat(12345.54321)).toEqual('12345.54')
94-
})
95-
it('unformat and clean numerical value', () => {
96-
expect(numberFormat.clean().unformat(0)).toEqual('0')
97-
expect(numberFormat.clean().unformat(0.)).toEqual('0')
98-
expect(numberFormat.clean().unformat(0.0)).toEqual('0')
99-
expect(numberFormat.clean().unformat(0.10)).toEqual('0.1')
100-
expect(numberFormat.clean().unformat(-0.0)).toEqual('0')
101-
expect(numberFormat.clean().unformat(-0.10)).toEqual('-0.1')
102-
expect(numberFormat.clean().unformat(12345.54921)).toEqual('12345.55')
103-
expect(numberFormat.clean().unformat(12345.12345)).toEqual('12345.12')
104-
expect(numberFormat.clean().unformat(12345.54321)).toEqual('12345.54')
105-
expect(numberFormat.clean().unformat(12345.54321)).toEqual('12345.54')
84+
expect(numberFormat.unformat(0)).toEqual(0)
85+
expect(numberFormat.unformat(0.)).toEqual(0)
86+
expect(numberFormat.unformat(0.0)).toEqual(0)
87+
expect(numberFormat.unformat(-0.10)).toEqual(-0.1)
88+
expect(numberFormat.unformat(-0.0)).toEqual(0)
89+
expect(numberFormat.unformat(0.10)).toEqual(0.1)
90+
expect(numberFormat.unformat(12345.54921)).toEqual(12345.55)
91+
expect(numberFormat.unformat(12345.12345)).toEqual(12345.12)
92+
expect(numberFormat.unformat(12345.54321)).toEqual(12345.54)
93+
expect(numberFormat.unformat(12345.54321)).toEqual(12345.54)
10694
})
10795
})
10896

0 commit comments

Comments
 (0)