Numbers get converted to strings

https://groups.google.com/d/topic/knockoutjs/SPrzcgddoY4/discussion

by Nikolai Zujev

HTML

<script src="http://knockoutjs.com/js/jquery.tmpl.js"></script>
<script src="https://github.com/SteveSanderson/knockout/raw/master/build/output/knockout-latest.debug.js"></script>
<label>extend FLOAT: </label>
<input data-bind="value: units1" size="3" />
<span data-bind="text: ko.toJSON(units1)"></span>
<hr/>
<label>extend INTEGER: </label>
<input data-bind="value: units2" size="3" />
<span data-bind="text: ko.toJSON(units2)"></span>
<hr/>

JavaScript

(function(ko){
    function NumericExtender(target, defaultValue, isFloat) {
        var parse = function(value, defaultValue) {
                var parsed = isFloat ? parseFloat(value, 10) : parseInt(value, 10);
                return isNaN(parsed) ? (defaultValue || 0) : parsed;
            },
            result = ko.dependentObservable({
                read: function() {
                    return target();
                },
                write: function(value) {
                    var parsed = parse(value, defaultValue);
                    
                    (target() === parsed) ? target.notifySubscribers() : target(parsed);
                },
                deferEvaluation: true
            });
        
        isFloat = (!!isFloat || void(0) === isFloat);
        defaultValue = parse(defaultValue);        
        
        var parsed = parse(target(), defaultValue);
                    
        if (target() !== parsed) {
            target(parsed);
        }
        
        return result;
    };
 
    ko.extenders.integer = function(target, defaultValue) {
        return NumericExtender(target, defaultValue, false);
    };

    ko.extenders.float = function(target, defaultValue) {
        return NumericExtender(target, defaultValue, true);
    };
})(ko);

var viewModel = {
    units1: ko.observable(2.50).extend({float: 5.75}),
    units2: ko.observable(2.50).extend({integer: 7}),
};

viewModel.units1.subscribe(function(v){
    console.log(['upd-1', v]);
});

viewModel.units2.subscribe(function(v){
    console.log(['upd-2', v]);
});


ko.applyBindings(viewModel);