一道面试题引起的好奇:数字千分位
2018-02-27 11:16
295 查看
一道面试题引起的好奇:
题目:12000000.11 如何将浮点数小数点左边的数每三位加一个逗号,如12,000,000.11?
答案:
利用了字符串的replace方法及正则实现。
用前向声明和分组,第二个()从后往前匹配3位数字,即$2。每匹配到一个$2就在后面加上逗号,返回。
满足题目要求,但是实际中会存在数字不带小数点的情况,上面的实现方式就无法满足了。修改了一下,支持不带小数点的数字。
用前向声明和非前向声明,从后往前匹配3位数字,向前声明的地方替换成逗号,但是如果刚好是3的倍数位,会第一位前面也加,,所以前面要再来个非前向声明。
题目:12000000.11 如何将浮点数小数点左边的数每三位加一个逗号,如12,000,000.11?
答案:
function commafy(num){ return num && num.toString().replace(/(\d)(?=(\d{3})+\.)/g, function($1, $2){ return $2 + ','; }); } console.log(12000000.11) // 12,000,000.11 console.log(112000000.11) // 112,000,000.11 console.log(-112000000.11) // -112,000,000.11
利用了字符串的replace方法及正则实现。
用前向声明和分组,第二个()从后往前匹配3位数字,即$2。每匹配到一个$2就在后面加上逗号,返回。
满足题目要求,但是实际中会存在数字不带小数点的情况,上面的实现方式就无法满足了。修改了一下,支持不带小数点的数字。
用前向声明和非前向声明,从后往前匹配3位数字,向前声明的地方替换成逗号,但是如果刚好是3的倍数位,会第一位前面也加,,所以前面要再来个非前向声明。
// 数字千分位 function commafy (num) { if (isNaN(Number(num))) { return num } if (num && num.toString().indexOf('.') > 0) { return num.toString().replace(/(\d)(?=(\d{3})+\.)/g, ($0, $1) => { return $1 + ',' }) } else { return num && num.toString().replace(/(?=(?!(\b))(\d{3})+$)/g, ',') } }
console.log(12000000.11) // 12,000,000.11 console.log(112000000.11) // 112,000,000.11 console.log(-112000000.11) // -112,000,000.11
console.log(12000000) // 12,000,000 console.log(112000000) // 112,000,000 console.log(-112000000) // -112,000,000
相关文章推荐
- 一道面试题:求出这10000个数字中最大的500个
- 每日一道算法题:微软面试题:在排序数组中,找出给定数字出现的次数
- 一道C语言面试题——求最大连续数字子串
- 由一道面试题引起的疑问与思考
- 一道数字的面试题
- 一道面试题,一个五位数字ABCDE*4=EDCBA,这个五个数字不重复,请问A,B,C,D,E分别是几?
- 一道google面试题--自然数e中出现的连续的第一个10个数字组成的质数
- 由一道面试题引起的疑问与思考(ZT)
- 由一道面试题引起的疑问与思考
- 在德问上面看到的一道面试题:交换数字位置得到相对最大值
- 一道Javascript面试题,去除数组中的重复数字,大家看看我的做法是否正确
- 一道面试题 不用long的相关api将数字字符串转换成long
- 一道面试题(把数字货币表示转换为大写表示,如把123.45转换为壹百贰拾叁元肆角伍分 )
- 腾讯的一道面试题—不用除法求数字乘积
- 一道面试题,把excel的列的名称转换为数字
- 一道百度的面试题--写一个函数,对一个数字如(1000000),每隔3位添加一个','
- 一道面试题关于Integer的缓存范围(-128~127)所引起的一系列问题记录
- 一道面试题:1和2的数字序列
- 一道阿里多线程面试题的分析与应对
- 一道面试题