Geldbetrag mit regex ermitteln.

Diskutiere Geldbetrag mit regex ermitteln. im Allgemeine Java-Themen Bereich.
M

MiMa

Ich habe eine Methode geschrieben um einen Geldbetrag in double aus einem Text zurück zu geben.
Es wird mir kein Fehler angezeigt und die Methode läuft auch durch, jedoch ohne einen Betrag zu ermitteln?
Ich habe dann auch ein Regex Ausdruck hier im Forum probiert welcher laut Online Tool funktioniert
aber nicht in meinem Code??
regex.JPG
Ich kann aber auch keinen Fehler in meiner Methode finden?
Habe ich den Regex Ausdruck falsch implementiert?
Java:
public static double sucheBetrag(String text) {
        LOG.info("Ein Betrag wird über egex gesucht");
        double betrag = 0;
        
        // Muster für einen Betrag
        // String regexBetrag = "^\\d{1,8}([\\.,]\\d{2})?$";
        String regexBetrag = "(^\\d{1,8}([\\.,]\\d{2})?$)";
        Pattern betragMuster = Pattern.compile(regexBetrag);
        Matcher sucheBetrag = betragMuster.matcher(text);
        
        while (sucheBetrag.find()){
            betrag = Double.parseDouble(sucheBetrag.group());
            LOG.info("Betrag über regex gefunden: " + betrag);
        }
        return betrag;
    }
Danke
Mi
 
J

JustNobody

Also das kann so nicht korrekt sein auf dem Bildschirmfoto.

a) Dein Regulärer Ausdruck erwartet ja genau zwei Nachkommastellen. Daher ist 0.9 oder 0,9 kein Match. 0.99 und 0,99 matchen aber.

b) parseDouble kann nicht mit . und , umgehen. Standard ist der Punkt. Daher dürftest Du bei 0,99 eine NumberFormatException bekommen.
 
F

fhoffmann

Versuche (wegen b):
Java:
betrag = Double.parseDouble(sucheBetrag.group().replace(",", "."));
 
T

temi

Im Ergebnis auf dem Bildschirmfoto ist doch gar nichts fett markiert?
 
M

MiMa

ja ich weis, die regex online Editoren sind ziemlich seltsam in der Anwendung?
Habe noch nicht viel mit regex gemacht und daher noch etwas unsicher und kenne die richtigen tools noch nicht.
Aber auch mit dem replace bekomme ich kein Wert zurück?
Das ist der Text, indem der Betrag entnommen werden soll.
Code:
Festeinband : circa EUR 49.90 (DE)
Ich habe zwar eine Methode die funktioniert, die ist aber mit Stringverarbeitung und Array.
Wollte halt eine Lösung, die auch für andere Inhalte zuverlässig funktioniert.
 
mihe7

mihe7

Aus dem Bauch heraus würde ich es mal so probieren:
Java:
String regexBetrag = "\\d{1,8}([.,]\\d{2})?";
 
J

JustNobody

Also wenn der Text Festeinband : circa EUR 49.90 (DE) ist, dann ist Dein Regulärer Ausdruck auch schlicht falsch.

Ich empfehle generell bei neuen Dingen doch immer erst einmal etwas über das Neue zu lesen um ein generelles Verständnis zu haben. Das bringt deutlich mehr als reines rumspielen in der Hoffnung, dass man etwas hinkriegt, das (scheinbar) funktioniert.

Zu RegEx gibt es einige Einführungen, Tutorials, ...

Bei Dir ist das Problem, dass Du auf Grund der ^ und $ Zeichen den ganzen String matchen willst.
 
J

JennyL

Das sollte es eigentlich tun:
Java:
String regEx = "(\\d{1,3}[.,]?)+\\d{1,2}";
 
M

MiMa

Wie gesagt hatte ich die Methode schon mal programmiert und zwar mit Stringmanipulation und Arrays für die Erkennung "eines" Betrages aus einer kurzen Zeichenkette wie oben dargestellt. Dort bin ich ausgegangen das ein Buch nicht mehr kostet als ein dreistelliger Betrag mit zwei Nachkommastellen (129,58).
Da ich aber die Methode auch verwenden möchte um Beträge aus Rechnungen zu finden, wollte ich das gerne mit Regex umsetzen.
Vor einem Jahr habe ich das mit der ISBN Erkennung erfolgreich umgesetzt und das hat mich mit einer Einführung ein paar Wochen beschäftigt. Dann hat es mich ein paar Wochen gekostet in XML rein zu kommen und so zieht die Zeit dahin. Also immer ein bisschen von allem :cool:
Ich würde in der neuen Methode auch mehrere Beträge erkennen lassen wollen wie 12.345,00 ; 1.234,90 ; 1234,90 ; 123,90 ; 49.50 ; 4,9 wie oben im Online Regex Prüfer.

Und auch vielen Dank für die regex Strings, jetzt kommt schon mal der richtige Preis. :)
Ich werde mir aber trotzdem die mühe machen, eure regex Strings zu analysieren um zu sehen was diese machen, damit meine Kenntnisse erweitert werden.
 
Zuletzt bearbeitet:
J

JennyL

Wie gesagt,
Edit Korrektur:
Java:
String regex = "(\\d{1,3}[.,]?)(\\d{3}[.,]?)*[.,]\\d{1,2}\\D";
sollte all deine Wünsche erfüllen. :) Etwas unschön ist allerdings, dass nach dem Betrag noch wenigstens ein Zeichen folgen muss (das kann auch ein Zeilenumbruch sein) - denn dadurch ist z.B. 1,001 als nominaler Geldwert ausgeschlossen...
Analysiere das mal. :)
 
Thema: 

Geldbetrag mit regex ermitteln.

Passende Stellenanzeigen aus deiner Region:
Anzeige

Neue Themen

Anzeige

Anzeige
Oben