69 votes

Comment formater un numéro de téléphone dans AngularJS

Question (mise en forme de numéro de téléphone):

Je vais avoir à le format de numéro de téléphone dans AngularJS, mais il n'y a pas de filtre. Est-il possible d'utiliser le filtre de monnaie ou de format de 10 chiffres (555) 555-5255? et encore de préserver le type de données du champ entier?

Question deux (masquage du numéro de carte de crédit):

J'ai une carte de crédit champ qui est mappé à AngularJS, comme:

<input type="text" mg-model="client.creditCardNumber"> qui retourne le nombre entier (4111111111111111). Je tiens à le masquer avec xxx les 12 premiers chiffres et d'afficher uniquement les 4 derniers. Je pensais sur l'utilisation de filtre: limite de ce mais ne sais pas vraiment comment. Des idées? Est-il possible de aussi format le avec des tirets, mais encore conserver le type de données integer? sorte de 4111-1111-1111-1111.

Je me demande si il y a un Angulaire de la façon de faire ces choses.

Merci beaucoup!

147voto

kstep Points 773

De plus, si vous avez besoin de formater un numéro de téléphone uniquement en sortie, vous pouvez utiliser un filtre personnalisé comme celui-ci:

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

        var value = tel.toString().trim().replace(/^\+/, '');

        if (value.match(/[^0-9]/)) {
            return tel;
        }

        var country, city, number;

        switch (value.length) {
            case 10: // +1PPP####### -> C (PPP) ###-####
                country = 1;
                city = value.slice(0, 3);
                number = value.slice(3);
                break;

            case 11: // +CPPP####### -> CCC (PP) ###-####
                country = value[0];
                city = value.slice(1, 4);
                number = value.slice(4);
                break;

            case 12: // +CCCPP####### -> CCC (PP) ###-####
                country = value.slice(0, 3);
                city = value.slice(3, 5);
                number = value.slice(5);
                break;

            default:
                return tel;
        }

        if (country == 1) {
            country = "";
        }

        number = number.slice(0, 3) + '-' + number.slice(3);

        return (country + " (" + city + ") " + number).trim();
    };
});
 

Ensuite, vous pouvez faire le modèle suivant:

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

19voto

aberke Points 21

J'ai créé un AngularJS module pour gérer ce problème au sujet de l'phonenumbers pour moi avec une coutume de la directive et de l'accompagnement de filtre.

jsfiddle exemple: http://jsfiddle.net/aberke/s0xpkgmq/

Filtre à utiliser exemple: <p>{{ phonenumberValue | phonenumber }}</p>

Filtre de code:

.filter('phonenumber', function() {
    /* 
    Format phonenumber as: c (xxx) xxx-xxxx
        or as close as possible if phonenumber length is not 10
        if c is not '1' (country code not USA), does not use country code
    */

    return function (number) {
        /* 
        @param {Number | String} number - Number that will be formatted as telephone number
        Returns formatted number: (###) ###-####
            if number.length < 4: ###
            else if number.length < 7: (###) ###

        Does not handle country codes that are not '1' (USA)
        */
        if (!number) { return ''; }

        number = String(number);

        // 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 and add it back
        var c = (number[0] == '1') ? '1 ' : '';
        number = number[0] == '1' ? number.slice(1) : number;

        // # (###) ###-#### as c (area) front-end
        var area = number.substring(0,3);
        var front = number.substring(3, 6);
        var end = number.substring(6, 10);

        if (front) {
            formattedNumber = (c + "(" + area + ") " + front);  
        }
        if (end) {
            formattedNumber += ("-" + end);
        }
        return formattedNumber;
    };
});

La Directive exemple d'utilisation:

<phonenumber-directive placeholder="'Input phonenumber here'" model='myModel.phonenumber'></phonenumber-directive>

La Directive de code:

.directive('phonenumberDirective', ['$filter', function($filter) {
    /*
    Intended use:
        <phonenumber-directive placeholder='prompt' model='someModel.phonenumber'></phonenumber-directive>
    Where:
        someModel.phonenumber: {String} value which to bind only the numeric characters [0-9] entered
            ie, if user enters 617-2223333, value of 6172223333 will be bound to model
        prompt: {String} text to keep in placeholder when no numeric input entered
    */

    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.phonenumberModel = number;
            scope.inputValue = $filter('phonenumber')(number);
        });
    }

    return {
        link: link,
        restrict: 'E',
        scope: {
            phonenumberPlaceholder: '=placeholder',
            phonenumberModel: '=model',
        },
        // templateUrl: '/static/phonenumberModule/template.html',
        template: '<input ng-model="inputValue" type="tel" class="phonenumber" placeholder="{{phonenumberPlaceholder}}" title="Phonenumber (Format: (999) 9999-9999)">',
    };
}])

Code complet avec module et comment l'utiliser: https://gist.github.com/aberke/042eef0f37dba1138f9e

13voto

Comme Shailbenq l'a suggéré, phoneformat est génial.

Inclure le format du téléphone sur votre site Web. Créez un filtre pour le module angulaire ou votre application.

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

        return formatLocal('US', phoneNumber); 
    }
});
 

Ensuite, vous pouvez utiliser le filtre dans votre code HTML.

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

Si vous souhaitez utiliser le filtre dans votre contrôleur.

 var number = '5553219876';
var newNumber = $filter('tel')(number);
 

11voto

lightalex Points 437

entrez la description de l'image ici

J'ai aussi trouvé ce plugin JQuery facile à inclure dans votre application Angular (également avec bower: D) et vérifiant tous les codes de pays possibles avec leurs masques respectifs: intl-tel-input

Vous pouvez ensuite utiliser l'option validationScript afin de vérifier la validité de la valeur de l'entrée.

5voto

Narretz Points 2375

Angular-ui a une directive pour masquer les entrées. C’est peut-être ce que vous voulez pour le masquage (malheureusement, la documentation n’est pas très bonne):

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

Je ne pense cependant pas que cela aidera à masquer le numéro de carte de crédit.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X