:: Forum >> Version 2 >>

Problem with AW.Formats.Number

More information on this topic is available in the documentation section: /general.bugs/2-0-0.html.

Hello, we are having some problems formatting numbers using AW.Formats.Number.

We want a format with 6 decimal positions, so we are using the following format:
var decimal_6decFormat = new AW.Formats.Number
       
decimal_6decFormat.setTextFormat("###.######");
 
It works fine most of the time, but when the value is 0, then the grid shows: “5e-7”. We have traced the code and the problem seems to be in the function doFormat:

var doFormat = function(value){
                        var 
multiplier this._multiplier;
                        var 
abs = (value<0-value value;
                        var 
delta = (value<0-0.5 : +0.5;
                        var 
rounded = (Math.round(value multiplier) + delta)/multiplier "";
                        if (
abs<1000) {return rounded.replace(this.p1this.r1)}
                        if (
abs<1000000) {return rounded.replace(this.p2this.r2)}
                        if (
abs<1000000000) {return rounded.replace(this.p3this.r3)}
                        return 
rounded.replace(this.p4this.r4);
            };
 
Any idea? Because our client only wants it with the format 0.000000…

In addition, it is not only a matter of format, because if we send 5e-7, we are storing 0.0000005 which is not 0 (and for this application, precision is very important)

Thanks in advance,

José Luis.

Jose Luis (Spain)
Thursday, April 6, 2006
Here is a fix for AW.Formats.Number which corrects this problem. The modified code also allows more than 6 digits after the decimal point and also allows 0 decimals using formats like #. or #,###.

Add this code at the end of aw.js -

AW.Formats.Number.create = function(){

    var 
obj this.prototype;

    
obj.dataToValue = function(v){
        return 
Number(("" v).replace(numPattern""));
    };

    
obj.textToValue = function(v){
        return 
Number(("" v).replace(numPattern""));
    };

    var 
numPattern = /[^0-9.\-+]+/gm;

    var 
noFormat = function(value){
        return 
"" value;
    };

    var 
doFormat = function(value){
        var 
abs = (value<0-value value;
        var 
rounded value.toFixed(this._decimals);
        if (
abs<1000) {return rounded.replace(this.p1this.r1)}
        if (
abs<1000000) {return rounded.replace(this.p2this.r2)}
        if (
abs<1000000000) {return rounded.replace(this.p3this.r3)}
        return 
rounded.replace(this.p4this.r4);
    };


    
obj.setTextFormat = function(format){
        var 
pattern = /^([^0#]*)([0#]*)([ .,]?)([0#]|[0#]{3})([.,])([0#]*)([^0#]*)$/;
        var 
format.match(pattern);

        if (!
f) {
            
this.valueToText = function(value){return "" value};
            
this.dataToText = function(value){return "" value};
            return;
        }

        
this.valueToText doFormat;
        
this.dataToText = function(v){return doFormat.call(thisNumber(("" v).replace(numPattern"")))};

        var 
rs f[1]; // result start
        
var rg f[3]; // result group separator;
        
var rd f[5]; // result decimal separator;
        
var re f[7]; // result end

        
this._decimals f[6].length;

        var 
ps "^(-?\\d+)"pm "(\\d{3})"pe "\\.(\\d{" this._decimals "})$";

        if (!
this._decimals) {
            
pe "($)";
            
rd "";
        }

        
this.p1 = new RegExp(ps pe);
        
this.p2 = new RegExp(ps pm pe);
        
this.p3 = new RegExp(ps pm pm pe);
        
this.p4 = new RegExp(ps pm pm pm pe);

        
this.r1 rs "$1" rd "$2" re;
        
this.r2 rs "$1" rg "$2" rd "$3" re;
        
this.r3 rs "$1" rg "$2" rg "$3" rd "$4" re;
        
this.r4 rs "$1" rg "$2" rg "$3" rg "$4" rd "$5" re;

    };

    
obj.setTextFormat("");
};


 
Alex (ActiveWidgets)
Thursday, April 6, 2006
Thanks Alex, it works great! ;)
Jose Luis (Spain)
Friday, April 7, 2006
Hi, we are having problem formatting numbers with AW.Formats.Number.
We want a format sth like this (xxx,xxx,xxx.xx) for atleast 9 digits, i have tried various formats here but noone helped:

var formatObj = new AW.Formats.Number;
formatObj.setTextFormat("$#,###.##");
// formatObj.setTextFormat("$###,###.##");
// formatObj.setTextFormat("$###,###,###.##");
// formatObj.setTextFormat("$###.##");

It always give the same output, 1,101.90 for 452101.90
1,152.66 for 626,152.66, etc.

What i figure out is this:

this.dataToText = function (v) {
return doFormat.call(this, Number(("" + v).replace(numPattern, "")));
};

This function returns false value.

Any Idea to solve this kinda problem. Thanks in advance

Mukesh Singla
Wednesday, May 17, 2006
i think you're using variable v for a second time somewhere... or numPattern - it's most common mistake or error (choose one ;]). if not these it must be something with other variables and it's naming! ;]
konrad
Monday, July 31, 2006



This topic is archived.

Back to /general.bugs/2-0-0.html

Documentation:

Forum search