与淘汰赛
问题描述:
货币格式我知道它已经回答过了,这里是它的代码(JS淘汰赛)与淘汰赛
ko.observable.fn.withCurrencyFormat = function (precision) {
var observable = this;
observable.formatted = ko.computed({
read: function (key) {
return '$' + (+observable()).toFixed(precision);
},
write: function (value) {
value = parseFloat(value.replace(/[^\.\d]/g, ""));
observable(isNaN(value) ? null : value); // Write to underlying storage
}
});
return observable;
};
但我怎么能处理这些情况?
- 用户删除0.00在文本字段,它应该默认回 为0.00,而不是在文本 领域保持空白
- 用户类型的字母,它也应该默认回0.00,而不是返回NaN的
答
在你read
功能,它产生的输出,在这里创建了NaN
:
+observable() // The + tries to "cast" the observable's value to a number
为了摆脱NaN
的,你必须做一个isNaN
检查:
var nr = +observable();
if (isNaN(nr)) {
nr = 0;
}
现在,在write
方法,该方法将输入,有无效输入null
返回值。更换这0
默认为$0.00
:
observable(isNaN(value) ? 0 : value);
如果你能确定计算的formatted
是唯一一个写入底层观察到的,你只需要修复其中一个(即你决定格式的值上将它们输入到系统或输出它们)。
下面的代码片段显示了链接到输入的这些修复程序。就我个人而言,我认为这种行为更适合extender,但我不确定它是否重要。
ko.observable.fn.withCurrencyFormat = function (precision) {
var observable = this;
observable.formatted = ko.computed({
read: function (key) {
var nr = +observable();
if (isNaN(nr)) nr = 0;
return '$' + nr.toFixed(precision);
},
write: function (value) {
value = parseFloat(value.replace(/[^\.\d]/g, ""));
observable(isNaN(value) ? 0 : value);
}
}).extend({notify: 'always'});
return observable;
};
var obs = ko.observable(0).extend({notify: 'always'});
var val = obs.withCurrencyFormat(2).formatted;
ko.applyBindings({
val: val
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.2.0/knockout-min.js"></script>
<input data-bind="value: val">