You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@myfaces.apache.org by an...@apache.org on 2014/10/01 17:26:42 UTC

svn commit: r1628735 - in /myfaces/trinidad/trunk: trinidad-api/src/main/java/org/apache/myfaces/trinidad/convert/ trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/convert/ trinidad-impl/src/main/javascript/META-INF/adf/jsLibs/

Author: andys
Date: Wed Oct  1 15:26:41 2014
New Revision: 1628735

URL: http://svn.apache.org/r1628735
Log:
TRINIDAD-2511 rounding mode is not honoured on the client while using number converter

Thanks for the fix Ashwin.

Modified:
    myfaces/trinidad/trunk/trinidad-api/src/main/java/org/apache/myfaces/trinidad/convert/NumberConverter.java
    myfaces/trinidad/trunk/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/convert/NumberConverter.java
    myfaces/trinidad/trunk/trinidad-impl/src/main/javascript/META-INF/adf/jsLibs/NumberConverter.js
    myfaces/trinidad/trunk/trinidad-impl/src/main/javascript/META-INF/adf/jsLibs/NumberFormat.js

Modified: myfaces/trinidad/trunk/trinidad-api/src/main/java/org/apache/myfaces/trinidad/convert/NumberConverter.java
URL: http://svn.apache.org/viewvc/myfaces/trinidad/trunk/trinidad-api/src/main/java/org/apache/myfaces/trinidad/convert/NumberConverter.java?rev=1628735&r1=1628734&r2=1628735&view=diff
==============================================================================
--- myfaces/trinidad/trunk/trinidad-api/src/main/java/org/apache/myfaces/trinidad/convert/NumberConverter.java (original)
+++ myfaces/trinidad/trunk/trinidad-api/src/main/java/org/apache/myfaces/trinidad/convert/NumberConverter.java Wed Oct  1 15:26:41 2014
@@ -1621,6 +1621,16 @@ public class NumberConverter 
   {
     return _facesBean.getProperty(_NEGATIVE_SUFFIX_KEY) != null;
   }
+  
+  /**
+   * Return true if a non-null rounding mode has been set via {@link #setRoundingMode(RoundingMode)}. 
+   * If not set, return false;
+   * @return true, if the rounding mode has been set. 
+   */
+  public boolean isRoundingModeSet()
+  {
+    return _facesBean.getProperty(_ROUNDING_MODE_KEY) != null;
+  }
         
   private static final FacesBean.Type _TYPE = new FacesBean.Type();
 

Modified: myfaces/trinidad/trunk/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/convert/NumberConverter.java
URL: http://svn.apache.org/viewvc/myfaces/trinidad/trunk/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/convert/NumberConverter.java?rev=1628735&r1=1628734&r2=1628735&view=diff
==============================================================================
--- myfaces/trinidad/trunk/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/convert/NumberConverter.java (original)
+++ myfaces/trinidad/trunk/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/convert/NumberConverter.java Wed Oct  1 15:26:41 2014
@@ -153,8 +153,8 @@ public class NumberConverter 
     {
       // order of parameters: 
       // pattern, type, locale, messagesMap, isInt, isGrouped, CurrencyCode, CurrencySymbol,
-      // maxFractions, maxInts, minFractions, minInts, negPrefix, negSuffix  
-      params = new Object[14];
+      // maxFractions, maxInts, minFractions, minInts, negPrefix, negSuffix, roundingMode  
+      params = new Object[15];
     }
     else
     {
@@ -183,6 +183,7 @@ public class NumberConverter 
       params[11] = this.isMinimumIntegerDigitsSet() ? this.getMinIntegerDigits() : null;
       params[12] = this.isNegativePrefixSet() ? this.getNegativePrefix() : null;
       params[13] = this.isNegativeSuffixSet() ? this.getNegativeSuffix() : null;
+      params[14] = this.isRoundingModeSet() ? this.getRoundingMode().toString() : null;
     }
 
     return params;
@@ -203,7 +204,8 @@ public class NumberConverter 
       this.isMinimumFractionDigitsSet() ||
       this.isMinimumIntegerDigitsSet() ||
       this.isNegativePrefixSet() ||
-      this.isNegativeSuffixSet());
+      this.isNegativeSuffixSet() ||
+      this.isRoundingModeSet());
   }
   
   private String _getTrNumberConverter(

Modified: myfaces/trinidad/trunk/trinidad-impl/src/main/javascript/META-INF/adf/jsLibs/NumberConverter.js
URL: http://svn.apache.org/viewvc/myfaces/trinidad/trunk/trinidad-impl/src/main/javascript/META-INF/adf/jsLibs/NumberConverter.js?rev=1628735&r1=1628734&r2=1628735&view=diff
==============================================================================
--- myfaces/trinidad/trunk/trinidad-impl/src/main/javascript/META-INF/adf/jsLibs/NumberConverter.js (original)
+++ myfaces/trinidad/trunk/trinidad-impl/src/main/javascript/META-INF/adf/jsLibs/NumberConverter.js Wed Oct  1 15:26:41 2014
@@ -34,7 +34,8 @@ function TrNumberConverter(
   minFractionDigits,
   minIntegerDigits,
   negativePrefix,
-  negativeSuffix)
+  negativeSuffix,
+  roundingMode)
 {
   this._pattern = pattern;
   this._type = type;
@@ -48,6 +49,7 @@ function TrNumberConverter(
   this._minIntegerDigits = minIntegerDigits;
   this._negativePrefix = negativePrefix;
   this._negativeSuffix = negativeSuffix;
+  this._roundingMode = roundingMode;
 
   //set the integerOnly value
   if(integerOnly !== undefined)
@@ -66,7 +68,15 @@ function TrNumberConverter(
   
   // for debugging
   this._class = "TrNumberConverter";
-
+  
+  TrNumberConverter.ROUND_UP =           "UP";
+  TrNumberConverter.ROUND_DOWN =         "DOWN";
+  TrNumberConverter.ROUND_CEILING =      "CEILING";
+  TrNumberConverter.ROUND_FLOOR =        "FLOOR";
+  TrNumberConverter.ROUND_HALF_UP =      "HALF_UP";
+  TrNumberConverter.ROUND_HALF_DOWN =    "HALF_DOWN";
+  TrNumberConverter.ROUND_HALF_EVEN =    "HALF_EVEN";
+  TrNumberConverter.ROUND_UNNECESSARY =  "UNNECESSARY";
 }
 
 TrNumberConverter.prototype = new TrConverter();
@@ -166,6 +176,20 @@ TrNumberConverter.prototype.isIntegerOnl
   return this._integerOnly;
 }
 
+TrNumberConverter.prototype.setRoundingMode = function(roundingMode)
+{
+  this._roundingMode = roundingMode;
+}
+TrNumberConverter.prototype.getRoundingMode = function()
+{
+  return this._roundingMode;
+}
+TrNumberConverter.prototype.isJSDefaultRoundingMode = function()
+{
+  // JavaScript using HALF_UP rounding mode
+  return this._roundingMode == TrNumberConverter.ROUND_HALF_UP;
+}
+
 TrNumberConverter.prototype.getFormatHint = function()
 {
   if(this._messages && this._messages["hintPattern"])
@@ -211,7 +235,10 @@ TrNumberConverter.prototype.getAsString 
       }
       else
       {
-        return this._numberFormat.format(parseFloat(number.toFixed(this._numberFormat.getMaximumFractionDigits())));
+        // The default rounding mode in JS is HALF-UP. 
+        // If a rounding mode other than HALF-UP is specified, do not attempt to format the number
+        var fmtNumber = (false)? number.toFixed(this._numberFormat.getMaximumFractionDigits()) : number;
+        return this._numberFormat.format(parseFloat(fmtNumber));
       }
     }
   }
@@ -336,7 +363,10 @@ TrNumberConverter.prototype.getAsObject 
                          label,
                          !this.isIntegerOnly());
 
-    parsedValue = parseFloat(parsedValue.toFixed(this._numberFormat.getMaximumFractionDigits()));
+    // The default rounding mode in JS is HALF-UP. 
+    // If a rounding mode other than HALF-UP is specified, do not attempt to format the number
+    var fmtNumber = (this.isJSDefaultRoundingMode())? parsedValue.toFixed(this._numberFormat.getMaximumFractionDigits()) : parsedValue; 
+    parsedValue = parseFloat(fmtNumber);
 
     if(this._type=="percent")
     {
@@ -398,7 +428,8 @@ TrNumberConverter.prototype._initNumberF
       "maxFractionDigits": this.getMaxFractionDigits(),
       "maxIntegerDigits": this.getMaxIntegerDigits(),
       "minFractionDigits": this.getMinFractionDigits(),
-      "minIntegerDigits": this.getMinIntegerDigits()
+      "minIntegerDigits": this.getMinIntegerDigits(),
+      "roundingMode": this.getRoundingMode()
     };
                       
   if(this._type=="percent")

Modified: myfaces/trinidad/trunk/trinidad-impl/src/main/javascript/META-INF/adf/jsLibs/NumberFormat.js
URL: http://svn.apache.org/viewvc/myfaces/trinidad/trunk/trinidad-impl/src/main/javascript/META-INF/adf/jsLibs/NumberFormat.js?rev=1628735&r1=1628734&r2=1628735&view=diff
==============================================================================
--- myfaces/trinidad/trunk/trinidad-impl/src/main/javascript/META-INF/adf/jsLibs/NumberFormat.js (original)
+++ myfaces/trinidad/trunk/trinidad-impl/src/main/javascript/META-INF/adf/jsLibs/NumberFormat.js Wed Oct  1 15:26:41 2014
@@ -64,30 +64,33 @@ function TrNumberFormat(type, locale, co
   TrNumberFormat.MAX_INTEGER_DIGITS  = "maxIntegerDigits";
   TrNumberFormat.MIN_FRACTION_DIGITS = "minFractionDigits";
   TrNumberFormat.MIN_INTEGER_DIGITS  = "minIntegerDigits";
+  TrNumberFormat.ROUNDING_MODE       = "roundingMode";
 
   //default values, similar to JDK (values from Apache Harmony)
   if(this._type=="percent")
   {
-    this.setMaximumFractionDigits((config[TrNumberFormat.MAX_FRACTION_DIGITS])? config[TrNumberFormat.MAX_FRACTION_DIGITS] : 0);
+    this.setMaximumFractionDigits((config[TrNumberFormat.MAX_FRACTION_DIGITS] != null)? config[TrNumberFormat.MAX_FRACTION_DIGITS] : 0);
   }
   else
   {
-    this.setMaximumFractionDigits((config[TrNumberFormat.MAX_FRACTION_DIGITS])? config[TrNumberFormat.MAX_FRACTION_DIGITS] : 3);
+    this.setMaximumFractionDigits((config[TrNumberFormat.MAX_FRACTION_DIGITS] != null)? config[TrNumberFormat.MAX_FRACTION_DIGITS] : 3);
   }
     
-  this.setMaximumIntegerDigits((config[TrNumberFormat.MAX_INTEGER_DIGITS])? config[TrNumberFormat.MAX_INTEGER_DIGITS] : 40);
+  this.setMaximumIntegerDigits((config[TrNumberFormat.MAX_INTEGER_DIGITS] != null)? config[TrNumberFormat.MAX_INTEGER_DIGITS] : 40);
   
   if(this._type=="currency")
   {
-    this.setMinimumFractionDigits((config[TrNumberFormat.MIN_FRACTION_DIGITS])? config[TrNumberFormat.MIN_FRACTION_DIGITS] : 2);
+    this.setMinimumFractionDigits((config[TrNumberFormat.MIN_FRACTION_DIGITS] != null)? config[TrNumberFormat.MIN_FRACTION_DIGITS] : 2);
   }
   else
   {
-    this.setMinimumFractionDigits((config[TrNumberFormat.MIN_FRACTION_DIGITS])? config[TrNumberFormat.MIN_FRACTION_DIGITS] : 0);
+    this.setMinimumFractionDigits((config[TrNumberFormat.MIN_FRACTION_DIGITS] != null)? config[TrNumberFormat.MIN_FRACTION_DIGITS] : 0);
   }
   
-  this.setMinimumIntegerDigits((config[TrNumberFormat.MIN_INTEGER_DIGITS])? config[TrNumberFormat.MIN_INTEGER_DIGITS] : 1);
+  this.setMinimumIntegerDigits((config[TrNumberFormat.MIN_INTEGER_DIGITS] != null)? config[TrNumberFormat.MIN_INTEGER_DIGITS] : 1);
   this.setGroupingUsed((config[TrNumberFormat.IS_GROUPING_USED] != null)? config[TrNumberFormat.IS_GROUPING_USED] : true);    
+  this.setRoundingMode(config[TrNumberFormat.ROUNDING_MODE]);
+  
   this._updateLocaleAndSymbols(locale, config);
 }
 
@@ -208,6 +211,36 @@ TrNumberFormat.prototype.isGroupingUsed 
 }
 
 /**
+ * Sets the chosen decimal rounding mode.
+ * 
+ * @param Rounding mode can be one of:
+ * {null, "UP", "DOWN", "CEILING", "FLOOR", "HALF_UP", "HALF_DOWN", "HALF_EVEN", "UNNECESSARY"}
+ */
+TrNumberFormat.prototype.setRoundingMode = function(roundingMode)
+{
+  this._roundingMode = roundingMode;
+}
+
+/**
+ * Gets the decimal rouding mode.
+ * 
+ * @return Rounding mode, can be one of:
+ * {null, "UP", "DOWN", "CEILING", "FLOOR", "HALF_UP", "HALF_DOWN", "HALF_EVEN", "UNNECESSARY"}
+ */
+TrNumberFormat.prototype.getRoundingMode = function()
+{
+  return this._roundingMode;
+}
+
+/**
+ * @return true if a decimal rounding mode is specifed
+ */
+TrNumberFormat.prototype.isRoundingModeSpecified = function() 
+{
+  return this.getRoundingMode() != null;
+}
+
+/**
  * Used to specify the new maximum count of integer digits that are printed
  * when formatting. If the maximum is less than the number of integer
  * digits, the most significant digits are truncated.
@@ -217,7 +250,7 @@ TrNumberFormat.prototype.isGroupingUsed 
 TrNumberFormat.prototype.setMaximumIntegerDigits = function(number)
 {
   //taken from the Apache Harmony project
-  if(number)
+  if(number != null)
   {
     this._maxIntegerDigits = number < 0 ? 0 : number;
     if (this._minIntegerDigits > this._maxIntegerDigits)
@@ -250,7 +283,7 @@ TrNumberFormat.prototype.getMaximumInteg
 TrNumberFormat.prototype.setMaximumFractionDigits = function(number)
 {
   //taken from the Apache Harmony project
-  if(number)
+  if(number != null)
   {
     this._maxFractionDigits = number < 0 ? 0 : number;
     if (this._maxFractionDigits < this._minFractionDigits)
@@ -283,7 +316,7 @@ TrNumberFormat.prototype.getMaximumFract
 TrNumberFormat.prototype.setMinimumIntegerDigits = function(number)
 {
   //taken from the Apache Harmony project
-  if(number)
+  if(number != null)
   {
     this._minIntegerDigits = number < 0 ? 0 : number;
     if(this._minIntegerDigits > this._maxIntegerDigits)
@@ -314,7 +347,7 @@ TrNumberFormat.prototype.getMinimumInteg
 TrNumberFormat.prototype.setMinimumFractionDigits = function(number)
 {
   //taken from the Apache Harmony project
-  if(number)
+  if(number != null)
   {
     this._minFractionDigits = number < 0 ? 0 : number;
     if (this._maxFractionDigits < this._minFractionDigits)
@@ -621,7 +654,8 @@ TrNumberFormat.prototype.percentageToStr
   // have at most 2 fractional digits, regardless of the value of maxFractionDigits. 
   // Hence, if maxFractionDigits is set, don't call this method and let 
   // numberToString format the string appropriately. 
-  if (this._isMaxFractionDigitsSet == null)
+  if (this._isMaxFractionDigitsSet == null &&
+       !this.isRoundingModeSpecified())
     number = this.getRounded(number);
     
   if (isNaN(number))
@@ -1005,7 +1039,9 @@ TrNumberFormat.prototype._formatFraction
 
   if(fracsLength > maxFra && maxFra >= minFra)
   {
-    fracs = fracs.substring(0, maxFra);
+    // Do not attempt to truncate fractional digits if rounding is enabled
+    var fracsToRetain = (this.isRoundingModeSpecified())? fracsLength : maxFra;
+    fracs = fracs.substring(0, fracsToRetain);
   }
   if(fracsLength <minFra)
   {