String nach float Konvertieren

MiMa

Top Contributor
Hallo,
das Konvertieren von Integer Zahlen war ja kein Problem. Im Prinzip funktioniert das umwandeln in andere Zahlensysteme gleich.
Probleme habe ich aber das Konvertierne in eine Fließkommazahl.
Ich habe eine String "19.95" und möchte den als Preis in einen float umwandeln.
Jedes mal erhalte ich eine Fehlermeldung, egal ob ich den String in "19.95" oder als "19,95" zur Verfügung gestellt habe??
Ich seh den Fehler nicht. Wäre sehr nett, wenn mir jemand helfen würde.

Java:
       ...
        String zeichenkette ="kart. : EUR 19.95";
        float preis = 0;
        System.out.println("Bezugsbedingung vor der Verarbeitung : " + zeichenkette);
        // Suchmuster für einen Preis aus Zahlen mit Punkt "19.95"
        Pattern suchmuster = Pattern.compile("\\d+.\\d+");
        // Wendet das Suchmuster auf den String an
        Matcher matcher = suchmuster.matcher(zeichenkette);
        if (matcher.find()) {
            zeichenkette = matcher.group();
            zeichenkette = zeichenkette.replace(".", ",");
            System.out.println("Preis nach der Verarbeitung : " + zeichenkette);
            preis = Float.parseFloat(zeichenkette);
        }
     return preis;
} // transformPreis

Bezugsbedingung vor der Verarbeitung : kart. : EUR 19.95
Preis nach der Verarbeitung : 19.95

Bei einem String mit "19.95" erhalte ich foldende Fehlermeldung
Exception in thread "main" java.lang.NumberFormatException: For input string: "2,"
at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
at java.lang.Integer.parseInt(Integer.java:580)
at java.lang.Integer.valueOf(Integer.java:766)
...
Bei einem String mit "19,95" erhalte ich foldende Fehlermeldung
Exception in thread "main" java.lang.NumberFormatException: For input string: "19,95"
at sun.misc.FloatingDecimal.readJavaFormatString(FloatingDecimal.java:2043)
at sun.misc.FloatingDecimal.parseFloat(FloatingDecimal.java:122)
at java.lang.Float.parseFloat(Float.java:451)

Java:
preis = Float.valueOf(zeichenkette);
Habe ich auch versucht, aber gleiche Fehlermeldung wie mit "19.95"

Danke
 
Zuletzt bearbeitet:
Dein Fehler ist hier:
Java:
 zeichenkette = zeichenkette.replace(".", ",");

NumberFormatException wird immer dann geworfen, wenn der Paramter von parseFloat ungültig ist.
Indem du den "." durch ein "," ersetzt, wird die Zahl 19.95 zu 19,95 und damit wird dein Paramter ungültig, da nur die form dd.dd gültig ist
 
Die Zeile habe ich eingesetzt als das andere nicht funltioniert hat. Ich wollte damit testen, ob es an dem Dezimaplunkt liegt. In den Büchern habe ich einen Floatwert mal mit Punkt, mal mit Komma gesehen.
 
Also wenn ich deine Methode ausführe und die replace methode auskommentiere dann klappt es bei mir mit der Zahl 19.95
Ich kenne ja den anderen Code nicht.
Übrigens - in deinem Codeschnipsel hat zeichenkette (Paramter) kein Datentyp. Sollte aber ein String sein oder?

Mein Code sähe wie folgt aus:
Java:
public static void main(String[] args)
{
    System.out.println("..." + bla("19.95");
}

private static float bla(String z)
{
       float = preis = 0;
   Pattern p = Pattern.compile("\\d+.\\d+");
   Matcher m = p.matcher(z);

   if(m.find())
   {
       z = m.group();
       // z = z.replace(".",",");
      preis = Float.parseFloat(z);
   }
   return preis;
}

Edit: Klappt auch mit "kart. : EUR 19.95"
 
Also ich versteh das nicht???
Ich kann keinen Fehler finden und dennoch funktioniert es bei Dir?
Da ist meine komplette Methode.
Java:
public static float transformBezugsbedingung(String zeichenkette) {
        // Variableninitialisierung
        float preis = 0;
        System.out.println("Bezugsbedingung vor der Verarbeitung : " + zeichenkette);
        // Suchmuster für einen Preis aus Zahlen mit Punkt "24.90"
        Pattern suchmuster = Pattern.compile("\\d+.\\d+");
     
        // Wendet das Suchmuster auf den String an
        Matcher matcher = suchmuster.matcher(zeichenkette);
        if (matcher.find()) {
            zeichenkette = matcher.group();
            System.out.println("Preis nach der Verarbeitung : " + zeichenkette);
            preis = Float.parseFloat(zeichenkette);
        }
        return preis;
    } // transformBezugsbedingung
Der Inhalt der Zeichenkette ist "kart. : EUR 19.95"
Und auch bei mir kommt als Erzeugter String "19.95" heraus.
Soweit funktioniert das ganze schon, nur das um konvertieren in Float macht das Problem.
http://michaelmadej.de/downloads/float.PNG
Als IDE benutze ich Netbeans.
 
Zuletzt bearbeitet:
Aber wenn keine Fehlermeldung kommt, dann hast du doch danach ein float Wert am Ende?

Oder bekommst du immer noch eine NumberFormatException?
 
run:
Bezugsbedingung vor der Verarbeitung : kart. : EUR 19.95
Preis nach der Verarbeitung : 19.95
Exception in thread "main" java.lang.NumberFormatException: For input string: "2,"
at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
at java.lang.Integer.parseInt(Integer.java:580)
at java.lang.Integer.valueOf(Integer.java:766)
at de.michaelmadej.parser.DNBmarc21CoHandler.characters(DNBmarc21CoHandler.java:111)
at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.characters(AbstractSAXParser.java:546)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:463)
at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:848)
at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:777)
at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:141)
at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(AbstractSAXParser.java:1140)
at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(SAXParserImpl.java:655)
at de.michaelmadej.parser.DNBmarc21.parseISBN(DNBmarc21.java:58)
at de.michaelmadej.dokumentarten.Buch.pruefeInhalt(Buch.java:1050)
at de.michaelmadej.dateiformate.PDF.erkennePdf(PDF.java:79)
at de.michaelmadej.Indexer.main(Indexer.java:123)
C:\Users\Michael\AppData\Local\NetBeans\Cache\8.1\executor-snippets\run.xml:53: Java returned: 1
BUILD FAILED (total time: 5 seconds)
 
Dort wird die Zeichenkette als Integer Wert zugewiesen. Diese enthält eine Zahl von 1 ...
Java:
Integer auflageId = Integer.valueOf(zeichenkette);
Die wurde bereits geprüft und funktioniert auch.
 
Dort wird die Zeichenkette zugewiesen. Diese enthält eine Zahl von 1 ...
Java:
Integer auflageId = Integer.valueOf(zeichenkette);
Die wurde bereits geprüft und funktioniert auch.
In dem Aufruf wird allerdings die Exception geworfen, funktioniert also nicht wie gewünscht...
 
Der Blog dazu ist wie folgt. Hatte bisher damit keinerlei Probleme damit?
Java:
else if ("250".equals(this.bufferNummer)) {
            if ("a".equals(this.bufferCode)) {
                zeichenkette = DNBmarc21.transformAuflage(zeichenkette);
                Integer auflageId = Integer.valueOf(zeichenkette);
                parserBuchObjekt.setAuflageId(auflageId);
                log.info("Auflage ID             : " + zeichenkette);
                log.info("Tag                    : " + bufferNummer);
                log.info("Code                   : " + bufferCode);
            }
 
Warum verwendest du hier die WrapperKlasse Integer und nicht den Datentyp int?

Deshalb wird auch die Exception geworfen.
 
Setz in der Funktion mal einen Breskpoint oder log mal, zeichenkette enthält ein , und ist deshalb kein integer mehr
 
Java:
Integer x = Integer.parseInt(z);

müsste meiner Meinung nach:

Java:
int x = Integer.parseInt(z);
sein
 
Das wirft die gleiche Exception.
Hier passt entweder der Code nicht zu dem Inhalt von Zeichenkette oder der Inhalt von Zeichenkette passt nicht zum Code.
 
Vielen Dank für die vielen Wege, ich denke ich habe das Problem dank Euch lokalisiert.
Die 2 ist die Auflage. Damals (Vor 2 Jahren) habe ich die Klasse geschrieben und gab eine Zahl, hier 2 als String zurück. Dann habe ich vergangene Tage aber eine AuflageID erstellt und wollte den String abschaffen. Also wurde versucht die Rückgabe der Auflage(String), welch eine 2 beinhaltet in die AuflageID (int) hinein zu legen. Das mir das vorher nicth aufgefallen ist, ist seltsam, da ich seit 3 Wochen wieder an dem Programm rumschreibe. Die Klasse Auflage werde ich neu schreiben, da ich wieder mal neue erkentnisse habe.
Ich melde mich aber und gebe bescheid, wenn es wieder funktioniert.
 
Wenn die Auflage/AuflageId eine ID und kein numerischer Wert ist, kann man das einfach als String lassen.
Ich gehe mal davon aus, das du mit der Auflage nicht rechnen willst?
 
So es läuft wieder.
In den letzten Stunden hatte ich eine Methode geschrieben um Seitenzahlen aus einen String zu holen.
Java:
public static short transformStringZahl(String zeichenkette) {
        // Variableninitialisierung
        short zahl = 0;
    
        log.info("Zeichekette vor der Verarbeitung : " + zeichenkette);
    
        // Suchmuster um Zahlen zu erkennen
        Pattern suchmuster= Pattern.compile("\\d+");
    
        // Wendet das Suchmuster auf die zu untersuchende Zeichenkette
        Matcher matcher = suchmuster.matcher(zeichenkette);
        if (matcher.find()) {
            zeichenkette = matcher.group();
            log.info("Zeichenkette nach der Verarbeitung : " + zeichenkette);
            zahl = Short.parseShort(zeichenkette);
        }
        return zahl;
    } // transformSeiten
Da bei der Auflage genau das gleiche passiert wollte ich die gleiche Methode verwenden um auch die Auflage zu ermitteln. Also die Methode "transformAuflage" gelöscht und die gleiche Methode angewandt und es fluppt wieder.
Mit Auflage werde ich nicht rechnen, aber es wird als Zahl in die Datenbank geschrieben und entsprechend verknüpft.

Nochmals Vielen Dank an Euch
 
Zuletzt bearbeitet:

Neue Themen


Zurück
Oben