如何使用 AngularJS 过滤器将数字格式化为具有前导零

How can I use an AngularJS filter to format a number to have leading zeros?

本文关键字:格式化 AngularJS 何使用 过滤器 数字      更新时间:2023-09-26

我检查了文档。我想要的是我的数字有四位数字和前导零。

22 to 0022
1  to 0001

有人可以帮忙告诉我,这是否可以使用数字或其他类型的过滤器?

不需要过滤器,只需在 html 中使用表达式即可

{{("00000"+1).slice(-6)}}      // '000001'
{{("00000"+123456).slice(-6)}} // '123456'

假设您的应用程序中有一个名为 myModule 的模块myApp

angular.module('myApp', ['myModule']);

在此模块中定义筛选器:

angular.module('myModule', [])
    .filter('numberFixedLen', function () {
        return function (n, len) {
            var num = parseInt(n, 10);
            len = parseInt(len, 10);
            if (isNaN(num) || isNaN(len)) {
                return n;
            }
            num = ''+num;
            while (num.length < len) {
                num = '0'+num;
            }
            return num;
        };
    });

在标记中使用筛选器:

{{myValue | numberFixedLen:4}}

保持最小...(适用于字符串和数字(如果有必要,请执行一些验证(isNumber,NaN(

// 1e8 is enough for working with 8 digits (100000000)
// in your case 1e4 (aka 10000) should do it
app.filter('numberFixedLen', function () {
    return function(a,b){
        return(1e4+""+a).slice(-b);
    };
});

如果您希望它更小并且浏览器支持箭头功能,或者您正在使用 babel/traceur,那么它可以减少到:

app.filter('numberFixedLen', () => (a, b) => (1e4 + "" + a).slice(-b))

.html:

{{ myValue | numberFixedLen:4 }}

注意 这具有较低的灵活性,这仅适用于小于 10000 的数字,如果它是一个更大的数字,则必须同时增加41e4或使用任何其他动态解决方案。
这是为了尽可能快地做尽可能多的事情。

它故意与执行相同:

("10000"+1234567).slice(-4) // "4567"
("10000"+1234567).slice(-9) // "001234567"

更新你也可以使用padStart(但它在IE中不起作用(

// app.filter('numberFixedLen', () => (a, b) => ("" + a).padStart(b, 0))
console.log("1234567".padStart(4, 0)) // "1234567"
console.log("1234567".padStart(9, 0)) // "001234567"

具有 underscore.string 的填充函数和角度下划线字符串过滤器的最小代码:

在 jsFiddle 中工作演示


角度字符串输入 -> 角度下划线字符串过滤器 -> 下划线字符串

<div ng-app="app" ng-controller="PadController">
   <div ng-repeat="num in nums">{{ num | s: 'pad':[4, '0'] }}</div>
</div>
angular.module('app', ['underscore.string']).controller('PadController', function ($scope) {
    $scope.nums = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15];
});
// 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15

s变量引用字符串库。在旧版本中,您可能必须将其替换为"_.str",即。 {{ num | _.str: 'pad':[4, '0'] }}

如果您只处理"0"填充并且不介意按用例定制过滤器,我会选择类似于 Endless 的速度答案,但建议您确保数字还不够长,如下所示:

app.filter('minLength', function () {
    return function(input,len){
        input = input.toString();
        if(input.length >= len) return input;
        else return("000000"+input).slice(-len);
    }
}); 

因为这不仅可以避免修剪已经满足最小长度的数字或字符串,这对于避免奇怪的事情很重要,例如:

{{ 0.23415336 | minLength:4 }} //Returns "0.23415336" instead of "5336" like in Endless's code

但是通过使用"000000"而不是像 1e6 这样的数字,您可以避免更改输入的实际值(通过不向其添加 1000000(,并避免需要隐式将数字转换为字符串,从而节省计算步骤,考虑到输入已经转换为字符串以避免上述剪切问题。

如果你想要一个不需要任何用例测试的系统,它比bguiz的解决方案更快、更灵活,我使用这样的过滤器:

app.filter('minLength', function(){
  return function(input, len, pad){
    input = input.toString(); 
    if(input.length >= len) return input;
    else{
      pad = (pad || 0).toString(); 
      return new Array(1 + len - input.length).join(pad) + input;
    }
  };
});

这允许您执行标准:

{{ 22 | minLength:4 }} //Returns "0022"

但也为您提供了添加非零填充选项的选项,例如:

{{ 22 | minLength:4:"-" }} //Returns "--22"

你可以用数字或字符串来强制实施古怪的东西,例如:

{{ "aa" | minLength:4:"&nbsp;" }} //Returns "  aa"

另外,如果输入已经超过您想要的长度,过滤器会将其弹出而不进行任何调整:

{{ 1234567 | minLength:4 }} //Returns "1234567"

您还可以避免为len添加验证,因为当您在没有 len 参数的情况下调用过滤器时,angular 会在控制台中尝试创建长度数组的行处抛出一个RangeErrornull使其易于调试。

你可以使用纯JavaScript,例如

('00000'+refCounter).substr(-5,5)

对于用 5 个零填充 refCounter 的值。

注意:请确保检查 refCounter 不是未定义的,否则会出现异常。

如果需要某些修改,请使用以下过滤器修改

  app.filter('customNo', function () {
            return function (input) {
                var n = input;
                return (n < 10) ? '000' + n : (n < 100) ? '00' + n : (n < 1000) ? '0' + n : '' + n;
            }
        });

<span>{{number|customNo}}</span>

另一个例子:

// Formats a number to be at least minNumberOfDigits by adding leading zeros
app.filter('LeadingZerosFilter', function() {
  return function(input, minNumberOfDigits) {
    minNumberOfDigits = minNumberOfDigits || 2;
    input = input + '';
    var zeros = new Array(minNumberOfDigits - input.length + 1).join('0');
    return zeros + input;
  };
});

最干净的方法是在 angular 中创建自己的过滤器并使用它。这个问题已经有一些答案,但我个人觉得这最容易阅读。按所需的零长度创建一个数组,然后用零连接数组。

myApp.filter('customNumber', function(){
    return function(input, size) {
        var zero = (size ? size : 4) - input.toString().length + 1;
        return Array(+(zero > 0 && zero)).join("0") + input;
    }
});

像这样使用它:

{{myValue | customNumber}}

我还这样做了,以便您可以将前导零指定为参数:

{{myValue | customNumber:5}}

演示:http://www.bootply.com/d7SbUz57o8

这是 TypeScript 中指令的 Angular 1.x 变体,可以处理整数和小数。由于TS,一切都被认为是"类型安全"。

adminApp.filter("zeroPadNumber",
    () => (num: number, len: number): string => {
        if (isNaN(num) || isNaN(len)) {
            return `${num}`;
        }
        if (`${num}`.indexOf(".") > -1) {
            var parts = `${num}`.split(".");
            var outDec = parts[0]; // read the before decimal
            while (outDec.length < len) {
                outDec = `0${outDec}`;
            }
            return outDec + parts[1]; // reappend the after decimal
        } else {
            var outInt = `${num}`;
            while (outInt.length < len) {
                outInt = `0${outInt}`;
            }
            return outInt;
        }
    });

我已经扩展了@bguiz的答案,以便能够处理数组,这是我对ng-options使用过滤器的要求:

app.filter('numberFixedLen', function () {
  return function (p, len) {
    function toFixedLength(n, len) {
      var num = parseInt(n, 10);
      len = parseInt(len, 10);
      if (isNaN(num) || isNaN(len)) {
        return n;
      }
      num = '' + num;
      while (num.length < len) {
        num = '0' + num;
      }
      return num;
    }
    if (p.length) {
      for (var i = 0; i < p.length; i++) {
        p[i] = toFixedLength(p[i], len);
      }
    } else {
      p = toFixedLength(p, len);
    }
    return p;
  };
});

示例代码:

{{ (value > 9 ? (value > 99 ? (value > 999 ? value : '0'+value) : '00'+value) : '000'+value) }}