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 anMatcher 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)
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:
publicstaticvoidmain(String[] args){System.out.println("..."+bla("19.95");}privatestaticfloatbla(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;}
Also ich versteh das nicht???
Ich kann keinen Fehler finden und dennoch funktioniert es bei Dir?
Da ist meine komplette Methode.
Java:
publicstaticfloattransformBezugsbedingung(String zeichenkette){// Variableninitialisierungfloat 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 anMatcher 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.
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)
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:
publicstaticshorttransformStringZahl(String zeichenkette){// Variableninitialisierungshort zahl =0;
log.info("Zeichekette vor der Verarbeitung : "+ zeichenkette);// Suchmuster um Zahlen zu erkennenPattern suchmuster=Pattern.compile("\\d+");// Wendet das Suchmuster auf die zu untersuchende ZeichenketteMatcher 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.