Skip to content

Commit 6f853dd

Browse files
committed
feat(api): Support round method
1 parent 9200e1a commit 6f853dd

File tree

4 files changed

+38
-10
lines changed

4 files changed

+38
-10
lines changed

README.md

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,18 @@ n.toNumerals()
7676
]
7777
```
7878

79+
#### Numerals.round
80+
- round: : (base: JpNumeralUnit) => Numerals
81+
82+
```ts
83+
import {numerals} from 'jp-numerals';
84+
const n = numerals(12_3456_7890)
85+
86+
n.round(JpNumeralUnit.億).toString()
87+
// => returns
88+
'12億'
89+
90+
```
7991

8092
#### Signed methods
8193

__tests__/jp-numerals.ts

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -145,4 +145,15 @@ describe('jpNumerals', () => {
145145
expect(nBase.toString()).toEqual(n.toString())
146146
expect(nBase.toNumber()).toEqual(1234560000)
147147
})
148+
149+
it('can round number with specified unit', () => {
150+
const positive = numerals(12_3456_7890)
151+
const negative = numerals(-9999_9999_9999)
152+
153+
expect(positive.round(JpNumeralUnit.).toString()).toEqual('12億3457万')
154+
expect(positive.round(JpNumeralUnit.).toString()).toEqual('12億')
155+
156+
expect(negative.round(JpNumeralUnit.).toSignedString()).toEqual('-1兆')
157+
expect(negative.round(JpNumeralUnit.).toSignedString()).toEqual('-1兆')
158+
})
148159
})

src/jp-numerals.ts

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ export { JpNumeralUnit, NumeralObj, Numerals, Sign }
33

44
const EPSILON = 1e-10
55
const log10 = (v: number) => Math.log(v) / Math.log(10)
6+
// for IE
67

78
export class Numeral {
89
raw: number
@@ -67,24 +68,26 @@ export const numerals = (n: number, base: JpNumeralUnit = JpNumeralUnit.零): Nu
6768
const unitLen = Object.keys(JpNumeralUnit).length / 2 // maximum unit
6869
const numberLen = Math.ceil(log10(abs) / 4 + EPSILON)
6970
const len = Math.min(unitLen, numberLen)
70-
const numerals = new Array(len)
71+
const nums = new Array(len)
7172
.fill(NaN)
7273
.map((_, i) => (i === 0 ? new NumeralZero(i, abs) : new Numeral(i, abs)))
7374
.reverse()
7475

7576
return {
76-
toNumerals: () => numerals,
77-
toTuples: () => numerals.map(numeral => numeral.toTuple()),
78-
toNumeralObjs: () => numerals.map(numeral => numeral.toNumeralObj()),
79-
toString: () => numerals.reduce((s, numeral) => `${s}${numeral}`, ''),
77+
toNumerals: () => nums,
78+
toTuples: () => nums.map(numeral => numeral.toTuple()),
79+
toNumeralObjs: () => nums.map(numeral => numeral.toNumeralObj()),
80+
toString: () => nums.reduce((s, numeral) => `${s}${numeral}`, ''),
8081
toAbsNumber: () => abs,
8182

8283
sign: () => sign,
83-
toSignedNumerals: () => [sign, numerals],
84-
toSignedTuples: () => [sign, numerals.map(numeral => numeral.toTuple())],
85-
toSignedNumeralObjs: () => [sign, numerals.map(numeral => numeral.toNumeralObj())],
86-
toSignedString: () => numerals.reduce((s, numeral) => `${s}${numeral}`, sign === -1 ? '-' : ''),
87-
toNumber: () => sign * abs
84+
toSignedNumerals: () => [sign, nums],
85+
toSignedTuples: () => [sign, nums.map(numeral => numeral.toTuple())],
86+
toSignedNumeralObjs: () => [sign, nums.map(numeral => numeral.toNumeralObj())],
87+
toSignedString: () => nums.reduce((s, numeral) => `${s}${numeral}`, sign === -1 ? '-' : ''),
88+
toNumber: () => sign * abs,
89+
90+
round: (base: JpNumeralUnit) => numerals(sign * Math.round(abs / Math.pow(10, base * 4)), base)
8891
}
8992
}
9093

src/type.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,8 @@ export interface Numerals {
4242
toSignedNumeralObjs: () => [Sign, NumeralObj[]]
4343
toSignedString: () => string
4444
toNumber: () => number
45+
46+
round: (base: JpNumeralUnit) => Numerals
4547
}
4648

4749
export type Sign = -1 | 1

0 commit comments

Comments
 (0)