Diretiva de formatação de dinheiro em Angular

Eu preciso de uma diretiva para filtrar um campo para a moeda, para que o usuário precise digitar e o decimal esteja implícito.

Necessidades:

Formate o campo decimal como tipos de usuário -

Comece no centésimo lugar à medida que o usuário digita. Então eles digitariam "4" e veriam "0,04", "42" e "0,42", digitar 298023 e "2980,23".

O campo deve ser um númeroDeve permitir negativos-Permitir 0,00 como entrada de númeroIdealmente, use type = "number" mas "type = text" está corretoVocê deve poder limpar o campo para estar vazio.

O filtro de moeda ng não atende a esses requisitos como estão. Por favor, veja o comportamento em plunkers para entender o que quero dizer.

MinhasPrimeiro Plunker tem `input = text 'e permite números negativos. Um problema é que você não pode digitar um negativo como o primeiro número. Quando você limpa o campo, ele retorna para '0,00', mas deve ser completamente limpo.

   app.directive('format', ['$filter', function ($filter) {
 return {
            require: 'ngModel', //there must be ng-model in the html
            link: function (scope, elem, attr, ctrl) {
                if (!ctrl) return;

                ctrl.$parsers.unshift(function (viewValue, modelValue) {
                    var plainNumber = viewValue.replace(/[^-+0-9]/g,'');
                    var newVal = plainNumber.charAt(plainNumber.length-1);
                    var positive = plainNumber.charAt(0) != '-';
                    if(isNaN(plainNumber.charAt(plainNumber.length-1))){
                      plainNumber = plainNumber.substr(0,plainNumber.length-1)
                    }
                    //use angular internal 'number' filter
                    plainNumber = $filter('number')(plainNumber / 100, 2).replace(/,/g, '');
                    if(positive && newVal == '-'){
                      plainNumber = '-' + plainNumber;
                    }
                    else if(!positive && newVal == '+'){
                      plainNumber = plainNumber.substr(1);
                    }
                    plainNumber.replace('.', ',');

                    //update the $viewValue
                    ctrl.$setViewValue(plainNumber);
                    //reflect on the DOM element
                    ctrl.$render();
                    //return the modified value to next parser
                    return plainNumber;
                });
            }
        };

}]);

MinhasSecond Plunker teminput = text e permite entrada negativa. Como o primeiro desentupidor, ele não permitirá um negativo como o primeiro caractere, somente depois que os números forem digitados. A segunda é que começa no décimo lugar, em vez dos centésimos. (se você digitar '3', verá '0,03', mas aqui mostra '0,3')

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

            function fromUser(text) {
                if (!text)
                return text;

                var rep = /[+]/g;
                var rem = /[-]/g;
                rep.exec(text);
                rem.exec(text);

                var indexp = rep.lastIndex;
                var indexm = rem.lastIndex;
                text = text.replace(/[+.-]/g, '');
                if (indexp > 0 || indexm > 0) {
                    if (indexp > indexm) text = "+" + text; // plus sign?
                    else text = "-" + text;
                }

                var transformedInput = text.replace(pattern, '');
                transformedInput = transformedInput.replace(/([0-9]{1,2}$)/, ".$1")
                ngModelCtrl.$setViewValue(transformedInput);
                ngModelCtrl.$render();
                return transformedInput;
            }

            ngModelCtrl.$parsers.push(fromUser);
        }
    };
}]);

Como posso reconciliar essas soluções ou adaptar uma para atender aos requisitos? Quero evitar bibliotecas extras ou complementos. Foi-me dito que a melhor abordagem seria estudar a fonte do filtro de moeda e recriar esse filtro com os requisitos adicionais. Adoraria fazer isso, mas realmente não tenho as habilidades necessárias agora. Essas duas diretrizes são o que eu tenho.

questionAnswers(3)

yourAnswerToTheQuestion