前端开发中经常会碰到用 JavaScript?格式化数字,最最常见的是格式化金额,一般格式化金额需要千分位分隔,保留2位小数等等。
简单的功能函数
类似的代码网上有很多:
/** * 将数值四舍五入(保留2位小数)后格式化成金额形式 * * @param num 数值(Number或者String) * @return 金额格式的字符串,如'1,234,567.45' * @type String */ function formatCurrency(num) { num = num.toString().replace(/\$|\,/g,''); if(isNaN(num)) num = "0"; sign = (num == (num = Math.abs(num))); num = Math.floor(num*100+0.50000000001); cents = num%100; num = Math.floor(num/100).toString(); if(cents<10) cents = "0" + cents; for (var i = 0; i < Math.floor((num.length-(1+i))/3); i++) num = num.substring(0,num.length-(4*i+3))+','+ num.substring(num.length-(4*i+3)); return (((sign)?'':'-') + num + '.' + cents); }
或者
function fmoney(s, n) { /* * 参数说明: * s:要格式化的数字 * n:保留几位小数 * */ n = n > 0 && n <= 20 ? n : 2; s = parseFloat((s + "").replace(/[^\d\.-]/g, "")).toFixed(n) + ""; var l = s.split(".")[0].split("").reverse(), r = s.split(".")[1]; t = ""; for (i = 0; i < l.length; i++) { t += l[i] + ((i + 1) % 3 == 0 && (i + 1) != l.length ? "," : ""); } return t.split("").reverse().join("") + "." + r; } //调用 fmoney(9.7,2);//9.70 fmoney('12345.675910', 3);//12,345.676
更加完善的功能函数
这些代码基本能很好的运行。不过关系到经济利益的时候,还要考虑舍去或者舍入几厘。大家懂的,每个用户几厘钱可能带来巨大的经济收益。就比如说收手续费,如果一笔手续费计算出来是 3.4521 元,精确到分一般都会收 3.46 元。当然如果是付出去,那可能就是直接舍去了,一般会计算为 3.45 元。
以前收集过类似方法,不过在使用的时候会有BUG,JS 浮点型计算的精度问题。所以抽时间修复了一下:
function number_format(number, decimals, dec_point, thousands_sep,roundtag) { /* * 参数说明: * number:要格式化的数字 * decimals:保留几位小数 * dec_point:小数点符号 * thousands_sep:千分位符号 * roundtag:舍入参数,默认 "ceil" 向上取,"floor"向下取,"round" 四舍五入 * */ number = (number + '').replace(/[^0-9+-Ee.]/g, ''); roundtag = roundtag || "ceil"; //"ceil","floor","round" var n = !isFinite(+number) ? 0 : +number, prec = !isFinite(+decimals) ? 0 : Math.abs(decimals), sep = (typeof thousands_sep === 'undefined') ? ',' : thousands_sep, dec = (typeof dec_point === 'undefined') ? '.' : dec_point, s = '', toFixedFix = function (n, prec) { var k = Math.pow(10, prec); console.log(); return '' + parseFloat(Math[roundtag](parseFloat((n * k).toFixed(prec*2))).toFixed(prec*2)) / k; }; s = (prec ? toFixedFix(n, prec) : '' + Math.round(n)).split('.'); var re = /(-?\d+)(\d{3})/; while (re.test(s[0])) { s[0] = s[0].replace(re, "$1" + sep + "$2"); } if ((s[1] || '').length < prec) { s[1] = s[1] || ''; s[1] += new Array(prec - s[1].length + 1).join('0'); } return s.join(dec); } console.log(number_format(2, 2, ".", ","))//"2.00" console.log(number_format(3.7, 2, ".", ","))//"3.70" console.log(number_format(3, 0, ".", ",")) //"3" console.log(number_format(9.0312, 2, ".", ","))//"9.03" console.log(number_format(9.00, 2, ".", ","))//"9.00" console.log(number_format(39.715001, 2, ".", ",", "floor")) //"39.71" console.log(number_format(9.7, 2, ".", ","))//"9.70" console.log(number_format(39.7, 2, ".", ","))//"39.70" console.log(number_format(9.70001, 2, ".", ","))//"9.71" console.log(number_format(39.70001, 2, ".", ","))//"39.71" console.log(number_format(9996.03, 2, ".", ","))//"9996.03" console.log(number_format(1.797, 3, ".", ",", "floor"))//"1.797"
参数有点多,你可以根据你自己的需求去修改。
推荐的类库 Numeral.js 和 accounting.js
Numeral.js
一个用于格式化和操作数字的JavaScript库。数字可以被格式化为货币,百分比,时间,几个小数位数,千分位等等。 您也可以随时创建自定义格式。
官网及文档:http://numeraljs.com/
GitHub:https://github.com/adamwdraper/Numeral-js
accounting.js
一个轻量级的JavaScript库,用于格式化数字,金额和货币等。
官网及文档:http://openexchangerates.github.io/accounting.js/
GitHub:accounting.js
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持小牛知识库。
问题内容: 如何将matchpercent的结果四舍五入到小数点后两位(%)?我正在使用以下方法返回一些结果: 问题答案: 转换/转换结果: …这里的数字足够大,不能截断小数点左边。也就是说,如果使用“ 123.456”,则由于总长度为7位,因此需要使用DECIMAL(7,2)。
本文向大家介绍angular 实现的输入框数字千分位及保留几位小数点功能示例,包括了angular 实现的输入框数字千分位及保留几位小数点功能示例的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了angular 实现的输入框数字千分位及保留几位小数点功能。分享给大家供大家参考,具体如下: 网上查到一个关于千分位的指令,我稍微做了点完善,通用指令代码 html代码的引用,digits传的是小数
问题内容: 在JavaScript中,将数字四舍五入到N个小数位的典型方法是: 但是,这种方法 最多 可以舍入到N个小数位,而我想 始终 舍入到N个小数位。例如,“ 2.0”将四舍五入为“ 2”。 有任何想法吗? 问题答案: 这不是一个四舍五入的问题,而是一个显示问题。数字不包含有关有效数字的信息;值2与2.0000000000000相同。当您将舍入后的值转换为字符串时,就可以使其显示一定数量的数
我想把一个数字四舍五入到小数点后2位,但也保留后面的2个零,例如425.1382到425.1400,我在下面的例子中尝试过,但它似乎不起作用 或
使用 toLocaleString() 将浮点数转换为 Decimal mark 格式。 将整数部分转化为用逗号分隔的字符串。 const toDecimalMark = num => num.toLocaleString('en-US'); toDecimalMark(12305030388.9087); // "12,305,030,388.909"
问题内容: 我需要将PHP中的小数点四舍五入到小数点后两位,以便: 变成… 我已经尝试过 number_format ,但这只是将值 舍 入到 49.96 。我不能使用 substr, 因为该数字可能较小(例如7.950)。到目前为止,我一直无法找到答案。 任何帮助,不胜感激。 问题答案: 这可以工作: