seitime-frappe/public/js/lib/number_formatter.js

84 lines
No EOL
2.3 KiB
JavaScript

/**
* Adapted from:
* -------------
* @preserve IntegraXor Web SCADA - JavaScript Number Formatter
* http://www.integraxor.com/
* author: KPL, KHL
* (c)2011 ecava
* Dual licensed under the MIT or GPL Version 2 licenses.
*/
////////////////////////////////////////////////////////////////////////////////
// param: Mask & Value
////////////////////////////////////////////////////////////////////////////////
window['format_number'] = function(v, m, decimals){
if (!m) {
m = get_number_format();
}
var info = number_format_info[m];
if(!info) {
info = {decimal_str:".", group_sep:",", precision:2};
}
if(isNaN(+v)) {
v=0;
};
//convert any string to number according to formation sign.
var format = m;
var v = m.charAt(0) == '-'? -v: +v;
var isNegative = v<0? v= -v: 0; //process only abs(), and turn on flag.
//Fix the decimal first, toFixed will auto fill trailing zero.
decimals = decimals || info.precision;
v = v.toFixed(decimals);
var part = v.split('.');
m = m.split(info.decimal_str);
var szSep = m[0].split( info.group_sep); //look for separator
m[0] = szSep.join(''); //join back without separator for counting the pos of any leading 0.
var pos_lead_zero = m[0] && m[0].indexOf('0');
if (pos_lead_zero > -1 ) {
while (part[0].length < (m[0].length - pos_lead_zero)) {
part[0] = '0' + part[0];
}
}
else if (+part[0] == 0){
part[0] = '';
}
v = v.split('.');
v[0] = part[0];
//process the first group separator from decimal (.) only, the rest ignore.
//get the length of the last slice of split result.
var pos_separator = ( szSep[1] && szSep[ szSep.length-1].length);
if (pos_separator) {
var integer = v[0];
var str = '';
var offset = integer.length % pos_separator;
for (var i=integer.length; i>=0; i--) {
var l = replace_all(str, info.group_sep, "").length;
if(format=="#,##,###.##" && str.indexOf(",")!=-1) { // INR
pos_separator = 2;
l += 1;
}
str += integer.charAt(i); //ie6 only support charAt for sz.
//-pos_separator so that won't trail separator on full length
if (l && !((l+1) % pos_separator) && i!=0 ) {
str += info.group_sep;
}
}
v[0] = str.split("").reverse().join("");
}
if(v[0]+""=="") {
v[0]="0";
}
v[1] = (m[1] && v[1])? info.decimal_str+v[1] : "";
return (isNegative?'-':'') + v[0] + v[1]; //put back any negation and combine integer and fraction.
};