PiyaModi PiyaModi - 3 months ago 18
AngularJS Question

How to put colon automatically in text box for mac address with validation (javascript or angularjs)?

I need to put colon (:) automatically after every two digit.
So it will look like: DD:A4:55:FD:56:CC

I have write a logic and now I am able to put colon as well, but when I am pressing backspace I am not able to go back from colon.

And it is allowing to write more than two digit when i put cursor on already written two digit, which I don't want.

Here is my code:

HTML:

<input type="text" ng-model="mac.macAddress" name="macAddress" id="macAddress"
maxlength="17" ng-change="macAddressFormat(mac)">


JS:

$scope.macAddressFormat = function(mac){

var macAddress = mac.macAddress;

var filteredMac = macAddress.replace(/\:/g, '');
var length = filteredMac.length;

if(length % 2 == 0 && length > 1 && length < 12){
mac.macAddress = mac.macAddress + ':';
}
else{
console.log('no');
}
}


Please, know me where I am wrong.
Thanks ! in advance...

Answer

You can simplify using Regex. I added a default value to your input and added a button which will call this line of code if the length of the macAddress is valid:

macAddr.replace(/(.{2})/g,"$1:").slice(0,-1).toUpperCase();

The Code:

var app = angular.module("macformat", []); 
app.controller("myCtrl", function($scope) {
  $scope.macAddressFormat = function(mac){

    mac.macAddress = mac.macAddress.toUpperCase();
    var macAddr  = mac.macAddress;
    var alphaNum= /^[A-Za-z0-9]+$/;

    // The Input will be changed only if the length is 12 and is alphanumeric
    if(macAddr.length == 12 && alphaNum.test(macAddr)){
  
        // A lot is going on here. 
        // .replace(/(.{2})/g,"$1:") - adds ':' every other 2 characters
        // .slice(0,-1) - cuts the last character, because ':' is added
        // .toUpperCase() - because it's good practice for writing MAC Addresses
        macAddr = macAddr.replace(/(.{2})/g,"$1:").slice(0,-1).toUpperCase();
    
        // Place Formatted MAC Address to Input
        mac.macAddress = macAddr;
        console.log("Tadaaa");
    }
    // Developer info in console if length is not 12
    else if (macAddr.length < 12 && alphaNum.test(macAddr)){
        console.log(12 - macAddr.length + " characters left");
    }
    else if (macAddr.length > 12 && alphaNum.test(macAddr)){
        console.log(macAddr.length - 12 + " characters too many");
    }
    // Developer info in console if macAddress contains non alpha-numeric
    else if (!alphaNum.test(macAddr)){
        console.log("only alpha-numeric allowed");
    }
  };
});
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

<div ng-app="macformat" ng-controller="myCtrl">
  <p>Write MAC Address here without ":" and it will be formatted automatically:</p>
  <input type="text" ng-model="mac.macAddress" name="macAddress" id="macAddress" 
           maxlength="17" ng-change="macAddressFormat(mac)">
  <p><i>Check console for info</i></p>
</div>

Comments