|
- // Copyright (c) 2013, Web Notes Technologies Pvt. Ltd. and Contributors
- // MIT License. See license.txt
-
- if(!window.wn) wn = {};
-
- function flt(v, decimals, number_format) {
- if(v==null || v=='')return 0;
-
- if(typeof v!=="number") {
- v = v + "";
-
- // strip currency symbol if exists
- if(v.indexOf(" ")!=-1) {
- v = v.split(" ")[1];
- }
-
- v = strip_number_groups(v, number_format);
-
- v=parseFloat(v);
- if(isNaN(v))
- v=0;
- }
-
- if(decimals!=null)
- return _round(v, decimals);
- return v;
- }
-
- function cint(v, def) {
- if(v===true)
- return 1;
- if(v===false)
- return 0;
- v=v+'';
- if(v!=="0")v=lstrip(v, ['0']);
- v=parseInt(v);
- if(isNaN(v))v=def===undefined?0:def;
- return v;
- }
-
- function strip_number_groups(v, number_format) {
- if(!number_format) number_format = get_number_format();
-
- // strip groups (,)
- if(get_number_format_info(number_format).group_sep==".") {
- v = v.replace(/\./g,'');
-
- // sanitize decimal separator to .
- v = v.replace(/,/g, ".");
- } else {
- v=v.replace(/,/g,'');
- }
-
- return v;
- }
-
-
- wn.number_format_info = {
- "#,###.##": {decimal_str:".", group_sep:",", precision:2},
- "#.###,##": {decimal_str:",", group_sep:".", precision:2},
- "# ###.##": {decimal_str:".", group_sep:" ", precision:2},
- "#,###.###": {decimal_str:".", group_sep:",", precision:3},
- "#,##,###.##": {decimal_str:".", group_sep:",", precision:2},
- "#.###": {decimal_str:"", group_sep:".", precision:0},
- "#,###": {decimal_str:"", group_sep:",", precision:0},
- }
-
- window.format_number = function(v, format, decimals){
- if (!format) {
- format = get_number_format();
- if(decimals == null) decimals = cint(wn.defaults.get_default("float_precision")) || 3;
- }
-
- info = get_number_format_info(format);
-
- //Fix the decimal first, toFixed will auto fill trailing zero.
- decimals = decimals || info.precision;
-
- v = flt(v, decimals, format);
-
- if(v<0) var is_negative = true;
- v = Math.abs(v);
-
- v = v.toFixed(decimals);
-
- var part = v.split('.');
-
- // get group position and parts
- var group_position = info.group_sep ? 3 : 0;
-
- if (group_position) {
- var integer = part[0];
- var str = '';
- var offset = integer.length % group_position;
- for (var i=integer.length; i>=0; i--) {
- var l = replace_all(str, info.group_sep, "").length;
- if(format=="#,##,###.##" && str.indexOf(",")!=-1) { // INR
- group_position = 2;
- l += 1;
- }
-
- str += integer.charAt(i);
-
- if (l && !((l+1) % group_position) && i!=0 ) {
- str += info.group_sep;
- }
- }
- part[0] = str.split("").reverse().join("");
- }
- if(part[0]+""=="") {
- part[0]="0";
- }
-
- // join decimal
- part[1] = part[1] ? (info.decimal_str + part[1]) : "";
-
- // join
- return (is_negative ? "-" : "") + part[0] + part[1];
- };
-
- function format_currency(v, currency, decimals) {
- var format = get_number_format(currency);
- var symbol = get_currency_symbol(currency);
-
- if(symbol)
- return symbol + " " + format_number(v, format, decimals);
- else
- return format_number(v, format, decimals);
- }
-
- function get_currency_symbol(currency) {
- if(wn.boot) {
- if(wn.boot.sysdefaults.hide_currency_symbol=="Yes")
- return null;
-
- if(!currency)
- currency = wn.boot.sysdefaults.currency;
-
- return wn.model.get_value(":Currency", currency, "symbol") || currency;
- } else {
- // load in template
- return wn.currency_symbols[currency];
- }
- }
-
- var global_number_format = null;
- function get_number_format(currency) {
- if(!global_number_format) {
- global_number_format = wn.boot.sysdefaults.number_format
- || wn.model.get_value("Currency", wn.boot.sysdefaults.currency, "number_format")
- || "#,###.##";
- }
-
- var number_format;
- if(currency && wn.boot) {
- number_format = wn.model.get_value("Currency", currency,
- "number_format");
- }
-
- return number_format || global_number_format;
- }
-
- function get_number_format_info(format) {
- var info = wn.number_format_info[format];
- if(!info) {
- info = {decimal_str:".", group_sep:",", precision:2};
- }
- return info;
- }
-
- function _round(num, precision) {
- var d = cint(precision);
- var m = Math.pow(10, d);
- var n = +(d ? num * m : num).toFixed(8); // Avoid rounding errors
- var i = Math.floor(n), f = n - i;
- var r = (f == 0.5) ? ((i % 2 == 0) ? i : i + 1) : Math.round(n);
- return d ? r / m : r;
- }
-
- function roundNumber(num, precision) {
- // backward compatibility
- return _round(num, precision);
- }
-
- function precision(fieldname, doc) {
- if(!doc) doc = cur_frm.doc;
- var df = wn.meta.get_docfield(doc.doctype, fieldname, doc.parent || doc.name);
- if(!df) console.log(fieldname + ": could not find docfield in method precision()");
- return wn.meta.get_field_precision(df, doc);
- }
-
- var lstrip = function(s, chars) {
- if(!chars) chars = ['\n', '\t', ' '];
- // strip left
- var first_char = s.substr(0,1);
- while(in_list(chars, first_char)) {
- var s = s.substr(1);
- first_char = s.substr(0,1);
- }
- return s;
- }
-
- function in_list(list, item) {
- if(!list) return false;
- for(var i=0, j=list.length; i<j; i++)
- if(list[i]==item) return true;
- return false;
- }
|