当前位置: 首页 > 面试题库 >

Angular中的资金格式指令

曹涵润
2023-03-14
问题内容

我需要一个指令来过滤货币字段,因此用户只需要输入就可以了,并暗示了十进制。

需求:

  1. 将十进制字段格式化为用户类型-

在用户键入时从百分之一开始。 因此,他们将键入“ 4”并看到“ 0.04”,键入“ 42”并看到“ 0.42”,键入298023并看到“
2980.23”

  1. 字段必须为数字
  2. 必须允许底片 -
  3. 允许0.00作为数字输入
  4. 理想情况下将使用type =“ number”,但可以使用“ type = text”
  5. 您应该可以清除该字段为空。

ng-currency过滤器无法完全满足这些要求。请查看pl客的行为,以了解我的意思。

我的第一柱塞有“输入=文本”,并允许负数。一个问题是您不能输入负数作为第一个数字。当您清除该字段时,它返回到“
0.00”,但应该完全清除。

   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;
                });
            }
        };

}]);

我的第二个柱塞具有input = text负输入。像第一个字符一样,只有键入数字后,才不允许将负号作为第一个字符。第二个是它从十分之一而不是百分之一百开始。(如果您输入“
3”,则应该看到“ 0.03”,但此处显示的是“ 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);
        }
    };
}]);

如何调和这些解决方案或量身定制解决方案以满足要求?我想避免额外的库或附加组件。有人告诉我最好的方法是研究货币过滤器的来源,并根据其他要求重新创建该过滤器。我很乐意这样做,但是我现在真的不具备此技能。这两个指令就是我所拥有的。


问题答案:

检查以下简单指令:

app.directive('price', [function () {
    return {
        require: 'ngModel',
        link: function (scope, element, attrs, ngModel) {
            attrs.$set('ngTrim', "false");

            var formatter = function(str, isNum) {
                str = String( Number(str || 0) / (isNum?1:100) );
                str = (str=='0'?'0.0':str).split('.');
                str[1] = str[1] || '0';
                return str[0].replace(/(\d)(?=(\d\d\d)+(?!\d))/g, '$1,') + '.' + (str[1].length==1?str[1]+'0':str[1]);
            }
            var updateView = function(val) {
                scope.$applyAsync(function () {
                    ngModel.$setViewValue(val || '');
                    ngModel.$render();
                });
            }
            var parseNumber = function(val) {
                var modelString = formatter(ngModel.$modelValue, true);
                var sign = {
                    pos: /[+]/.test(val),
                    neg: /[-]/.test(val)
                }
                sign.has = sign.pos || sign.neg;
                sign.both = sign.pos && sign.neg;

                if (!val || sign.has && val.length==1 || ngModel.$modelValue && Number(val)===0) {
                    var newVal = (!val || ngModel.$modelValue && Number()===0?'':val);
                    if (ngModel.$modelValue !== newVal)
                        updateView(newVal);

                    return '';
                }
                else {
                    var valString = String(val || '');
                    var newSign = (sign.both && ngModel.$modelValue>=0 || !sign.both && sign.neg?'-':'');
                    var newVal = valString.replace(/[^0-9]/g,'');
                    var viewVal = newSign + formatter(angular.copy(newVal));

                    if (modelString !== valString)
                        updateView(viewVal);

                    return (Number(newSign + newVal) / 100) || 0;
                }
            }
            var formatNumber = function(val) {
                if (val) {
                    var str = String(val).split('.');
                    str[1] = str[1] || '0';
                    val = str[0] + '.' + (str[1].length==1?str[1]+'0':str[1]);
                }
                return parseNumber(val);
            }

            ngModel.$parsers.push(parseNumber);
            ngModel.$formatters.push(formatNumber);
        }
    };
}]);

并像这样使用它:

<input type="text" ng-model="number" price >

在此
PLUNKER中
实时观看(7月14日)



 类似资料:
  • 我创建了一个货币指令,我将在每个需要货币格式的输入元素中使用它。 所以我有两个主机听众,一个是OnFocus,第二个是Blur 而且效果很好。但当我通过绑定设置输入值时,我需要格式化输入值 所以当我打开一个模态时,我得到了无格式的值...NgOnInit不起作用,因为它早期加注太多 这是我的指令代码。 我的解决方案是在ngOnInit中设置一个时间间隔... 有没有人知道我可以使用哪个主机接收器,

  • 问题内容: 现场演示 我使用指令显示相对时间戳: 默认情况下,其格式为“一天前”,“ 5天前”等。 如何将格式更改为“ 1d”,“ 5d”,“ 3h”等? 问题答案: 您可以在配置或应用开始的某个位置自定义人性化。 关于RealtiveTime的文档 示例:http: //jsbin.com/satohazu/1/edit

  • 问题内容: 我正在使用角度以这种格式显示日期 如何显示像 使用角 有没有使用Angular JS-的直接方法(我可以使用普通的jQuery) 问题答案: 使用日期的角度过滤器。 请参阅以下链接。 http://docs.angularjs.org/api/ng.filter:date

  • 每日净流多列表(商品) 接口名称 commodity_flow_long 接口描述 每日净流多列表(商品)接口 请求参数 参数名 说明 举例 date 查询日期 2018-08-08 返回参数 参数名 类型 说明 broker string 席位 money float 流多资金,单位元 variety string 品种编码 示例代码 from akshare import pro_api pr

  • 问题内容: 在Jenkins,我们将“轮询SCM”计划设置为。但是詹金斯建议 有什么区别和? 问题答案: 当然有区别! -是小时,当分钟== 0时(即1:00、2:00,..) -每分钟 查看指南以获取更多信息。

  • 80386指令编码信息包括操作的声明,操作数的类型以及操作数的位置。如果操作数位于存储器中,指令必须选择,显示的或隐式的,哪个当前可寻址段包含这些操作数。 80386指令由各种要素构成并有着不同的格式。指令的详尽描述在附录B(译者注:附录A ?);指令要素在下面描述。在这些指令要素中,只有一个,操作码,是必须的。其他的要素依据涉及到的特定操作和操作数的类型和位置可有可无。指令要素,以出现的顺序描述