Работаю над проблемой сам, и это то, что у меня так далеко. Это более или менее работает, но потом невозможно добавить минус из-за проверки нового значения. Также не допускается использование запятой в качестве разделителя тысяч, только десятичное.
Это не идеально, но может дать некоторые идеи.
app.directive('isNumber', function () {
return function (scope, elem, attrs) {
elem.bind('keypress', function (evt) {
var keyCode = (evt.which) ? evt.which : event.keyCode;
var testValue = (elem[0].value + String.fromCharCode(keyCode) + "0").replace(/ /g, ""); //check ignores spaces
var regex = /^\-?\d+((\.|\,)\d+)?$/;
var allowedChars = [8,9,13,27,32,37,39,44,45, 46] //control keys and separators
//allows numbers, separators and controll keys and rejects others
if ((keyCode > 47 && keyCode < 58) || allowedChars.indexOf(keyCode) >= 0) {
//test the string with regex, decline if doesn't fit
if (elem[0].value != "" && !regex.test(testValue)) {
event.preventDefault();
return false;
}
return true;
}
event.preventDefault();
return false;
});
};
});
Позволяет:
11 11 .245 (в контроллере, отформатированном на размытие до 1111.245)
11,44
-123,123
-1 014
0123 (отформатировано для размытия до 123)
не позволяет:
! @ # $ / *
а
11.11.1
11,11.1
0,42