在JavaScript中格式化数字,类似于C#
是否有一种简单的方法来格式化JavaScript中的数字,类似于通过ToString("format_provider")
或String.Format()
在C#(或VB.NET)中可用的格式化方法?
你应该看看JQuery的NUMBERFORMATTER插件:
jquery数字格式化程序
而这个问题:
Javascript更简单的方式来格式化数字
通常
- 在JavaScript中格式化数字
- 格式化货币显示的数字和更多。
在jQuery中
- autoNumeric (一个体面的数字格式和输入助手与区域支持jQuery 1.5+)
- jQuery格式 (Java SimpleDateFormat和NumberFormat的客户端实现)
- jquery-numberformatter(支持语言环境的数字格式化程序)
是的,肯定有一种方法可以在JavaScript中正确格式化数字,例如:
var val=2489.8237 val.toFixed(3) //returns 2489.824 (round up) val.toFixed(2) //returns 2489.82 val.toFixed(7) //returns 2489.8237000 (padding)
随着变量名的使用。 toFixed 。
还有另一个功能是toPrecision()
。 欲了解更多详情,你也可以访问
http://raovishal.blogspot.com/2012/01/number-format-in-javascript.html
这里有一个简单的JS函数来将逗号加到字符串格式的整数中。 它将处理整数或十进制数字。 您可以传递一个数字或一个字符串。 它显然返回一个字符串。
function addCommas(str) { var parts = (str + "").split("."), main = parts[0], len = main.length, output = "", first = main.charAt(0), i; if (first === '-') { main = main.slice(1); len = main.length; } else { first = ""; } i = len - 1; while(i >= 0) { output = main.charAt(i) + output; if ((len - i) % 3 === 0 && i > 0) { output = "," + output; } --i; } // put sign back output = first + output; // put decimal part back if (parts.length > 1) { output += "." + parts[1]; } return output; }
这里有一组测试用例: http : //jsfiddle.net/jfriend00/6y57j/
你可以看到它在以前的jsFiddle中使用: http : //jsfiddle.net/jfriend00/sMnjT/ 。 你可以通过简单的Google搜索“javascript add commas”找到处理十进制数的函数。
将数字转换为字符串可以通过多种方式来完成。 最简单的就是把它添加到一个字符串:
var myNumber = 3; var myStr = "" + myNumber; // "3"
在你的jsFiddle的上下文中,你可以通过改变这一行来得到逗号:
jTarget.text(current);
对此:
jTarget.text(addCommas(current));
你可以看到它在这里工作: http : //jsfiddle.net/jfriend00/CbjSX/
我写了一个简单的函数(还不是另一个需要的jQuery插件!!),它将数字转换为十进制分隔的字符串或空字符串,如果数字不是以数字开头:
function format(x) { return isNaN(x)?"":x.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ","); }
format(578999);
结果在578,999
format(10);
结果10
如果你想有一个小数点而不是一个逗号,只需用小数点替换代码中的逗号。
其中一个正确的说明这只适用于整数,有一些小的适应,你可以使它的浮点工作:
function format(x) { if(isNaN(x))return ""; n= x.toString().split('.'); return n[0].replace(/\B(?=(\d{3})+(?!\d))/g, ",")+(n.length>1?"."+n[1]:""); }
这里有一些解决方案,全部通过测试套件,测试套件和基准包括,如果你想复制和粘贴测试,请试试这个要点 。
方法0(RegExp)
基于https://stackoverflow.com/a/14428340/1877620 ,但修复如果没有小数点。
if (typeof Number.prototype.format === 'undefined') { Number.prototype.format = function (precision) { if (!isFinite(this)) { return this.toString(); } var a = this.toFixed(precision).split('.'); a[0] = a[0].replace(/\d(?=(\d{3})+$)/g, '$&,'); return a.join('.'); } }
方法1
if (typeof Number.prototype.format1 === 'undefined') { Number.prototype.format1 = function (precision) { if (!isFinite(this)) { return this.toString(); } var a = this.toFixed(precision).split('.'), // skip the '-' sign head = Number(this < 0); // skip the digits that's before the first thousands separator head += (a[0].length - head) % 3 || 3; a[0] = a[0].slice(0, head) + a[0].slice(head).replace(/\d{3}/g, ',$&'); return a.join('.'); }; }
方法2(拆分到数组)
if (typeof Number.prototype.format2 === 'undefined') { Number.prototype.format2 = function (precision) { if (!isFinite(this)) { return this.toString(); } var a = this.toFixed(precision).split('.'); a[0] = a[0] .split('').reverse().join('') .replace(/\d{3}(?=\d)/g, '$&,') .split('').reverse().join(''); return a.join('.'); }; }
方法3(循环)
if (typeof Number.prototype.format3 === 'undefined') { Number.prototype.format3 = function (precision) { if (!isFinite(this)) { return this.toString(); } var a = this.toFixed(precision).split(''); a.push('.'); var i = a.indexOf('.') - 3; while (i > 0 && a[i-1] !== '-') { a.splice(i, 0, ','); i -= 3; } a.pop(); return a.join(''); }; }
例
console.log('======== Demo ========') var n = 0; for (var i=1; i<20; i++) { n = (n * 10) + (i % 10)/100; console.log(n.format(2), (-n).format(2)); }
分隔器
如果我们想要自定义千位分隔符或小数点分隔符,请使用replace():
123456.78.format(2).replace(',', ' ').replace('.', ' ');
测试套件
function assertEqual(a, b) { if (a !== b) { throw a + ' !== ' + b; } } function test(format_function) { console.log(format_function); assertEqual('NaN', format_function.call(NaN, 0)) assertEqual('Infinity', format_function.call(Infinity, 0)) assertEqual('-Infinity', format_function.call(-Infinity, 0)) assertEqual('0', format_function.call(0, 0)) assertEqual('0.00', format_function.call(0, 2)) assertEqual('1', format_function.call(1, 0)) assertEqual('-1', format_function.call(-1, 0)) // decimal padding assertEqual('1.00', format_function.call(1, 2)) assertEqual('-1.00', format_function.call(-1, 2)) // decimal rounding assertEqual('0.12', format_function.call(0.123456, 2)) assertEqual('0.1235', format_function.call(0.123456, 4)) assertEqual('-0.12', format_function.call(-0.123456, 2)) assertEqual('-0.1235', format_function.call(-0.123456, 4)) // thousands separator assertEqual('1,234', format_function.call(1234.123456, 0)) assertEqual('12,345', format_function.call(12345.123456, 0)) assertEqual('123,456', format_function.call(123456.123456, 0)) assertEqual('1,234,567', format_function.call(1234567.123456, 0)) assertEqual('12,345,678', format_function.call(12345678.123456, 0)) assertEqual('123,456,789', format_function.call(123456789.123456, 0)) assertEqual('-1,234', format_function.call(-1234.123456, 0)) assertEqual('-12,345', format_function.call(-12345.123456, 0)) assertEqual('-123,456', format_function.call(-123456.123456, 0)) assertEqual('-1,234,567', format_function.call(-1234567.123456, 0)) assertEqual('-12,345,678', format_function.call(-12345678.123456, 0)) assertEqual('-123,456,789', format_function.call(-123456789.123456, 0)) // thousands separator and decimal assertEqual('1,234.12', format_function.call(1234.123456, 2)) assertEqual('12,345.12', format_function.call(12345.123456, 2)) assertEqual('123,456.12', format_function.call(123456.123456, 2)) assertEqual('1,234,567.12', format_function.call(1234567.123456, 2)) assertEqual('12,345,678.12', format_function.call(12345678.123456, 2)) assertEqual('123,456,789.12', format_function.call(123456789.123456, 2)) assertEqual('-1,234.12', format_function.call(-1234.123456, 2)) assertEqual('-12,345.12', format_function.call(-12345.123456, 2)) assertEqual('-123,456.12', format_function.call(-123456.123456, 2)) assertEqual('-1,234,567.12', format_function.call(-1234567.123456, 2)) assertEqual('-12,345,678.12', format_function.call(-12345678.123456, 2)) assertEqual('-123,456,789.12', format_function.call(-123456789.123456, 2)) } console.log('======== Testing ========'); test(Number.prototype.format); test(Number.prototype.format1); test(Number.prototype.format2); test(Number.prototype.format3);
基准
function benchmark(f) { var start = new Date().getTime(); f(); return new Date().getTime() - start; } function benchmark_format(f) { console.log(f); time = benchmark(function () { for (var i = 0; i < 100000; i++) { f.call(123456789, 0); f.call(123456789, 2); } }); console.log(time.format(0) + 'ms'); } async = []; function next() { setTimeout(function () { f = async.shift(); f && f(); next(); }, 10); } console.log('======== Benchmark ========'); async.push(function () { benchmark_format(Number.prototype.format); }); async.push(function () { benchmark_format(Number.prototype.format1); }); async.push(function () { benchmark_format(Number.prototype.format2); }); async.push(function () { benchmark_format(Number.prototype.format3); }); next();
如果您不想使用jQuery,请查看Numeral.js
首先,将一个整数转换为JS中的字符串非常简单:
// Start off with a number var number = 42; // Convert into a string by appending an empty (or whatever you like as a string) to it var string = 42+''; // No extra conversion is needed, even though you could actually do var alsoString = number.toString();
如果你有一个数字作为一个字符串,并希望它被转换为一个整数,你必须使用整数的parseInt(string)
和浮点数的parseFloat(string)
。 这两个函数然后返回所需的整数/浮点数。 例:
// Start off with a float as a string var stringFloat = '3.14'; // And an int as a string var stringInt = '42'; // typeof stringInt would give you 'string' // Get the real float from the string var realFloat = parseFloat(someFloat); // Same for the int var realInt = parseInt(stringInt); // but typeof realInt will now give you 'number'
你究竟想要追加什么等等,从你的问题来看,我还不清楚。
http://code.google.com/p/javascript-number-formatter/ :
- 简短,快速,灵活而独立。 只有75行,包括麻省理工学院许可证信息,空白行和评论。
- 接受标准数字格式,如#,## 0.00或否定-000。####。
- 接受### 0,00,#,###。##,#'###。##或任何类型的非编号符号的国家格式。
- 接受任意数量的数字分组。 #,##,#0.000或#,### 0。##都是有效的。
- 接受任何冗余/防呆格式。 ##,###,##。#或0#,#00#。### 0#都可以。
- 自动编号四舍五入
- 简单的界面,只需提供像这样的掩码和值:format(“0.0000”,3.141592)
UPDATE
正如TomášZato在这里提到的一个解决方案:
(666.0).toLocaleString() numObj.toLocaleString([locales [, options]])
其在ECMA-262 5.1版中描述:
- http://www.ecma-international.org/ecma-262/5.1/#sec-15.7.4.3
- https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Number/toLocaleString
并将在未来的浏览器版本中工作…
例如:
var flt = '5.99'; var nt = '6'; var rflt = parseFloat(flt); var rnt = parseInt(nt);
使用JQuery 。
$(document).ready(function() { //Only number and one dot function onlyDecimal(element, decimals) { $(element).keypress(function(event) { num = $(this).val() ; num = isNaN(num) || num === '' || num === null ? 0.00 : num ; if ((event.which != 46 || $(this).val().indexOf('.') != -1) && (event.which < 48 || event.which > 57)) { event.preventDefault(); } if($(this).val() == parseFloat(num).toFixed(decimals)) { event.preventDefault(); } }); } onlyDecimal("#TextBox1", 3) ; });
在逗号后面用2个数字来表示小数,你可以使用:
function nformat(a) { var b = parseInt(parseFloat(a)*100)/100; return b.toFixed(2); }
这是另一个版本:
$.fn.digits = function () { return this.each(function () { var value = $(this).text(); var decimal = ""; if (value) { var pos = value.indexOf("."); if (pos >= 0) { decimal = value.substring(pos); value = value.substring(0, pos); } if (value) { value = value.replace(/(\d)(?=(\d\d\d)+(?!\d))/g, "$1,"); if (!String.isNullOrEmpty(decimal)) value = (value + decimal); $(this).text(value); } } else { value = $(this).val() if (value) { var pos = value.indexOf("."); if (pos >= 0) { decimal = value.substring(pos); value = value.substring(0, pos); } if (value) { value = value.replace(/(\d)(?=(\d\d\d)+(?!\d))/g, "$1,"); if (!String.isNullOrEmpty(decimal)) value = (value + decimal); $(this).val(value); } } } }) };
我做了一个简单的功能,也许有人可以使用它
function secsToTime(secs){ function format(number){ if(number===0){ return '00'; }else { if (number < 10) { return '0' + number } else{ return ''+number; } } } var minutes = Math.floor(secs/60)%60; var hours = Math.floor(secs/(60*60))%24; var days = Math.floor(secs/(60*60*24)); var seconds = Math.floor(secs)%60; return (days>0? days+"d " : "")+format(hours)+':'+format(minutes)+':'+format(seconds); }
这可以产生以下输出:
- 5d 02:53:39
- 4d 22:15:16
- 3时01分05秒
- 00:00:00
如果你想格式化数字,而不是计算,你可以使用这个
function numberFormat( number ){ var digitCount = (number+"").length; var formatedNumber = number+""; var ind = digitCount%3 || 3; var temparr = formatedNumber.split(''); if( digitCount > 3 && digitCount <= 6 ){ temparr.splice(ind,0,','); formatedNumber = temparr.join(''); }else if (digitCount >= 7 && digitCount <= 15) { var temparr2 = temparr.slice(0, ind); temparr2.push(','); temparr2.push(temparr[ind]); temparr2.push(temparr[ind + 1]); // temparr2.push( temparr[ind + 2] ); if (digitCount >= 7 && digitCount <= 9) { temparr2.push(" million"); } else if (digitCount >= 10 && digitCount <= 12) { temparr2.push(" billion"); } else if (digitCount >= 13 && digitCount <= 15) { temparr2.push(" trillion"); } formatedNumber = temparr2.join(''); } return formatedNumber; }
输入: {整数}数字
输出: {字符串}数字
22,870 =>如果是22870
22,87百万=>如果数字2287xxxx(x可以是任何)
22,87十亿=>如果号码2287xxxxxxx
22,87万亿=>如果是2287xxxxxxxxxx
你明白了
为了进一步jfriend00的回答(我没有足够的评论)我已经将他/她的回答扩展到以下内容:
function log(args) { var str = ""; for (var i = 0; i < arguments.length; i++) { if (typeof arguments[i] === "object") { str += JSON.stringify(arguments[i]); } else { str += arguments[i]; } } var div = document.createElement("div"); div.innerHTML = str; document.body.appendChild(div); } Number.prototype.addCommas = function (str) { if (str === undefined) { str = this; } var parts = (str + "").split("."), main = parts[0], len = main.length, output = "", first = main.charAt(0), i; if (first === '-') { main = main.slice(1); len = main.length; } else { first = ""; } i = len - 1; while(i >= 0) { output = main.charAt(i) + output; if ((len - i) % 3 === 0 && i > 0) { output = "," + output; } --i; } // put sign back output = first + output; // put decimal part back if (parts.length > 1) { output += "." + parts[1]; } return output; } var testCases = [ 1, 12, 123, -1234, 12345, 123456, -1234567, 12345678, 123456789, -1.1, 12.1, 123.1, 1234.1, -12345.1, -123456.1, -1234567.1, 12345678.1, 123456789.1 ]; for (var i = 0; i < testCases.length; i++) { log(testCases[i].addCommas()); } /*for (var i = 0; i < testCases.length; i++) { log(Number.addCommas(testCases[i])); }*/