与淘汰赛

问题描述:

货币格式我知道它已经回答过了,这里是它的代码(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; 
}; 

但我怎么能处理这些情况?

  1. 用户删除0.00在文本字段,它应该默认回 为0.00,而不是在文本 领域保持空白
  2. 用户类型的字母,它也应该默认回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">