Format telephone and credit card numbers in AngularJS

前端 未结 17 2063
猫巷女王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:20

    Simple filter something like this (use numeric class on input end filter charchter in []):

    <script type="text/javascript">
    // Only allow number input
    $('.numeric').keyup(function () {
        this.value = this.value.replace(/[^0-9+-\.\,\;\:\s()]/g, ''); // this is filter for telefon number !!!
    });
    

    0 讨论(0)
  • 2020-11-30 19:21

    This is the simple way. As basic I took it from http://codepen.io/rpdasilva/pen/DpbFf, and done some changes. For now code is more simply. And you can get: in controller - "4124561232", in view "(412) 456-1232"

    Filter:

    myApp.filter 'tel', ->
      (tel) ->
        if !tel
          return ''
        value = tel.toString().trim().replace(/^\+/, '')
    
        city = undefined
        number = undefined
        res = null
        switch value.length
          when 1, 2, 3
            city = value
          else
            city = value.slice(0, 3)
            number = value.slice(3)
        if number
          if number.length > 3
            number = number.slice(0, 3) + '-' + number.slice(3, 7)
          else
            number = number
          res = ('(' + city + ') ' + number).trim()
        else
          res = '(' + city
        return res
    

    And directive:

    myApp.directive 'phoneInput', ($filter, $browser) ->
    
      require: 'ngModel'
      scope:
        phone: '=ngModel'
      link: ($scope, $element, $attrs) ->
    
        $scope.$watch "phone", (newVal, oldVal) ->
          value = newVal.toString().replace(/[^0-9]/g, '').slice 0, 10
          $scope.phone = value
          $element.val $filter('tel')(value, false)
          return
        return
    
    0 讨论(0)
  • 2020-11-30 19:23

    As shailbenq suggested, phoneformat is awesome.

    Include phone format in your website. Create a filter for the angular module or your application.

    angular.module('ng')
    .filter('tel', function () {
        return function (phoneNumber) {
            if (!phoneNumber)
                return phoneNumber;
    
            return formatLocal('US', phoneNumber); 
        }
    });
    

    Then you can use the filter in your HTML.

    {{phone|tel}} 
    OR
    <span ng-bind="phone|tel"></span>
    

    If you want to use the filter in your controller.

    var number = '5553219876';
    var newNumber = $filter('tel')(number);
    
    0 讨论(0)
  • 2020-11-30 19:23

    Angular-ui has a directive for masking input. Maybe this is what you want for masking (unfortunately, the documentation isn't that great):

    http://angular-ui.github.com/

    I don't think this will help with obfuscating the credit card number, though.

    0 讨论(0)
  • 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:
        <phone-number placeholder='prompt' model='someModel.phonenumber' />
        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: '<input ng-model="inputValue" type="tel" placeholder="{{phoneNumberPlaceholder}}" />'
        };
      }
      ]
    )
    /* 
        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;
        };
      }
    );
    <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
    <div ng-app="myApp" ng-controller="exampleController">
      <p>Phone Number Value: {{ user.profile.HomePhone || 'null' }}</p>
      <p>Formatted Phone Number: {{ user.profile.HomePhone | phoneNumber }}</p>
            <phone-number id="homePhone"
                          class="form-control" 
                          placeholder="Home Phone" 
                          model="user.profile.HomePhone"
                          ng-required="!(user.profile.HomePhone.length || user.profile.BusinessPhone.length || user.profile.MobilePhone.length)" />
    </div>

    0 讨论(0)
提交回复
热议问题