import java.math.BigDecimal; import java.math.MathContext; import java.text.DecimalFormat; import java.text.DecimalFormatSymbols; import java.text.ParseException; import java.time.Month; import java.time.YearMonth; import java.util.Locale; class Darlehenberechner { private static final class Konfiguration { private BigDecimal darlehenswert; private BigDecimal zinssatzProzent; private BigDecimal monatlicheRate; private Integer laufzeitJahre; private Integer tilgungsfreieZeit; private YearMonth anfangsmonat; public BigDecimal getDarlehenswert() { return darlehenswert; } public Konfiguration setDarlehenswert(BigDecimal darlehenswert) { this.darlehenswert = darlehenswert; return this; } public BigDecimal getZinssatzProzent() { return zinssatzProzent; } public Konfiguration setZinssatzProzent(BigDecimal zinssatzProzent) { this.zinssatzProzent = zinssatzProzent; return this; } public BigDecimal getMonatlicheRate() { return monatlicheRate; } public Konfiguration setMonatlicheRate(BigDecimal monatlicheRate) { this.monatlicheRate = monatlicheRate; return this; } public Integer getLaufzeitJahre() { return laufzeitJahre; } public Konfiguration setLaufzeitJahre(Integer laufzeitJahre) { this.laufzeitJahre = laufzeitJahre; return this; } public Integer getTilgungsfreieZeit() { return tilgungsfreieZeit; } public Konfiguration setTilgungsfreieZeit(Integer tilgungsfreieZeit) { this.tilgungsfreieZeit = tilgungsfreieZeit; return this; } public YearMonth getAnfangsmonat() { return anfangsmonat; } public Konfiguration setAnfangsmonat(YearMonth anfangsmonat) { this.anfangsmonat = anfangsmonat; return this; } } private static final DecimalFormat DECIMAL_FORMAT = new DecimalFormat("#,##0.00", new DecimalFormatSymbols(Locale.GERMAN)); private static final BigDecimal ZWOELF = BigDecimal.valueOf(12); public static void main(String[] args) throws ParseException { /*berechneWerte(new Konfiguration() .setDarlehenswert(BigDecimal.valueOf(168_000)) .setZinssatzProzent(BigDecimal.valueOf(3.73)) .setMonatlicheRate(BigDecimal.valueOf(1_500)) .setTilgungsfreieZeit(0) .setAnfangsmonat(YearMonth.of(2024, Month.SEPTEMBER))); return;*/ /*berechneWerte(new Konfiguration() .setDarlehenswert(BigDecimal.valueOf(168_000)) .setZinssatzProzent(BigDecimal.valueOf(3.73)) .setMonatlicheRate(BigDecimal.valueOf(1_500)) .setTilgungsfreieZeit(0) .setLaufzeitJahre(11) .setAnfangsmonat(YearMonth.of(2024, Month.SEPTEMBER))); return;*/ var konfig = new Konfiguration(); int count = 0; DECIMAL_FORMAT.setParseBigDecimal(true); while (count < args.length) { String arg = args[count]; if (arg.equals("-hilfe")) { System.out.println("-darlehenswert 1000,00 -zinssatz 3,73 -monatlicheRate 30,00 -anfangsmonat 2024-09" + "[-laufzeitJahre 11] [-tilgungsfreieZeit 5]"); } if (arg.equals("-darlehenswert")) { count++; konfig.setDarlehenswert((BigDecimal) DECIMAL_FORMAT.parse(args[count])); } if (arg.equals("-zinssatz")) { count++; konfig.setZinssatzProzent((BigDecimal) DECIMAL_FORMAT.parse(args[count])); } if (arg.equals("-monatlicheRate")) { count++; konfig.setMonatlicheRate((BigDecimal) DECIMAL_FORMAT.parse(args[count])); } if (arg.equals("-tilgungsfreieZeit")) { count++; konfig.setTilgungsfreieZeit(Integer.parseInt(args[count])); } if (arg.equals("-laufzeitJahre")) { count++; konfig.setLaufzeitJahre(Integer.parseInt(args[count])); } if (arg.equals("-anfangsmonat")) { count++; konfig.setAnfangsmonat(YearMonth.parse(args[count])); } count++; } berechneWerte(konfig); } private static void berechneWerte(Konfiguration konfig) { BigDecimal zinssatzReal = konfig.getZinssatzProzent().divide(BigDecimal.valueOf(100), MathContext.DECIMAL128); BigDecimal monatlicheRate = konfig.getMonatlicheRate(); Integer laufzeitJahre = konfig.getLaufzeitJahre(); Integer tilgungsfreieZeit = konfig.getTilgungsfreieZeit(); BigDecimal restschuld = konfig.getDarlehenswert(); YearMonth aktuellerMonat = konfig.getAnfangsmonat(); BigDecimal summeZinsen = BigDecimal.ZERO; BigDecimal summeTilgung = BigDecimal.ZERO; BigDecimal jahressummeRatenKalenderjahr = BigDecimal.ZERO; BigDecimal jahressummeRatenKreditjahr = BigDecimal.ZERO; BigDecimal summeRaten = BigDecimal.ZERO; int laufzeitMonate = 0; System.out.println("Monat: Rate = Zinsen + Tilgung| Restschuld"); while ((laufzeitJahre == null || laufzeitMonate < (laufzeitJahre * 12)) && restschuld.signum() > 0) { // berechne Beträge/ aktualisiere Restschuld BigDecimal zinsbetrag = restschuld.multiply(zinssatzReal).divide(ZWOELF, MathContext.DECIMAL128); if (monatlicheRate.compareTo(restschuld) > 0) { monatlicheRate = restschuld.add(zinsbetrag); // die letzte Rate ist gleich der Restschuld + Zinsen } BigDecimal tilgungsbetrag = tilgungsfreieZeit != null && tilgungsfreieZeit > 0 ? BigDecimal.ZERO : monatlicheRate.subtract(zinsbetrag); restschuld = restschuld.subtract(tilgungsbetrag); System.out.println(aktuellerMonat + ": " + DECIMAL_FORMAT.format(monatlicheRate) + " = " + DECIMAL_FORMAT.format(zinsbetrag) + " + " + DECIMAL_FORMAT.format(tilgungsbetrag) + " | " + DECIMAL_FORMAT.format(restschuld)); // berechne Summen für Zusammenfassung summeZinsen = summeZinsen.add(zinsbetrag); summeTilgung = summeTilgung.add(tilgungsbetrag); jahressummeRatenKalenderjahr = jahressummeRatenKalenderjahr.add(monatlicheRate); jahressummeRatenKreditjahr = jahressummeRatenKreditjahr.add(monatlicheRate); summeRaten = summeRaten.add(monatlicheRate); boolean kreditjahrVergangen = laufzeitMonate > 0 && laufzeitMonate % 11 == 0; if (kreditjahrVergangen || aktuellerMonat.getMonthValue() == 12) { BigDecimal jahressummeRaten; String desc; if (kreditjahrVergangen) { jahressummeRaten = jahressummeRatenKreditjahr; jahressummeRatenKreditjahr = BigDecimal.ZERO; desc = "Kreditjahr"; } else { jahressummeRaten = jahressummeRatenKalenderjahr; jahressummeRatenKalenderjahr = BigDecimal.ZERO; desc = "Kalenderjahr"; } System.out.println("Summe " + desc + ":\n" + DECIMAL_FORMAT.format(jahressummeRaten) + " = " + DECIMAL_FORMAT.format(summeZinsen) + " + " + DECIMAL_FORMAT.format(summeTilgung)); } // aktualisiere Werte für den nächsten Lauf aktuellerMonat = aktuellerMonat.plusMonths(1); laufzeitMonate++; if (tilgungsfreieZeit != null) { tilgungsfreieZeit--; } } // letzte Zusammenfassung System.out.println("Summe:\n" + DECIMAL_FORMAT.format(summeRaten) + " = " + DECIMAL_FORMAT.format(summeZinsen) + " + " + DECIMAL_FORMAT.format(summeTilgung)); // Ausgabe Laufzeit + Restschuld laufzeitJahre = laufzeitJahre == null ? laufzeitMonate / 12 : laufzeitJahre; int laufzeitMonateTeil = laufzeitMonate - (laufzeitJahre * 12); System.out.println("Laufzeit: " + laufzeitJahre + " Jahre " + laufzeitMonateTeil + " Monate"); System.out.println("Restschuld: " + DECIMAL_FORMAT.format(restschuld)); } }