bestimmten Text zerlegen

Dark Ranger

Erfahrenes Mitglied
Hi
Ich möchte gerne mit JAVA einen String zerlegen und dann rechnen.
Der String sieht folgendermaßen aus:
581.967 Metall 327.058 Kristall 118.760 Deuterium 713 Deutkosten
Naja davon will ich einige posten und dann soll halt immer Metall einzeln, Kristall einzeln usw. zusammengerechnte werden.
Wenn zum Beispeil zu dem oben noch dieser String hinzukommt
169.543 Metall 81.579 Kristall 18.326 Deuterium 157 Deutkosten

Dann soll 751.510 Metall, 408637 Kristall usw. rauskommen.

Das ganze werde ich per JFrame in einer grafischen oberfläche verpacken, allerdings weiß ich nicht wie ich den String zerlegen kann.
 
Hallo!
Zerlegen kannst du den String mit split:
Java:
String text = "581.967 Metall 327.058 Kristall 118.760 Deuterium 713 Deutkosten";
// text.split(" ")[0] = 581.967,
// text.split(" ")[1] = Metall, ...

Um den Wert von z.B. Metall dann einzulesen um ihn addieren zu können, kannst Double.parseDouble() verwenden:
Java:
double metall = Double.parseDouble(text.split(" ")[0]);
mfg flo
 
Also ich habe jetzt mal ein wenig was geschrieben:

Code:
package Rohstoffe;

import java.awt.*;
import javax.swing.*;
import java.awt.event.*;

public class Berechnung {
	static Double metall=0.0, kristall=0.0, deuterium=0.0, kosten=0.0;
	public static void main(String[] args) {
		JFrame user = new JFrame("Monatsbeute berechnen");
		final JTextField rohstoffe = new JTextField();
		JButton save = new JButton("Speichern");
		JButton newmonth = new JButton("Neuer Monat");
		final JLabel output = new JLabel("");
		user.getContentPane().add(rohstoffe);
		user.getContentPane().add(save);
		user.getContentPane().add(newmonth);
		user.getContentPane().add(output);
		user.setLayout(new GridLayout(2, 2));
		user.setVisible(true);
		user.setSize(800, 120);
		ActionListener al = new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				if ("Speichern".equalsIgnoreCase(e.getActionCommand()))
				{
					String eingabe = new String();
					try {
					eingabe = rohstoffe.getText();
					}
					catch (Exception fehler)
					{
						output.setText(fehler.getMessage());
					}
					String[] split = new String[100];
					split = eingabe.split(" ");
					metall += Double.parseDouble(split[0]);
					kristall += Double.parseDouble(split[2]);
					deuterium += Double.parseDouble(split[4]);
					kosten += Double.parseDouble(split[6]);
					rohstoffe.setText("");
				}
				else if("Neuer Monat".equalsIgnoreCase(e.getActionCommand()))
				{
					output.setText("Metall: "+metall+" | Kristall: "+kristall+" | Deuterium "+deuterium+" | Kosten "+kosten);
				}
			}
		};
		save.addActionListener(al);
		newmonth.addActionListener(al);
	}

}

Nur nun muss ich erstmal die Punkte daraus bekommen, denn die sieht er ja als Kommas an und das ein wenig blöd
 
Also eine Möglichkeit wäre die Punkte erst gar nicht reinzumachen. Dann brauchst auch nicht Double zu verwenden, sondern kannst int nehmen, wenn es nur ganze Werte sind. Bringt in Sachen Performance einen ganz kleinen Vorteil.

Ansonsten würde es so gehen:
Java:
Integer.parseInt((text.split(" ")[0]).replace(".", ""))
Dabei wird zuerst im String jeder Punkt gelöscht und danach der String in einen int-Wert umgewandelt. Falls zu irgendwo Kommazahlen benützt, musst du statt Integer.parseInt Double.parseDouble verwenden.
mfg flo
 
Ich weiß jetzt leider nicht, ob es da etwas spezielles dafür gibt, aber spontan fällt mir folgendes ein:
Java:
int i = 243242;
String newString = Integer.toString(i);
newString = newString.substring(0, newString.length()-3) + "." + newString.substring(newString.length()-3);
// anschließend steht in newString: 243.242
mfg flo

Edit:
Um alle drei Stellen einen Punkt einzufügen müsste Folgendes funktionieren:
Java:
int offset = newString.length() % 3;
StringBuilder temp = new StringBuilder(newString.substring(0, offset));
for(int i = 0; i < newString.length() / 3; i++)
{
     if(temp.length() != 0)
          temp.append(".");
     temp.append(newString.substring(offset + i * 3, offset + (i+1) * 3));
}
newString = temp.toString();
 
Zuletzt bearbeitet:
Hallo!

schau mal hier:
Java:
/**
 * 
 */
package de.tutorials;

import java.text.DecimalFormat;
import java.util.Locale;
import java.util.Scanner;

/**
 * @author Tom
 * 
 */
public class DataExtractionExample {

	/**
	 * @param args
	 */
	public static void main(String[] args) {

		String lines = "581.967 Metall 327.058 Kristall 118.760 Deuterium 713 Deutkosten\n"
				+ "169.543 Metall 81.579 Kristall 18.326 Deuterium 157 Deutkosten";

		Scanner scanner = new Scanner(lines).useDelimiter("\\s\\w*\\s*")
				.useLocale(Locale.US);

		System.out.println(lines);

		double metal = 0.0;
		double crystal = 0.0;
		double deuterium = 0.0;
		double deuteriumCost = 0.0;

		while (scanner.hasNext("\\d+\\.\\d+")) {
			metal += scanner.nextDouble();
			crystal += scanner.nextDouble();
			deuterium += scanner.nextDouble();
			deuteriumCost += scanner.nextDouble();
		}

		System.out.println("-------------------");
		System.out.printf(
				"%.3f Metall %.3f Kristall %.3f Deuterium %.3f Deutkosten\n",
				metal, crystal, deuterium, deuteriumCost);

		scanner.close();
	}
}

Einen Fließkommawert kannst du in Java beispielsweise so Formatieren:
Java:
        double number = Math.PI * 100000;
        System.out.println(new DecimalFormat("#0.000").format(number));

Besser wäre es natürlich, wenn du nicht den String parsen sondern ein spezifisches Objekt in der Hand hättest dessen toString() Methode du entsprechend implementierst.

Gruß Tom
 
Code:
package Rohstoffe;

import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
import java.text.*;

public class Berechnung {
	static int metall=0, kristall=0, deuterium=0, kosten=0;
	public static void main(String[] args) {
		JFrame user = new JFrame("Monatsbeute berechnen");
		final JTextField rohstoffe = new JTextField();
		JButton save = new JButton("Speichern");
		JButton newmonth = new JButton("Neuer Monat");
		final JTextArea output = new JTextArea("",4,4);
		user.getContentPane().add(rohstoffe);
		user.getContentPane().add(save);
		user.getContentPane().add(newmonth);
		user.getContentPane().add(output);
		rohstoffe.setBounds(0, 0, 800, 60);
		save.setBounds(0,60,400,60);
		newmonth.setBounds(400,60,400,60);
		output.setBounds(0, 120, 800, 80);
		user.setLayout(null);
		user.setVisible(true);
		user.setSize(810, 235);
		Dimension d = Toolkit.getDefaultToolkit().getScreenSize(); 
		user.setLocation( (d.width - user.getSize().width ) / 2, 
		               (d.height- user.getSize().height) / 2 );
		ActionListener al = new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				if ("Speichern".equalsIgnoreCase(e.getActionCommand()))
				{
					String eingabe = new String();
					try {
					eingabe = rohstoffe.getText().replace(".", "");
					}
					catch (Exception fehler)
					{
						output.setText(fehler.getMessage());
					}
					String[] split = new String[100];
					split = eingabe.split(" ");
					metall += Integer.parseInt(split[0]);
					kristall += Integer.parseInt(split[2]);
					deuterium += Integer.parseInt(split[4]);
					kosten += Integer.parseInt(split[6]);
					rohstoffe.setText("");
					output.setText("Eintrag gespeichert");
				}
				else if("Neuer Monat".equalsIgnoreCase(e.getActionCommand()))
				{
					output.setText(new DecimalFormat("#.###").format(metall)+" Metall\n"+new DecimalFormat("#.###").format(kristall)+" Kristall\n"+new DecimalFormat("#.###").format(deuterium)+" Deuterium\n"+new DecimalFormat("#.###").format(kosten)+" Kosten");
				}
			}
		};
		save.addActionListener(al);
		newmonth.addActionListener(al);
	}
}

So habe ich es jetzt, aber das mit dem 1000er Trennzeichen geht nit!

mit dem Scanner kann ich doch auch nen Datum vom Format tt.mm.jjjj oder?
 
Zuletzt bearbeitet:
Code:
package Rohstoffe;

import java.awt.*;
import javax.swing.*;
import java.awt.event.*;

public class Berechnung {
	static int metall=0, kristall=0, deuterium=0, kosten=0;
	public static void main(String[] args) {
		JFrame user = new JFrame("Monatsbeute berechnen");
		final JTextField rohstoffe = new JTextField();
		JButton save = new JButton("Speichern");
		JButton newmonth = new JButton("Neuer Monat");
		final JTextArea output = new JTextArea("",4,4);
		user.getContentPane().add(rohstoffe);
		user.getContentPane().add(save);
		user.getContentPane().add(newmonth);
		user.getContentPane().add(output);
		rohstoffe.setBounds(0, 0, 800, 60);
		save.setBounds(0,60,400,60);
		newmonth.setBounds(400,60,400,60);
		output.setBounds(0, 120, 800, 80);
		user.setLayout(null);
		user.setVisible(true);
		user.setSize(810, 235);
		Dimension d = Toolkit.getDefaultToolkit().getScreenSize(); 
		user.setLocation( (d.width - user.getSize().width ) / 2, 
		               (d.height- user.getSize().height) / 2 );
		ActionListener al = new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				if ("Speichern".equalsIgnoreCase(e.getActionCommand()))
				{
					String eingabe = new String();
					try {
					eingabe = rohstoffe.getText().replace(".", "");
					}
					catch (Exception fehler)
					{
						output.setText(fehler.getMessage());
					}
					String[] split = new String[100];
					split = eingabe.split(" ");
					metall += Integer.parseInt(split[0]);
					kristall += Integer.parseInt(split[2]);
					deuterium += Integer.parseInt(split[4]);
					kosten += Integer.parseInt(split[6]);
					rohstoffe.setText("");
					output.setText("Eintrag gespeichert");
				}
				else if("Neuer Monat".equalsIgnoreCase(e.getActionCommand()))
				{
					String m,k,d,dk;
					m = (new Integer(metall)).toString();
					k = (new Integer(kristall)).toString();
					d = (new Integer(deuterium)).toString();
					dk = (new Integer(kosten)).toString();
					output.setText(tausend(m)+" Metall\n"+tausend(k)+" Kristall\n"+tausend(d)+" Deuterium\n"+tausend(dk)+" Deutkosten\n");
				}
			}
		};
		save.addActionListener(al);
		newmonth.addActionListener(al);
	}
	public static String tausend(String oldString)
	{
	      int offset = oldString.length() % 3;
	      StringBuilder temp = new StringBuilder(oldString.substring(0, offset));
	      for(int i = 0; i < oldString.length() / 3; i++)
	      {
	           if(temp.length() != 0)
	                temp.append(".");
	           temp.append(oldString.substring(offset + i * 3, offset + (i+1) * 3));
	      }
	      return temp.toString(); 
}
}

So habe ich es nun gelöst! ^^
Werde das ganze noch auf den Scanner umbauen und hoffe das ich damit ein Datum auslesen kann, dadurch kann ich meine eingescannten Sachen nämlich einem Monat zuordnen! ^^
 
Zurück