2016-05-12 11 views
0

Hier ist eine Direktive zum Filtern eines Feldes für die Währung, also muss ein Benutzer nur eingeben und die Dezimalzahl wird impliziert.Erlaube nur Zahlen und negative Zeichen in der Geldformatierungsdirektive

Es funktioniert gut, außer ich möchte negative Zahlen zulassen.

http://plnkr.co/edit/qlZrc7dnZEUWzoNGyaF6?p=preview

Ich würde denken, ich diese Linie nehmen könnte:

var plainNumber = viewValue.replace(/[^-+0-9]/g, ''); 

aber die Richtlinie bricht tun. Weiß jemand, wie man das aktualisiert, um nur Zahlen und ein negatives Zeichen zu erlauben?

so alles mit Buchstaben ersetzt werden wird wie 7987hjhd.00 aber -938.87 und 8937.34 wird erlaubt sein.

+0

Bitte spezifischere über die Zahlen, die Sie erlauben oder verbieten wollen. Post-Beispiele. –

+0

@PedroLobito Zahlen 0-9 und das negative Zeichen '-' keine Buchstaben, Symbole, etc. Im Moment beschränkt es die Eingabe nur auf Zahlen ohne das negative Vorzeichen. – jenryb

+0

Richtig wissen, dass es nichts erlaubt. –

Antwort

1

Dieser Code übernimmt die Zahl und formatiert die letzten beiden Zahlen als Dezimalzahl.

Eingabe + und - ändert das Vorzeichen. Derzeit wird die + angezeigt, aber das kann leicht geändert werden.

Warum Sie es nicht versuchen, um zu sehen, was ich meine:

var app = angular.module('App', []); 
 

 
app.controller('MainCtrl', function($scope) {}); 
 

 
app.directive('inputRestrictor', [ 
 
    function() { 
 
    return { 
 
     restrict: 'A', 
 
     require: 'ngModel', 
 
     link: function(scope, element, attr, ngModelCtrl) { 
 
     // Matches characters that aren't `0-9`, `.`, `+`, or `-` 
 
     var pattern = /[^.0-9+-]/g; 
 
     
 

 
     function fromUser(text) { 
 
      var rep = /[+]/g; // find + symbol (globally) 
 
      var rem = /[-]/g; // find - symbol (globally) 
 
      rep.exec(text); 
 
      rem.exec(text); 
 

 
      // Find last index of each sign 
 
      // The most recently typed characters are last 
 
      var indexp = rep.lastIndex; 
 
      var indexm = rem.lastIndex; 
 

 
      // remove formatting, and add it back later 
 
      text = text.replace(/[+.-]/g, ''); 
 
      if (indexp > 0 || indexm > 0) {// Are there signs? 
 
      if (indexp > indexm){ // plus sign typed later? 
 
       text = "+" + text; 
 
      } else text = "-" + text; 
 
      } 
 

 
      var transformedInput = text.replace(pattern, ''); 
 
      transformedInput = transformedInput.replace(
 
      /([0-9]{1,2}$)/, ".$1" // make last 1 or 2 digits the decimal 
 
     ) 
 
      ngModelCtrl.$setViewValue(transformedInput); 
 
      ngModelCtrl.$render(); 
 
      return transformedInput; 
 
     } 
 
     ngModelCtrl.$parsers.push(fromUser); 
 
     } 
 
    }; 
 
    } 
 
]);
<!DOCTYPE html> 
 
<html> 
 

 
    <head> 
 
    <script data-require="[email protected]" data-semver="1.3.0-rc.2" src=" https://code.angularjs.org/1.3.0-rc.2/angular.js"></script> 
 
    <link rel="stylesheet" href="style.css" /> 
 
    <script src="script.js"></script> 
 
    </head> 
 

 
    <body ng-app="App"> 
 
    <div ng-controller="MainCtrl"> 
 
     <input type="text" ng-model="inputValue" input-restrictor> 
 
     <input type="submit" ng-click="getdata()" /> 
 
    </div> 
 
    </body> 
 

 
</html>

+0

Ich mag dies ... eine Sache ist jedoch, dass Sie einmal zwischen negativ und positiv austauschen können, aber Sie können nicht hin und her wechseln. – jenryb

+1

@jenryb Was meinst du? Ich kann hin und her wechseln, indem ich jedes Zeichen eintippe, auf das ich wechseln möchte. Wenn Sie zum Beispiel Folgendes eingeben: '+ - + - + -' wird zwischen den beiden umgeschaltet. – Laurel

+0

Meine schlechte, ich hielt die Schicht von der Eingabe des Plus-Zeichen. Das ist gut, ich werde das '+' herausnehmen und es funktioniert für mich. Danke – jenryb