在 JavaScript 中格式化数字类似于 C#

IT技术 javascript jquery format numbers
2021-01-17 16:17:19

是否有一种简单的方法可以在 JavaScript 中格式化数字,类似于 C#(或 VB.NET)中可用的格式化方法,通过ToString("format_provider")String.Format()

6个回答

一般来说

在 jQuery 中

autoNumeric 功能非常齐全,最近更新到 1.8.0。
2021-03-11 16:17:19
警告:您链接到的 jQuery 数字格式化程序(我用 v1.1.0 尝试过)完全损坏且无用。如:它不工作,在所有这是一个不错的格式化插件:asual.com/jquery/format
2021-03-23 16:17:19
@Tomalak 永远不会太晚。一年多后,我在这里看到了这个!
2021-03-24 16:17:19
而我将近三年后!
2021-03-30 16:17:19
@Tomalak,您应该将其发布为答案。这绝对是我用过的最好的数字格式化插件。不过,我希望在单元测试之外还有文档。
2021-04-06 16:17:19

是的,肯定有一种方法可以在 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)

随着变量名的使用。到固定

还有另一个功能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 添加逗号”找到可以处理十进制数的函数。

可以通过多种方式将数字转换为字符串。最简单的就是将它添加到一个字符串中:

var myNumber = 3;
var myStr = "" + myNumber;   // "3"

在 jsFiddle 的上下文中,您可以通过更改以下行将逗号输入到计数器中:

jTarget.text(current);

对此:

jTarget.text(addCommas(current));

你可以在这里看到它的工作:http : //jsfiddle.net/jfriend00/CbjSX/

@Kristopher - 我添加了对负数的支持。
2021-03-14 16:17:19
@blackessej - 我在答案的末尾添加了更多内容,显示了如何将 addCommas 添加到您的小提琴中。
2021-03-17 16:17:19
非常好。我现在在用这个。
2021-03-19 16:17:19
负数不那么热):
2021-03-24 16:17:19
addCommas()函数中添加了对十进制数的支持,因此它适用于带有小数部分的数字。
2021-04-05 16:17:19

我写了一个简单的函数(不需要另一个 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]:"");
}
如果您先拆分浮点部分,然后使用整数执行此操作,然后再次添加流动点部分,它也应该适用于 fp
2021-03-17 16:17:19
"412.8".replace(/\B(?=(\d{3})+(?!\d))/g, ",");返回412.8我认为它可以返回412.80
2021-04-04 16:17:19

这里有一些解决方案,都通过了测试套件,包括测试套件和基准测试,如果你想复制和粘贴来测试,试试这个 Gist

方法 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('.');
    }
}

方法一

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('.');
    };
}

方法二(拆分为数组)

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('.');
    };
}

方法三(循环)

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();