Skip to content

Commit f69a36d

Browse files
committed
feat(useToNumber): new function
1 parent cc8658a commit f69a36d

File tree

4 files changed

+108
-1
lines changed

4 files changed

+108
-1
lines changed
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
---
2+
category: Utilities
3+
---
4+
5+
# useToNumber
6+
7+
Reactively convert a string ref to number.
8+
9+
## Usage
10+
11+
```ts
12+
import { useToNumber } from '@vueuse/core'
13+
14+
const str = ref('123')
15+
const number = useToNumber(str)
16+
17+
number.value // 123
18+
```
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
import { ref } from 'vue-demi'
2+
import { useToNumber } from '.'
3+
4+
describe('useToNumber', () => {
5+
it('default', () => {
6+
const value = ref<string | number>('123.345')
7+
const float = useToNumber(value)
8+
const int = useToNumber(value, { method: 'parseInt' })
9+
10+
expect(float.value).toBe(123.345)
11+
expect(int.value).toBe(123)
12+
13+
value.value = 'hi'
14+
15+
expect(float.value).toBe(NaN)
16+
expect(int.value).toBe(NaN)
17+
18+
value.value = 123.4
19+
20+
expect(float.value).toBe(123.4)
21+
expect(int.value).toBe(123.4)
22+
23+
value.value = '-43.53'
24+
25+
expect(float.value).toBe(-43.53)
26+
expect(int.value).toBe(-43)
27+
})
28+
29+
it('radix', () => {
30+
const value = ref<string | number>('0xFA')
31+
const int = useToNumber(value, { method: 'parseInt', radix: 16 })
32+
33+
expect(int.value).toBe(250)
34+
})
35+
36+
it('nanToZero', () => {
37+
const value = ref<string | number>('Hi')
38+
const float = useToNumber(value, { nanToZero: true })
39+
expect(float.value).toBe(0)
40+
})
41+
})
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
import type { ComputedRef } from 'vue-demi'
2+
import { computed } from 'vue-demi'
3+
import { resolveUnref } from '../resolveUnref'
4+
import type { MaybeComputedRef } from '../utils'
5+
6+
export interface UseToNumberOptions {
7+
/**
8+
* Method to use to convert the value to a number.
9+
*
10+
* @default 'parseFloat'
11+
*/
12+
method?: 'parseFloat' | 'parseInt'
13+
14+
/**
15+
* The base in mathematical numeral systems passed to `parseInt`.
16+
* Only works with `method: 'parseInt'`
17+
*/
18+
radix?: number
19+
20+
/**
21+
* Replace NaN with zero
22+
*
23+
* @default false
24+
*/
25+
nanToZero?: boolean
26+
}
27+
28+
/**
29+
* Computed reactive object.
30+
*/
31+
export function useToNumber(
32+
value: MaybeComputedRef<number | string>,
33+
options: UseToNumberOptions = {},
34+
): ComputedRef<number> {
35+
const {
36+
method = 'parseFloat',
37+
radix,
38+
nanToZero,
39+
} = options
40+
41+
return computed(() => {
42+
let resolved = resolveUnref(value)
43+
if (typeof resolved === 'string')
44+
resolved = Number[method](resolved, radix)
45+
if (nanToZero && isNaN(resolved))
46+
resolved = 0
47+
return resolved
48+
})
49+
}

tsconfig.json

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,6 @@
4242
],
4343
"exclude": [
4444
"node_modules",
45-
"**/**/*.stories.tsx",
4645
"**/**/*.md",
4746
"**/dist",
4847
"packages/.test",

0 commit comments

Comments
 (0)