使用BigNumber.js的toFixed, toFormat方法进行格式化

2,344 阅读3分钟

P.S.

  1. 本文基于BigNumber.js文档,增加了个人的理解。
  2. 代码可以在BigNumber.js文档的控制台中测试。

定点表示法

定点表示法在整数位和分数位之间有一个小数点,类似于普通十进制数的整数和分数数字之间的小数点。

toFixed

参数

.toFixed([dp [, rm]]) ⇒ string

dp

整数。允许的范围为 [0 , 1e+9]

rm

整数。允许的范围为 [0 , 8]

说明

toFixed方法返回一个字符串,该字符串以正常(定点)表示法表示此 BigNumber 的值,使用 rm 指定的舍入模式舍入到 dp 指定的小数位。例如:

x = 66.666
y = new BigNumber(x)
y.toFixed(0)                    // '67'
y.toFixed(1)                    // '66.7'
y.toFixed(3)                    // '66.666'
y.toFixed(5)                    // '66.66600'

如果调用toFixed方法的BigNumber实例在正常表示法中的分数位小于参数 dp 指定的小数位,则返回值将相应地附加零到 dp 指定的小数位。如上面代码块中的y.toFixed(5) // '66.66600'

使用 Number.prototype.toFixed 时,如果一个数字大于或等于 10^21,会按照指数表示法返回值。然而此方法与之不同,始终按照普通(定点)表示法返回值。

如果不传入参数 dp 或者向 dp 传入 null 或 undefined,则返回值将不舍入,并采用正常(定位)表示法。这也不同于 Number.prototype.toFixed ,后者将舍入到个位。例如:

x = 66.666
y = new BigNumber(x)
x.toFixed()                     // '67' 舍入到个位
y.toFixed()                     // '66.666' 不舍入

如果省略参数 rm ,亦或传入的 rm 是 null 或 undefined,则使用 ROUNDING_MODE 进行舍入。例如:

x = 66.666
y = new BigNumber(x)
y.toFixed(1)                     // '67.7' 使用默认的ROUNDING_MODE,即 4 (ROUND_HALF_UP)
y.toFixed(1, 1)                  // '66.6' 使用指定的ROUNDING_MODE,即 1 (ROUND_DOWN)

如果参数 dprm 不符合规范,则会抛出错误。请参阅文档中 错误 部分。

实践✨

Q: 怎样将一个浮点数截取到指定小数位x?

A: 使用BigNumber.toFixed(x, 1)BigNumber.toFixed(x, 3)

toFormat

参数

.toFormat([dp [, rm[, format]]]) ⇒ string

dp

整数。允许的范围为 [0 , 1e+9]

rm

整数。允许的范围为 [0 , 8]

format

对象。参阅 FORMAT。默认值如下:

{
    prefix: '',                            // 加在返回值前的字符串
    decimalSeparator: '.',                 // 分隔整数部分和小数部分的符号
    groupSeparator: ',',                   // 整数部分内部每一组之间的分隔符号
    groupSize: 3,                          // 整数部分内部每一主要组的字符数
    secondaryGroupSize: 0,                 // 整数部分内部每一次要组的字符数
    fractionGroupSeparator: ' ',           // 小数部分内部每一组之间的分隔符号
    fractionGroupSize: 0,                  // 小数部分内部每一组的字符数
    suffix: ''                             // 加在返回值后的字符串
  }

说明

toFormat可以看作增加了format参数的toFixed。

默认的 fractionGroupSeparator 没有显示出效果是因为默认的 fractionGroupSize 为0,修改 fractionGroupSize 后就会看见默认的 fractionGroupSeparator 的效果。例如:

const fmt = {
  prefix: '',
  decimalSeparator: '.',
  groupSeparator: ',',
  groupSize: 3,
  secondaryGroupSize: 0,
  fractionGroupSeparator: ' ',
  fractionGroupSize: 0,
  suffix: ''
}
const x = new BigNumber('123456789.123456789')
BigNumber.config({ FORMAT: fmt })
x.toFormat()                                     // '123,456,789.123456789'
fmt.fractionGroupSize = 5
x.toFormat()                                     // '123,456,789.12345 6789' 

上面的代码也说明只要传入 FORMAT 的对象的引用仍然保留着,对传入对象的修改会立即作用于BigNumber的格式。

实践✨

Q: 怎样在一个BigNumber实例的整数部分中每三位插入一个逗号?

A: 直接使用BigNumber.toFormat(),默认的 groupSeparatorgroupSize 已满足需求。