4 Grundrechenarten auf der Kommandozeile

Aus Byte-Welt Wiki
Zur Navigation springenZur Suche springen

In diesem Code-Beispiel bauen wir uns einen Rechner für die Kommandozeile.

Die hier vorgestellte Klasse CommandCalc berechnet das Ergebnis einer Grundrechenart-Operation mit zwei Operanden. Dabei erwartet sie die Teile der Rechenaufgabe als Argumente beim Start des Programms.

Beispiel:

java CommandCalc 3,2 x 5,8

Das Beispiel startet eine Multiplikation. Üblicherweise wird bei einer Multiplikation das Sternchen (*) als Operator eingesetzt. Da das Sternchen aber auf den Kommandozeilen der bekannten Betriebssysteme bereits eine Wildcard-Funktion inne hat, benutzen wir ersatzweise das x.

import java.text.DecimalFormat;

/**
 * CommandCalc berechnet das Ergebnis einer Rechenoperation mit zwei Operanden.
 *
 * @author Gernot Segieth
 */
public class CommandCalc {
   private static DecimalFormat formatter = new DecimalFormat("#.###");

   public static void main(String[] args) {
      if(args.length == 3 && checkArgs(args)) {
         System.out.print(args[0] +" "+ args[1] +" "+ args[2] +" = ");
         
         double value1 = parse(args[0]);
         double value2 = parse(args[2]);
         double result = 0;
         
         switch(args[1]) {
            case "+":
               result = addition(value1, value2);
               break;
            case "-":
               result = subtraction(value1, value2);
               break;
            case "x":
               result = multiplication(value1, value2);
               break;
            case "/":
               result = division(value1, value2);
               break;
            default:
               System.out.println("[FEHLER]\nUnzulässiger Operator!");
               return;
         }
         out(result);
      } else {
        System.out.println("CommandCalc, 2015 - Gernot Segieth");
        System.out.println("Zulässige Operatoren: + - x /");
        System.out.println("Verwendungsbeispiel:\njava CommandCalc 5 + 8");
      }
   }

   private static void out(double value) {
      System.out.println(formatter.format(value));
   }

   private static boolean checkArgs(String[] args) {
      /*
       * Regex Erklärung:
       * - die zahl hat optional an erster Stelle ein negatives Vorzeichen
       * - darauf folgt mindestens eine Ziffer
       * - optional: (die Zahl darf einen Punkt oder Komma enthalten
       * - nach dem Punkt oder Komma endet die Zahl mit mindestens einer weiteren Ziffer)
       */
      String pattern = "^[-]?\\d+([.,]\\d+)?$";
      return args[0].matches(pattern) && args[2].matches(pattern);
   }

   private static double parse(String arg) {
      return Double.parseDouble(arg.replace(',', '.'));
   }

   private static double addition(double arg1, double arg2) {
      return arg1 + arg2;
   }

   private  static double subtraction(double arg1, double arg2) {
      return arg1 - arg2;
   }

   private static double multiplication(double arg1, double arg2) {
      return arg1 * arg2;
   }

   private static double division(double arg1, double arg2) {
      return arg1 / arg2;
   }
}