You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

208 lines
4.9 KiB

  1. // Copyright (c) 2013, Web Notes Technologies Pvt. Ltd. and Contributors
  2. // MIT License. See license.txt
  3. if(!window.wn) wn = {};
  4. function flt(v, decimals, number_format) {
  5. if(v==null || v=='')return 0;
  6. if(typeof v!=="number") {
  7. v = v + "";
  8. // strip currency symbol if exists
  9. if(v.indexOf(" ")!=-1) {
  10. v = v.split(" ")[1];
  11. }
  12. v = strip_number_groups(v, number_format);
  13. v=parseFloat(v);
  14. if(isNaN(v))
  15. v=0;
  16. }
  17. if(decimals!=null)
  18. return _round(v, decimals);
  19. return v;
  20. }
  21. function cint(v, def) {
  22. if(v===true)
  23. return 1;
  24. if(v===false)
  25. return 0;
  26. v=v+'';
  27. if(v!=="0")v=lstrip(v, ['0']);
  28. v=parseInt(v);
  29. if(isNaN(v))v=def===undefined?0:def;
  30. return v;
  31. }
  32. function strip_number_groups(v, number_format) {
  33. if(!number_format) number_format = get_number_format();
  34. // strip groups (,)
  35. if(get_number_format_info(number_format).group_sep==".") {
  36. v = v.replace(/\./g,'');
  37. // sanitize decimal separator to .
  38. v = v.replace(/,/g, ".");
  39. } else {
  40. v=v.replace(/,/g,'');
  41. }
  42. return v;
  43. }
  44. wn.number_format_info = {
  45. "#,###.##": {decimal_str:".", group_sep:",", precision:2},
  46. "#.###,##": {decimal_str:",", group_sep:".", precision:2},
  47. "# ###.##": {decimal_str:".", group_sep:" ", precision:2},
  48. "#,###.###": {decimal_str:".", group_sep:",", precision:3},
  49. "#,##,###.##": {decimal_str:".", group_sep:",", precision:2},
  50. "#.###": {decimal_str:"", group_sep:".", precision:0},
  51. "#,###": {decimal_str:"", group_sep:",", precision:0},
  52. }
  53. window.format_number = function(v, format, decimals){
  54. if (!format) {
  55. format = get_number_format();
  56. if(decimals == null) decimals = cint(wn.defaults.get_default("float_precision")) || 3;
  57. }
  58. info = get_number_format_info(format);
  59. //Fix the decimal first, toFixed will auto fill trailing zero.
  60. decimals = decimals || info.precision;
  61. v = flt(v, decimals, format);
  62. if(v<0) var is_negative = true;
  63. v = Math.abs(v);
  64. v = v.toFixed(decimals);
  65. var part = v.split('.');
  66. // get group position and parts
  67. var group_position = info.group_sep ? 3 : 0;
  68. if (group_position) {
  69. var integer = part[0];
  70. var str = '';
  71. var offset = integer.length % group_position;
  72. for (var i=integer.length; i>=0; i--) {
  73. var l = replace_all(str, info.group_sep, "").length;
  74. if(format=="#,##,###.##" && str.indexOf(",")!=-1) { // INR
  75. group_position = 2;
  76. l += 1;
  77. }
  78. str += integer.charAt(i);
  79. if (l && !((l+1) % group_position) && i!=0 ) {
  80. str += info.group_sep;
  81. }
  82. }
  83. part[0] = str.split("").reverse().join("");
  84. }
  85. if(part[0]+""=="") {
  86. part[0]="0";
  87. }
  88. // join decimal
  89. part[1] = part[1] ? (info.decimal_str + part[1]) : "";
  90. // join
  91. return (is_negative ? "-" : "") + part[0] + part[1];
  92. };
  93. function format_currency(v, currency, decimals) {
  94. var format = get_number_format(currency);
  95. var symbol = get_currency_symbol(currency);
  96. if(symbol)
  97. return symbol + " " + format_number(v, format, decimals);
  98. else
  99. return format_number(v, format, decimals);
  100. }
  101. function get_currency_symbol(currency) {
  102. if(wn.boot) {
  103. if(wn.boot.sysdefaults.hide_currency_symbol=="Yes")
  104. return null;
  105. if(!currency)
  106. currency = wn.boot.sysdefaults.currency;
  107. return wn.model.get_value(":Currency", currency, "symbol") || currency;
  108. } else {
  109. // load in template
  110. return wn.currency_symbols[currency];
  111. }
  112. }
  113. var global_number_format = null;
  114. function get_number_format(currency) {
  115. if(!global_number_format) {
  116. global_number_format = wn.boot.sysdefaults.number_format
  117. || wn.model.get_value("Currency", wn.boot.sysdefaults.currency, "number_format")
  118. || "#,###.##";
  119. }
  120. var number_format;
  121. if(currency && wn.boot) {
  122. number_format = wn.model.get_value("Currency", currency,
  123. "number_format");
  124. }
  125. return number_format || global_number_format;
  126. }
  127. function get_number_format_info(format) {
  128. var info = wn.number_format_info[format];
  129. if(!info) {
  130. info = {decimal_str:".", group_sep:",", precision:2};
  131. }
  132. return info;
  133. }
  134. function _round(num, precision) {
  135. var d = cint(precision);
  136. var m = Math.pow(10, d);
  137. var n = +(d ? num * m : num).toFixed(8); // Avoid rounding errors
  138. var i = Math.floor(n), f = n - i;
  139. var r = (f == 0.5) ? ((i % 2 == 0) ? i : i + 1) : Math.round(n);
  140. return d ? r / m : r;
  141. }
  142. function roundNumber(num, precision) {
  143. // backward compatibility
  144. return _round(num, precision);
  145. }
  146. function precision(fieldname, doc) {
  147. if(!doc) doc = cur_frm.doc;
  148. var df = wn.meta.get_docfield(doc.doctype, fieldname, doc.parent || doc.name);
  149. if(!df) console.log(fieldname + ": could not find docfield in method precision()");
  150. return wn.meta.get_field_precision(df, doc);
  151. }
  152. var lstrip = function(s, chars) {
  153. if(!chars) chars = ['\n', '\t', ' '];
  154. // strip left
  155. var first_char = s.substr(0,1);
  156. while(in_list(chars, first_char)) {
  157. var s = s.substr(1);
  158. first_char = s.substr(0,1);
  159. }
  160. return s;
  161. }
  162. function in_list(list, item) {
  163. if(!list) return false;
  164. for(var i=0, j=list.length; i<j; i++)
  165. if(list[i]==item) return true;
  166. return false;
  167. }