Skip to content

Commit

Permalink
add roundingMode, refactor precisionSetting, update deps
Browse files Browse the repository at this point in the history
  • Loading branch information
shrpne committed Jun 17, 2019
1 parent 49ef589 commit 5d71eae
Show file tree
Hide file tree
Showing 11 changed files with 3,144 additions and 6,536 deletions.
3 changes: 0 additions & 3 deletions .babelrc

This file was deleted.

2 changes: 2 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
## 0.3.0 - 2019-06-14
- **BREAKING** remove deprecated files and rounding methods
- **BREAKING** inner method `toPrecision` stop work with exponential notation
- **BREAKING** rename `rounding` option to `precisionSetting` and change it type from strings to enum numbers
- add `roundingMode` option

## 0.2.2 - 2018-12-13
- Fix backward compatibility: restore 'significant' rounding method name
Expand Down
71 changes: 52 additions & 19 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ Lightweight module to convert number to a pretty human readable string.
Includes:
- [from-exponential](https://github.com/shrpne/from-exponential) - remove exponential notation
- [thousands](https://github.com/scurker/thousands) - add thousands separators
- reducePrecision - reduce precision of a meaningful decimal part
- toPrecision - adjust precision of decimal part
- stripZeros - strip unnecessary leading and trailing zeros


Expand All @@ -25,60 +25,93 @@ npm install pretty-num
## Usage

```js
import prettyNum from 'pretty-num';
import prettyNum, {PRECISION_SETTING} from 'pretty-num';

prettyNum(12.123e-10); // => '0.0000000012123'
prettyNum(0.00123456, {precision: 3}); // => '0.00123'
prettyNum(0.00123456, {precision: 3}); // => '0.001'
prettyNum(0.00123456, {precision: 3, precisionSetting: PRECISION_SETTING.REDUCE_SIGNIFICANT}); // => '0.00123'
prettyNum(12345678.12345, {thousandsSeparator: ' '}); // => '12 345 678.12345'
prettyNum('00123456789.12300e-2', {precision: 3, thousandsSeparator: ' '}); // => '1 234 567.891'
```

### Options
## Options

#### thousandsSeparator
### `thousandsSeparator`
Defines the thousand grouping separator character

#### precision
### `precision`
Number of decimal digits to keep when rounding. Pass falsey value to not change precision.

#### rounding
Rounding types:
- `'reduce'` - reduce precision to specified number of decimal digits, strip unnecessary ending zeros.
### `precisionSetting`
How to work with precision:

#### Reduce
`1`, `REDUCE` (default) - reduce precision to specified number of decimal digits, strip unnecessary ending zeros;
```js
prettyNum(0.01023456, {precision: 3});
// => '0.01'
prettyNum(0.00001203456, {precision: 3});
// => '0'
```

- `'reduceSignificant'` - reduce precision to specified number of significant decimal digits, strip unnecessary ending zeros. Useful when rounding small values and they should not be rounded to 0
#### Reduce significant
`2`, `REDUCE_SIGNIFICANT` - reduce precision to specified number of significant decimal digits, strip unnecessary ending zeros. Useful when rounding small values and they should not be rounded to 0
```js
prettyNum(0.01023456, {precision: 3, rounding: 'significant'});
prettyNum(0.01023456, {precision: 3, precisionSetting: PRECISION_SETTING.REDUCE_SIGNIFICANT});
// => '0.0102'
prettyNum(0.00001203456, {precision: 3, rounding: 'significant'});
prettyNum(0.00001203456, {precision: 3, precisionSetting: PRECISION_SETTING.REDUCE_SIGNIFICANT});
// => '0.000012'
```

- `'fixed'` - reduce precision to specified number of decimal digits, pad with ending zeros.
#### Fixed
`3`, `FIXED` - set precision to specified number of decimal digits, pad with ending zeros if needed.
```js
prettyNum(0.01023456, {precision: 3, rounding: 'fixed'});
prettyNum(0.01023456, {precision: 3, precisionSetting: PRECISION_SETTING.FIXED});
// => '0.010'
prettyNum(0.00001203456, {precision: 3, rounding: 'fixed'});
prettyNum(0.00001203456, {precision: 3, precisionSetting: PRECISION_SETTING.FIXED});
// => '0.000'
```

- `'increase'` - pad with ending zeros to increase precision to specified number of decimal digits.
#### Increase
`4`, `INCREASE` - pad with ending zeros to increase precision to specified number of decimal digits.
```js
prettyNum(0.01, {precision: 4, rounding: 'increase'});
prettyNum(0.01, {precision: 4, precisionSetting: PRECISION_SETTING.INCREASE});
// => '0.0100'
prettyNum(12, {precision: 4, rounding: 'increase'});
prettyNum(12, {precision: 4, precisionSetting: PRECISION_SETTING.INCREASE});
// => '12.0000'
prettyNum(12.123456, {precision: 4, rounding: 'increase'});
prettyNum(12.123456, {precision: 4, precisionSetting: PRECISION_SETTING.INCREASE});
// => '12.123456'
```


### `roundingMode`
Specifies a rounding behavior for numerical operations capable of discarding precision. Following rounding modes are supported:

- `1`, `UP` - Rounding mode to round away from zero.
- `2`, `DOWN` - Rounding mode to round towards zero.
- `3`, `CEIL` - Rounding mode to round towards positive infinity.
- `4`, `FLOOR` - Rounding mode to round towards negative infinity.
- `5`, `HALF_UP` - Rounding mode to round towards "nearest neighbor" unless both neighbors are equidistant, in which case round up.
- `6`, `HALF_DOWN` - Rounding mode to round towards "nearest neighbor" unless both neighbors are equidistant, in which case round down.
- `7`, `HALF_EVEN` - Rounding mode to round towards the "nearest neighbor" unless both neighbors are equidistant, in which case, round towards the even neighbor.

Extensive description of the modes can be found at [Rounding Modes](https://docs.oracle.com/javase/8/docs/api/java/math/RoundingMode.html)

```js
prettyNum(123.657, {precision: 1, roundingMode: ROUNDING_MODE.DOWN}); // => "123.6"
prettyNum(123.657, {precision: 2, roundingMode: ROUNDING_MODE.CEIL}); // => "123.66"
```


## Comparison

- This module: [![Minified Size](https://img.shields.io/bundlephobia/min/pretty-num.svg?style=flat-square&label=minified)](https://bundlephobia.com/result?p=pretty-num) [![Minified Size](https://img.shields.io/bundlephobia/minzip/pretty-num.svg?style=flat-square&label=gzipped)](https://bundlephobia.com/result?p=pretty-num)
- [`js-big-decimal`](https://github.com/royNiladri/js-big-decimal): [![Minified Size](https://img.shields.io/bundlephobia/min/js-big-decimal.svg?style=flat-square&label=minified)](https://bundlephobia.com/result?p=js-big-decimal) [![Minified Size](https://img.shields.io/bundlephobia/minzip/js-big-decimal.svg?style=flat-square&label=gzipped)](https://bundlephobia.com/result?p=js-big-decimal) Math operations are supported, `REDUCE_SIGNIFICANT`, `FIXED` and `INCREASE` `precisionSetting` are not supported
- [`big.js`](https://github.com/MikeMcl/big.js): [![Minified Size](https://img.shields.io/bundlephobia/min/big.js.svg?style=flat-square&label=minified)](https://bundlephobia.com/result?p=big.js) [![Minified Size](https://img.shields.io/bundlephobia/minzip/big.js.svg?style=flat-square&label=gzipped)](https://bundlephobia.com/result?p=big.js) Math operations are supported, some `precisionSetting` are not supported, `CEIL`, `FLOOR` and `HALF_DOWN` `roundingMode` are not supported.

- [`bignumber.js`](https://github.com/MikeMcl/bignumber.js): [![Minified Size](https://img.shields.io/bundlephobia/min/bignumber.js.svg?style=flat-square&label=minified)](https://bundlephobia.com/result?p=bignumber.js) [![Minified Size](https://img.shields.io/bundlephobia/minzip/bignumber.js.svg?style=flat-square&label=gzipped)](https://bundlephobia.com/result?p=bignumber.js) Math operations are supported, more rounding modes are supported, some `precisionSetting` are not supported.



## License

Expand Down
3 changes: 3 additions & 0 deletions babel.config.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
module.exports = {
"presets": ["@babel/preset-env"],
};
Loading

0 comments on commit 5d71eae

Please sign in to comment.