我需要一个指令来过滤货币字段,因此用户只需要输入就可以了,并暗示了十进制。
需求:
在用户键入时从百分之一开始。 因此,他们将键入“ 4”并看到“ 0.04”,键入“ 42”并看到“ 0.42”,键入298023并看到“
2980.23”
-
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 ?);指令要素在下面描述。在这些指令要素中,只有一个,操作码,是必须的。其他的要素依据涉及到的特定操作和操作数的类型和位置可有可无。指令要素,以出现的顺序描述