You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@myfaces.apache.org by jw...@apache.org on 2010/01/21 05:05:25 UTC

svn commit: r901521 - in /myfaces/trinidad/branches/1.2.12.2-branch/trinidad-impl/src/main/javascript/META-INF/adf/jsLibs: CoreFormat.js NumberFormat.js

Author: jwaldman
Date: Thu Jan 21 04:05:15 2010
New Revision: 901521

URL: http://svn.apache.org/viewvc?rev=901521&view=rev
Log:
TRINIDAD-1678 TrNumberFormat.prototype.numberToString doesn't account for numbers represented via scientific notation
commit for Cale Scholl

Modified:
    myfaces/trinidad/branches/1.2.12.2-branch/trinidad-impl/src/main/javascript/META-INF/adf/jsLibs/CoreFormat.js
    myfaces/trinidad/branches/1.2.12.2-branch/trinidad-impl/src/main/javascript/META-INF/adf/jsLibs/NumberFormat.js

Modified: myfaces/trinidad/branches/1.2.12.2-branch/trinidad-impl/src/main/javascript/META-INF/adf/jsLibs/CoreFormat.js
URL: http://svn.apache.org/viewvc/myfaces/trinidad/branches/1.2.12.2-branch/trinidad-impl/src/main/javascript/META-INF/adf/jsLibs/CoreFormat.js?rev=901521&r1=901520&r2=901521&view=diff
==============================================================================
--- myfaces/trinidad/branches/1.2.12.2-branch/trinidad-impl/src/main/javascript/META-INF/adf/jsLibs/CoreFormat.js (original)
+++ myfaces/trinidad/branches/1.2.12.2-branch/trinidad-impl/src/main/javascript/META-INF/adf/jsLibs/CoreFormat.js Thu Jan 21 04:05:15 2010
@@ -957,15 +957,17 @@
     var floater = false;
     if (parsefloat != null)
     {
-      // Why parseInt(parseFloat(numberString))? Because the server NumberConverter behaves the same 
-      // way as parseFloat. Note the following:
+      // Why trim leading zeroes? parseFloat behaves the same way as the server NumberConverter, 
+      // but parseInt interprets octal, and thus we need to trim leading zeroes. 
+      // Note the following:
       // parseInt interprets octal and hex:
       //   alert(parseInt("0xA")); // returns 10
       //   alert(parseInt("008")); // returns 0, as it stops parsing octal at the first invalid character, 8
       // parseFloat interprets neither octal nor hex:
       //   alert(parseFloat("0xA")); // returns 0, as it stops parsing decimal at the first invalid character, x
       //   alert(parseFloat("008")); // returns 8
-      result = parsefloat ? parseFloat(numberString) : parseInt(parseFloat(numberString));
+      numberString = TrNumberFormat.trimLeadingZeroes(numberString);
+      result = parsefloat ? parseFloat(numberString) : parseInt(numberString);
     }
     else
     {

Modified: myfaces/trinidad/branches/1.2.12.2-branch/trinidad-impl/src/main/javascript/META-INF/adf/jsLibs/NumberFormat.js
URL: http://svn.apache.org/viewvc/myfaces/trinidad/branches/1.2.12.2-branch/trinidad-impl/src/main/javascript/META-INF/adf/jsLibs/NumberFormat.js?rev=901521&r1=901520&r2=901521&view=diff
==============================================================================
--- myfaces/trinidad/branches/1.2.12.2-branch/trinidad-impl/src/main/javascript/META-INF/adf/jsLibs/NumberFormat.js (original)
+++ myfaces/trinidad/branches/1.2.12.2-branch/trinidad-impl/src/main/javascript/META-INF/adf/jsLibs/NumberFormat.js Thu Jan 21 04:05:15 2010
@@ -338,6 +338,10 @@
     number = (number*-1);
 
   var numberString = number + "";
+  
+  // check for scientific notation
+  numberString = TrNumberFormat.scientificToExpanded(numberString);
+  
   var index = numberString.indexOf(".");
   var numberStringLength = numberString.length;
   var ints;
@@ -418,6 +422,70 @@
 }
 
 /**
+ * Static utility function.
+ * Converts a number string from scientific notation to standard expanded notation.
+ */
+TrNumberFormat.scientificToExpanded = function(numberString)
+{
+  // check for scientific notation
+  var expIndex = numberString.indexOf('e');
+  if (expIndex == -1)
+    return numberString;
+    
+  var prefix = "";
+  if (numberString.charAt(0) == '-')
+  {
+    prefix = "-";
+    numberString = numberString.substring(1);
+    expIndex -= 1;
+  }
+  
+  var isPosExp = numberString.charAt(expIndex + 1) == '+';
+  var exp = parseInt(numberString.substring(expIndex + 2));
+  var nFractionDigits = expIndex - 2;
+  var zeroes = "";
+  
+  // The exponent should always be greater than the number of fraction digits.
+  if (isPosExp)
+  {
+    for (var i = 0; i < exp - nFractionDigits; ++i)
+      zeroes += "0";
+      
+    return prefix + numberString.charAt(0) + numberString.substring(2, expIndex) + zeroes;
+  }
+  
+  // ELSE: negative exponent
+  for (var i = 0; i < exp - 1; ++i)
+    zeroes += "0";
+    
+  return prefix + "0." + zeroes + numberString.charAt(0) + numberString.substring(2, expIndex);
+}
+
+/**
+ * Static utility function.
+ * Trims extraneous leading zeroes.
+ */
+TrNumberFormat.trimLeadingZeroes = function(numberString)
+{
+  var strbuf = [];
+  var i, char;
+  for (i = 0; i < numberString.length; ++i)
+  {
+    char = numberString.charAt(i);
+    
+    if ((char >= '1' && char <= '9') || char == '.')
+      break;
+      
+    if (char == '0' && i+1 < numberString.length && numberString.charAt(i+1) != '.')
+      continue;
+      
+    strbuf.push(char);
+  }
+  
+  return strbuf.join('') + numberString.substring(i);
+}
+
+/**
  * helper for rounding values
  */
 TrNumberFormat.prototype.getRounded = function(val)