📄 calculator.java
字号:
case '6': case '7': case '8':
case '9':
m_display += c;
break;
// Decimal ===============================
case '.':
case ',':
m_display += m_decimal;
break;
// Commands ===============================
case '/': case '*':
case '-': case '+':
case '%':
if (m_display.length() > 1)
{
char last = m_display.charAt(m_display.length()-1);
if (OPERANDS.indexOf(last) == -1)
m_display += c;
else
m_display = m_display.substring(0, m_display.length()-1) + c;
}
m_display = m_format.format(evaluate());
if (c != '%')
m_display += c;
break;
// Clear last char
case 'C':
if (m_display.length() > 0)
m_display = m_display.substring(0, m_display.length()-1);
break;
// Clear all
case 'A':
m_display = "";
break;
// Currency convert toggle
case '$':
m_display = m_format.format(evaluate());
toggleCurrency();
break;
// fini
case '=':
m_display = m_format.format(evaluate());
m_abort = false;
dispose();
break;
// Error ===============================
default:
ADialog.beep();
break;
} // switch
if (m_display.equals(""))
m_display = "0";
// Eliminate leading zeroes
if (m_display.length() > 1 && m_display.startsWith("0"))
if (m_display.charAt(1) != ',' && m_display.charAt(1) != '.')
m_display = m_display.substring(1);
// Display it
display.setText(m_display);
} // handleInput
/**
* Evaluate.
* - evaluate info in display and set number
* @return result
*/
private BigDecimal evaluate()
{
// nothing or zero
if (m_display == null || m_display.equals("") || m_display.equals("0"))
{
m_number = new BigDecimal(0.0);
return m_number;
}
StringTokenizer st = new StringTokenizer(m_display, OPERANDS, true);
// first token
String token = st.nextToken();
// do we have a negative number ?
if (token.equals("-"))
{
if (st.hasMoreTokens())
token += st.nextToken();
else
{
m_number = new BigDecimal(0.0);
return m_number;
}
}
// First Number
Number firstNumber;
try
{
firstNumber = m_format.parse(token);
}
catch (ParseException pe1)
{
log.log(Level.SEVERE, "Calculator.evaluate - token: " + token, pe1);
m_number = new BigDecimal(0.0);
return m_number;
}
BigDecimal firstNo = new BigDecimal(firstNumber.toString());
// intermediate result
m_number = firstNo;
// only one number
if (!st.hasMoreTokens())
return m_number;
// now we should get an operand
token = st.nextToken();
if (OPERANDS.indexOf(token) == -1)
{
log.log(Level.SEVERE, "Calculator.evaluate - Unknown token: " + token);
return m_number;
}
// get operand
char op = token.charAt(0);
// no second number
if (!st.hasMoreTokens())
return m_number;
token = st.nextToken();
Number secondNumber;
try
{
secondNumber = m_format.parse(token);
}
catch (ParseException pe2)
{
log.log(Level.SEVERE, "Calculator.evaluate - token: " + token, pe2);
m_number = new BigDecimal(0.0);
return m_number;
}
BigDecimal secondNo = new BigDecimal(secondNumber.toString());
// Check the next operant
char op2 = 0;
if (st.hasMoreTokens())
{
token = st.nextToken();
if (OPERANDS.indexOf(token) == -1)
{
log.log(Level.SEVERE, "Calculator.evaluate - Unknown token: " + token);
return m_number;
}
// get operand
op2 = token.charAt(0);
}
// Percent operation
if (op2 == '%')
secondNo = firstNo.multiply(secondNo)
.divide(new BigDecimal(100.0), m_format.getMaximumFractionDigits(), BigDecimal.ROUND_HALF_UP);
switch (op)
{
case '/':
m_number = firstNo
.divide(secondNo, m_format.getMaximumFractionDigits(), BigDecimal.ROUND_HALF_UP);
break;
case '*':
m_number = firstNo.multiply(secondNo);
break;
case '-':
m_number = firstNo.subtract(secondNo);
break;
case '+':
m_number = firstNo.add(secondNo);
break;
default:
break;
}
return m_number.setScale(m_format.getMaximumFractionDigits(), BigDecimal.ROUND_HALF_UP);
} // evaluate
/**
* Display or don't display Currency
*/
private void toggleCurrency()
{
if (currencyPanel.isVisible())
currencyPanel.setVisible(false);
else
{
if (!m_currencyOK)
loadCurrency();
currencyPanel.setVisible(true);
}
pack();
} // toggleCurrency
/**
* Load Currency
*/
private void loadCurrency()
{
// Get Default
int C_Currency_ID = Env.getContextAsInt(Env.getCtx(), m_WindowNo, "C_Currency_ID");
if (C_Currency_ID == 0)
C_Currency_ID = Env.getContextAsInt(Env.getCtx(), "$C_Currency_ID");
String sql = "SELECT C_Currency_ID, ISO_Code FROM C_Currency "
+ "WHERE IsActive='Y' ORDER BY 2";
KeyNamePair defaultValue = null;
try
{
Statement stmt = DB.createStatement();
ResultSet rs = stmt.executeQuery(sql);
while (rs.next())
{
int id = rs.getInt("C_Currency_ID");
String s = rs.getString("ISO_Code");
KeyNamePair p = new KeyNamePair(id, s);
curFrom.addItem(p);
curTo.addItem(p);
// Default
if (id == C_Currency_ID)
defaultValue = p;
}
rs.close();
stmt.close();
}
catch (SQLException e)
{
log.log(Level.SEVERE, "Calculator.loadCurrency", e);
}
// Set Defaults
if (defaultValue != null)
{
curFrom.setSelectedItem(defaultValue);
curTo.setSelectedItem(defaultValue);
}
// Set Listener
curTo.addActionListener(this);
m_currencyOK = true;
} // loadCurrency
/**
* Return Number
* @return result
*/
public BigDecimal getNumber()
{
if (m_abort)
return null;
return m_number;
} // getNumber
/*************************************************************************/
/**
* KeyPressed Listener
* @param e event
*/
public void keyPressed(KeyEvent e)
{
// sequence: pressed - typed(no KeyCode) - released
char input = e.getKeyChar();
int code = e.getKeyCode();
e.consume(); // does not work on JTextField
if (code == KeyEvent.VK_DELETE)
input = 'A';
else if (code == KeyEvent.VK_BACK_SPACE)
input = 'C';
else if (code == KeyEvent.VK_ENTER)
input = '=';
// abort
else if (code == KeyEvent.VK_CANCEL || code == KeyEvent.VK_ESCAPE)
{
m_abort = true;
dispose();
return;
}
handleInput(input);
}
/**
* KeyTyped Listener (nop)
* @param e event
*/
public void keyTyped(KeyEvent e) {}
/**
* KeyReleased Listener (nop)
* @param e event
*/
public void keyReleased(KeyEvent e) {}
} // Calculator
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -