diff --git a/org.adempiere.ui.swing/src/org/compiere/grid/ed/Calculator.java b/org.adempiere.ui.swing/src/org/compiere/grid/ed/Calculator.java index faf845f1d1..588f6a1d63 100644 --- a/org.adempiere.ui.swing/src/org/compiere/grid/ed/Calculator.java +++ b/org.adempiere.ui.swing/src/org/compiere/grid/ed/Calculator.java @@ -484,6 +484,11 @@ public final class Calculator extends CDialog // get operand char op = token.charAt(0); + if (op == '%') { + firstNo = firstNo.divide(new BigDecimal(100.0), m_format.getMaximumFractionDigits(), BigDecimal.ROUND_HALF_UP); + m_number = firstNo; + } + // no second number if (!st.hasMoreTokens()) return m_number; @@ -502,7 +507,7 @@ public final class Calculator extends CDialog } BigDecimal secondNo = new BigDecimal(secondNumber.toString()); - // Check the next operant + // Check the next operand char op2 = 0; if (st.hasMoreTokens()) { @@ -518,8 +523,7 @@ public final class Calculator extends CDialog // Percent operation if (op2 == '%') - secondNo = firstNo.multiply(secondNo) - .divide(new BigDecimal(100.0), m_format.getMaximumFractionDigits(), BigDecimal.ROUND_HALF_UP); + secondNo = secondNo.divide(new BigDecimal(100.0), m_format.getMaximumFractionDigits(), BigDecimal.ROUND_HALF_UP); switch (op) { @@ -650,6 +654,9 @@ public final class Calculator extends CDialog input = 'C'; else if (code == KeyEvent.VK_ENTER) input = '='; + else if (code == KeyEvent.VK_SHIFT) + // ignore + return; // abort else if (code == KeyEvent.VK_CANCEL || code == KeyEvent.VK_ESCAPE) { diff --git a/org.adempiere.ui.swing/src/org/compiere/grid/ed/MDocNumber.java b/org.adempiere.ui.swing/src/org/compiere/grid/ed/MDocNumber.java index 3129f92b82..4d00a7b925 100644 --- a/org.adempiere.ui.swing/src/org/compiere/grid/ed/MDocNumber.java +++ b/org.adempiere.ui.swing/src/org/compiere/grid/ed/MDocNumber.java @@ -16,6 +16,7 @@ *****************************************************************************/ package org.compiere.grid.ed; +import java.math.BigDecimal; import java.text.DecimalFormat; import java.text.DecimalFormatSymbols; import java.text.ParseException; @@ -88,6 +89,8 @@ public final class MDocNumber extends PlainDocument private char m_groupingSeparator = ','; /** Minus Sign */ private char m_minusSign = '-'; + /** Percent Sign */ + private char m_percentSign = '%'; /** Logger */ private static CLogger log = CLogger.getCLogger (MDocNumber.class); @@ -191,7 +194,7 @@ public final class MDocNumber extends PlainDocument } // decimal or thousand // something else - else if (VNumber.AUTO_POPUP || "=+-/*".indexOf(c) > -1) + else if (VNumber.AUTO_POPUP || "=+-/*%".indexOf(c) > -1) { // Minus - put minus on start of string @@ -207,13 +210,43 @@ public final class MDocNumber extends PlainDocument else { log.fine("Input=" + c + " (" + (int)c + ")"); - - String result = VNumber.startCalculator(m_tc, getText(), - m_format, m_displayType, m_title, c); - super.remove(0, content.length()); + + if (c == m_percentSign && offset > 0 ) { + // don't convert integers to percent. 1% = 0? + if (m_displayType == DisplayType.Integer) + return; + // divide by 100 + else + { + String value = getText(); + BigDecimal percentValue = new BigDecimal(0.0); + try + { + if (value != null && value.length() > 0) + { + Number number = m_format.parse(value); + percentValue = new BigDecimal (number.toString()); + percentValue = percentValue.divide(new BigDecimal(100.0), m_format.getMaximumFractionDigits(), BigDecimal.ROUND_HALF_UP); + m_tc.setText(m_format.format(percentValue)); + } + } + catch (ParseException pe) + { + log.info("InvalidEntry - " + pe.getMessage()); + } + + } + } + else + { - // insertString(0, result, attr); - m_tc.setText(result); + String result = VNumber.startCalculator(m_tc, getText(), + m_format, m_displayType, m_title, c); + super.remove(0, content.length()); + + // insertString(0, result, attr); + m_tc.setText(result); + } } } else diff --git a/org.adempiere.ui.swing/src/org/compiere/grid/ed/VNumber.java b/org.adempiere.ui.swing/src/org/compiere/grid/ed/VNumber.java index 3ab659526d..10049432af 100644 --- a/org.adempiere.ui.swing/src/org/compiere/grid/ed/VNumber.java +++ b/org.adempiere.ui.swing/src/org/compiere/grid/ed/VNumber.java @@ -735,7 +735,7 @@ public final class VNumber extends JComponent // Actual Call Calculator calc = new Calculator(frame, title, displayType, format, startValue); - if ( "*+-/".indexOf(operator) > -1 ) + if ( "*+-/%".indexOf(operator) > -1 ) calc.handleInput(operator); AEnv.showCenterWindow(frame, calc); BigDecimal result = calc.getNumber();