Nelze vybrat více než 25 témat Téma musí začínat písmenem nebo číslem, může obsahovat pomlčky („-“) a může být dlouhé až 35 znaků.
 
 
 
 
 
 

198 řádky
4.5 KiB

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