Add client-side money formatting
authorColeman Watts <coleman@civicrm.org>
Wed, 14 Aug 2013 20:28:48 +0000 (13:28 -0700)
committerColeman Watts <coleman@civicrm.org>
Wed, 14 Aug 2013 20:28:48 +0000 (13:28 -0700)
CRM/Core/Resources.php
js/Common.js

index 4868cba49132936777476d4bac2b034a56e348a5..4854e9aac45feeb968bc768fa674f7092f92465e 100644 (file)
@@ -453,9 +453,10 @@ class CRM_Core_Resources {
         }
       }
 
-      // Initialize CRM.url
+      // Initialize CRM.url and CRM.formatMoney
       $url = CRM_Utils_System::url('civicrm/example', 'placeholder', FALSE, NULL, FALSE);
-      $js = "CRM.url('init', '$url');";
+      $js = "CRM.url('init', '$url');\n";
+      $js .= "CRM.formatMoney('init', '" . CRM_Utils_Money::format(1234.56) . "');";
       $this->addScript($js, $jsWeight++, $region);
 
       // Add global settings
index 457e3d77c68b875ea060080b5e926f3c0795ec1d..09e65a03197b98538081192512987d1263d7344b 100644 (file)
@@ -879,4 +879,33 @@ CRM.validate = CRM.validate || {
       $(this).toggleClass('collapsed');
     });
   };
+
+  /**
+   * Clientside currency formatting
+   * @param value
+   * @param format
+   * @return string
+   */
+  var currencyTemplate;
+  CRM.formatMoney = function(value, format) {
+    var decimal, separator, sign, i, j, result;
+    if (value === 'init' && format) {
+      currencyTemplate = format;
+      return;
+    }
+    format = format || currencyTemplate;
+    result = /1(.?)234(.?)56/.exec(format);
+    if (result === null) {
+      return 'Invalid format passed to CRM.formatMoney';
+    }
+    separator = result[1];
+    decimal = result[2];
+    sign = (value < 0) ? '-' : '';
+    //extracting the absolute value of the integer part of the number and converting to string
+    i = parseInt(value = Math.abs(value).toFixed(2)) + '';
+
+    j = ((j = i.length) > 3) ? j % 3 : 0;
+    result = sign + (j ? i.substr(0, j) + separator : '') + i.substr(j).replace(/(\d{3})(?=\d)/g, "$1" + separator) + (2 ? decimal + Math.abs(value - i).toFixed(2).slice(2) : '');
+    return format.replace(/1.*234.*56/, result);
+  };
 })(jQuery);