Format telephone and credit card numbers in AngularJS

前端 未结 17 2157
猫巷女王i
猫巷女王i 2020-11-30 18:29

Question one (formatting telephone number):

I\'m having to format a telephone number in AngularJS but there is no filter for it. Is there a way to u

17条回答
  •  日久生厌
    2020-11-30 19:24

    I took aberke's solution and modified it to suit my taste.

    • It produces a single input element
    • It optionally accepts extensions
    • For US numbers it skips the leading country code
    • Standard naming conventions
    • Uses class from using code; doesn't make up a class
    • Allows use of any other attributes allowed on an input element

    My Code Pen

    var myApp = angular.module('myApp', []);
    
    myApp.controller('exampleController',
      function exampleController($scope) {
        $scope.user = { profile: {HomePhone: '(719) 465-0001 x1234'}};
        $scope.homePhonePrompt = "Home Phone";
      });
    
    myApp
    /*
        Intended use:
        
        Where: 
          someModel.phonenumber: {String} value which to bind formatted or unformatted phone number
    
        prompt: {String} text to keep in placeholder when no numeric input entered
    */
    .directive('phoneNumber',
      ['$filter',
      function ($filter) {
        function link(scope, element, attributes) {
    
          // scope.inputValue is the value of input element used in template
          scope.inputValue = scope.phoneNumberModel;
    
          scope.$watch('inputValue', function (value, oldValue) {
    
            value = String(value);
            var number = value.replace(/[^0-9]+/g, '');
            scope.inputValue = $filter('phoneNumber')(number, scope.allowExtension);
            scope.phoneNumberModel = scope.inputValue;
          });
        }
    
        return {
          link: link,
          restrict: 'E',
          replace: true,
          scope: {
            phoneNumberPlaceholder: '@placeholder',
            phoneNumberModel: '=model',
            allowExtension: '=extension'
          },
          template: ''
        };
      }
      ]
    )
    /* 
        Format phonenumber as: (aaa) ppp-nnnnxeeeee
        or as close as possible if phonenumber length is not 10
        does not allow country code or extensions > 5 characters long
    */
    .filter('phoneNumber', 
      function() {
        return function(number, allowExtension) {
          /* 
          @param {Number | String} number - Number that will be formatted as telephone number
          Returns formatted number: (###) ###-#### x #####
          if number.length < 4: ###
          else if number.length < 7: (###) ###
          removes country codes
          */
          if (!number) {
            return '';
          }
    
          number = String(number);
          number = number.replace(/[^0-9]+/g, '');
          
          // Will return formattedNumber. 
          // If phonenumber isn't longer than an area code, just show number
          var formattedNumber = number;
    
          // if the first character is '1', strip it out 
          var c = (number[0] == '1') ? '1 ' : '';
          number = number[0] == '1' ? number.slice(1) : number;
    
          // (###) ###-#### as (areaCode) prefix-endxextension
          var areaCode = number.substring(0, 3);
          var prefix = number.substring(3, 6);
          var end = number.substring(6, 10);
          var extension = number.substring(10, 15);
    
          if (prefix) {
            //formattedNumber = (c + "(" + area + ") " + front);
            formattedNumber = ("(" + areaCode + ") " + prefix);
          }
          if (end) {
            formattedNumber += ("-" + end);
          }
          if (allowExtension && extension) {
            formattedNumber += ("x" + extension);
          }
          return formattedNumber;
        };
      }
    );
    
    

    Phone Number Value: {{ user.profile.HomePhone || 'null' }}

    Formatted Phone Number: {{ user.profile.HomePhone | phoneNumber }}

提交回复
热议问题