想偷懒的话,toLocaleString 了解一下?

hello~亲爱的看官老爷们你们好~最近沉迷于学习其余语言,有一段时间没写文章了。时间一晃就到了4月,再不写就怕完全懒下去了。此次给你们分享 toLocaleString 的一点技巧,若是须要初始化数字或日期时,不妨考虑一下,会有偷懒奇效哦!git

注意!通常而言,数字与日期的显示是有要求的,样式方面须要统一。但若是是内部项目或者是 pm 容许,那么使用 toLocaleString 格式化数字与日期是至关好的,否则仍是建议本身写正则或函数转换。毕竟每一个 API 都有局限性。面试

本文参考自 MDN 的文档与平常使用所得,若是你对这个 API 已经至关熟悉,请帮我看下是否有遗漏(笑);不了解的同窗能够浏览一下,应该会对你有所帮助。浏览器

概述

toLocaleString 方法是用于返回格式化对象后的字符串,该字符串格式因不一样语言而不一样。能够经过传参决定返回的语言与具体的表现,某些场景下至关有用,语法以下:ide

object.toLocaleString([locales [, options]]);
复制代码

locales 参数用于指定格式化对象时使用的语言环境,默认为当前环境的语言,能够不传。该参数具体可选的值能够参考 这里,通常而言使用 enzh 便可应付绝大多数状况。例子以下:函数

const date = new Date();
date.toLocaleString('zh');    // 2018/4/4 下午15:08:38
date.toLocaleString('en');    // 4/4/2018, 3:08:38 PM
复制代码

顺带一提,此参数大小写不敏感,已经在浏览器与 Node 验证过。学习

options 参数为输出样式的配置项,根据 object 类型不一样会有不一样选项,下文会仔细解释这个参数。但须要注意的是若是不传 locales 参数,那么 options 参数是不会生效的,其实上面的语法其实已经显现出这点。spa

最后则是兼容性问题,具体以下图:prototype

使用参数的状况下兼容性稍差,这比较惋惜,但整体而言仍是比较乐观的。翻译

Number.prototype.toLocaleString

先介绍 toLocaleString 在数字类型上的使用。面试偶尔会问到如何格式化数字,使整数部分每三位加一个逗号,这时不妨:code

const num = 2333333;
num.toLocaleString();   // 2,333,333
复制代码

实际上是不须要任何正则的~打完出题者的脸后,咱们一块儿看看 toLocaleString 在数字类型的 options 参数有好用属性,以方便咱们偷懒使用。注意,本文不是翻译文档,于是只会介绍一些经常使用的属性,更具体的选项请查阅 MDN相关文档。

style 表示格式化时使用的样式,默认值是 decimal 也就是纯数字,也可为 percent 百分比显示与 currency 货币显示。值为 currency 时必须同时指定 options 中的 currency 属性,不然报错。具体例子以下:

const num = 2333333;
num.toLocaleString('zh', { style: 'decimal' });   //2,333,333
num.toLocaleString('zh', { style: 'percent' });   //233,333,300%
num.toLocaleString('zh', { style: 'currency' });    //报错
复制代码

接下来的两个属性是 style 设为 currency 时才有用的,它们分别是 currencycurrencyDisplay,前者指定对应的货币,如 USDEURCNY 等,实测也是不区分大小写的。后者是货币符号的展现样式,默认值是 symbol,即对应的符号,如 CNY 是 ¥。该属性的值也能够是 codename,只是用得比较少,看看例子就行了~具体以下:

const num = 2333333;
num.toLocaleString('zh', { style: 'currency', currency: 'CNY' });    //¥2,333,333.00
num.toLocaleString('zh', { style: 'currency', currency: 'cny', currencyDisplay: 'code' });      //CNY2,333,333.00
num.toLocaleString('zh', { style: 'currency', currency: 'cny', currencyDisplay: 'name' });      //2,333,333.00人民币
复制代码

最后是两组至关强大的属性,某些场景下能带来极大的便利。第一组是 minimumIntegerDigitsminimumFractionDigitsmaximumFractionDigits,用于指定整数最少位数与小数的最少和最多位数,不够则用0去凑。简单说,自动补0!具体例子以下:

let num = 2333.3;
num.toLocaleString('zh', { minimumIntegerDigits: 5 });        //02,333.3
//若是不想有分隔符,能够指定useGrouping为false
num.toLocaleString('zh', { minimumIntegerDigits: 5, useGrouping: false });        //02333.3
num.toLocaleString('zh', { minimumFractionDigits: 2, useGrouping: false });     //2333.30

num = 666.666
num.toLocaleString('zh', { maximumFractionDigits: 2, useGrouping: false });     //666.67
复制代码

今后以后,补0与控制位数不再愁~

另外一组是 minimumSignificantDigitsmaximumSignificantDigits,用于控制有效数字位数,只要设置了这一组属性,第一组属性所有忽略不算,具体以下:

const num = 1234.5;
num.toLocaleString('zh', { minimumSignificantDigits: 6, useGrouping: false });      //1234.50
num.toLocaleString('zh', { maximumSignificantDigits: 4, useGrouping: false });      //1235
复制代码

注意,maximumFractionDigitsmaximumSignificantDigits 均是四舍五入,使用时须要注意。数字类型的 toLocaleString 介绍就告一段落,下面让咱们看看日期类型的 toLocaleStringoptions 有什么好用的属性。

Date.prototype.toLocaleString

与数字类型不一样,日期类型的 locales 对输出的影响十分之大(其实数字类型影响也大,只是通常用不到),于是应该根据实际状况选择合适的语言环境。与数字类型同样,只介绍经常使用属性,详细的属性介绍请查阅MDN文档。

hour12 表示是使用十二小时制仍是二十四小时制,默认值视 locales 而定。例子以下:

const date = new Date();
date.toLocaleString('zh', { hour12: true });        //2018/4/4 下午6:57:36
date.toLocaleString('zh', { hour12: false });       //2018/4/4 18:57:36
复制代码

以后就是格式化年月日时分秒星期等选项了,MDN 文档说必须按照必定的分组设置属性,实际使用中发现每一个属性单独使用并不报错,于是按属性的值分开介绍会比较好理解。

具体的属性一共有 9 个,分别是 weekdayerayearmonthdayhourminutesecondtimeZoneName。具体的意思,看单词估计就能秒懂,不做过多解释。然而须要留意的是他们的可选值。先讨论weekdayera,它们都可以取值为 narrowshortlong,简单说就是能有多短多短,缩写与正常表现,具体表现以下:

const date = new Date();
date.toLocaleString('en', { weekday: 'narrow', era: 'narrow' });        //W A
date.toLocaleString('en', { weekday: 'short', era: 'short' });      //Wed AD
date.toLocaleString('en', { weekday: 'long', era: 'long' });        //Wednesday Anno Domini
复制代码

跟着是 timeZoneName 属性,这个属性只有shortlong 两个值,表现以下:

const date = new Date();
date.toLocaleString('zh', { timeZoneName: 'short' });   //2018/4/5 GMT+8 下午7:18:26
date.toLocaleString('zh', { timeZoneName: 'long' });    //2018/4/5 中国标准时间 下午7:18:26
复制代码

剩下的属性,都可以取值为 numeric2-digit,简单说就是否仅用两位数字表示,看码说话:

const date = new Date();
date.toLocaleString('zh', { year: 'numeric',  month: 'numeric',  day: 'numeric',  hour: 'numeric',  minute: 'numeric',  second: 'numeric', });   //2018/4/5 下午7:30:17
date.toLocaleString('zh', { year: '2-digit',  month: '2-digit',  day: '2-digit',  hour: '2-digit',  minute: '2-digit',  second: '2-digit'  });   //18/04/05 下午7:30:17
复制代码

(比较奇怪的是 hourminutesecond 三个属性,不管设置为什么值,表现都是同样的,但愿有大佬告知缘由,我换成 en 环境也是同样的。)

最后是 month 这个属性,语言对月份有不一样的展示,除去 numeric2-digit 外,它额外多三个属性,分别是 narrowshortlong。展现以下:

const date = new Date();
date.toLocaleString('en', { month: 'narrow' });     //A
date.toLocaleString('en', { month: 'short' });     //Apr
date.toLocaleString('en', { month: 'long' });     //April
复制代码

小结

至此,关于 toLocaleString 的介绍就暂告一段落了。能够看到,在某些场景下须要格式化对象成字符串时,能够发挥极大的做用,再也不须要本身苦兮兮地写函数作转换。尽管这个 API 稍微冷门一点,但仍是颇有意思的。

感谢各位看官大人看到这里,知易行难,但愿本文对你有所帮助~谢谢!