Avatar billede louise&patricia Nybegynder
07. januar 2003 - 23:08 Der er 16 kommentarer og
3 løsninger

string to double

Atter et lille spørgsmål fra de to blondiner. Vi bruger bufferReader i vores UI til at få et navn og en pris på en bog. Problemet er bare, at begge dele bliver automatisk til en String, når vi bruger bufferreader. Vi vil gerne have a prisen bliver til en double. Vi troede vi havde løst det med følgende kode:

System.out.print("Indtast prisen: ");
String bogP = inputbogPris.readLine();
doublebogPris = Double.valueOf(bogP).intValue();

Men det dur stadig ikke. Hvis vi f.eks. skriver 125.25 så bliver det 125.00!
Avatar billede eagleeye Praktikant
07. januar 2003 - 23:12 #1
Hvad med parseFloat, den gør vis det, men et gæt er fordi du bruger intValue det giver jo heltal.

doublebogPris = parseFloat(bogP);
Avatar billede disky Nybegynder
07. januar 2003 - 23:13 #2
I bruger den forkerte metode brug:

try
{
doublebogPris = Double.parseFloat(bogP);
}
catch(NumberFormatException e)
{
//det var ikke en gyldig double i String
}
Avatar billede louise&patricia Nybegynder
07. januar 2003 - 23:31 #3
Den laver en fejl ved Double.parseFloat når vi kompiler koden. Den skriver cannot resolve symbol og melder fejlen ved punktumet mellem Double og parseFloat.

symbol: method parseFloat (java.lang.String)
location: class java.lang.Double
Avatar billede eagleeye Praktikant
07. januar 2003 - 23:34 #4
Eller så prøv:

doublebogPris = Double.valueOf(bogP).floatValue();
Avatar billede disky Nybegynder
07. januar 2003 - 23:39 #5
har i en 'import java.lang.*' i toppen af koden ?
Avatar billede louise&patricia Nybegynder
07. januar 2003 - 23:43 #6
eagleeye >> Når vi kører dit eksempel, kan vi godt kompile, men når vi inde i programmet skal skrive et komme tal f.eks. 12.5, så kommer denne fejl inde i koden:

Exception in thread "main" java.lang.NumberFormatException: 12.5
        at java.lang.Integer.parseInt(Integer.java:435)
        at java.lang.Integer.valueOf(Integer.java:532)
        at UserInterface.Menu(UserInterface.java:50)
        at RunMe.main(RunMe.java:5)
Press any key to continue...
Avatar billede louise&patricia Nybegynder
07. januar 2003 - 23:46 #7
Før vi prøvede koden fra eagleeye havde vi ikke lavet denne: import java.lang.*; men vi har nu prøvet at importere det, og den forgående fejl kommer stadig...det er lidt underligt...
Avatar billede disky Nybegynder
07. januar 2003 - 23:59 #8
undskyld der skal stå

doublebogPris=Double.parseDouble(bogP);


Denne her virker:
/*
* test.java
*
* Created on 7. januar 2003, 23:56
*/
import java.lang.*;
/**
*
* @author  Administrator
*/
public class test
{
    double doublebogPris=0;
    String bogP="12.5";
   
    /** Creates a new instance of test */
    public test()
    {
        try
        {
            doublebogPris = Double.parseDouble(bogP);
        }
        catch(NumberFormatException e)
        {
            //det var ikke en gyldig double i String
        }
        System.out.println("Prisen som double er = "+doublebogPris);
    }
   
    /**
    * @param args the command line arguments
    */
    public static void main(String[] args)
    {
        new test();
    }
   
}
Avatar billede fiskesuppe Nybegynder
08. januar 2003 - 00:10 #9
Hvis man skal konvertere en String til en double, skal man først konvertere sin String til et Double objekt og dernæst konvertere Double objektet til en double datatype:

public class test {
  public static void main (String[] args) {
    System.out.print("Indtast prisen: ");
    String bogP = inputbogPris.readLine();
    try {
      double bogPris = Double.valueOf(bogP.trim()).doubleValue();
      System.out.println("double bogPris = " + bogPris);
    }
    catch (NumberFormatException nfe) {
      System.out.println("NumberFormatException: " + nfe.getMessage());
    }
  }
}
Avatar billede disky Nybegynder
08. januar 2003 - 00:21 #10
fiskesuppe:
Ja men man bruge Double.parseDouble(String) til dette, den er netop lavet til dette.
Avatar billede louise&patricia Nybegynder
08. januar 2003 - 00:32 #11
Med lidt hjælp fra jer alle fik vi det til at vike som vi ville...I skal selvfølgelig have jer nogle points...
Avatar billede louise&patricia Nybegynder
08. januar 2003 - 00:34 #12
Lige en sidste ting...Den trim() metode der er brugt, hvor kommer den fra, og hvad gør den egentlig??

Det var efter at vi brugte den funktion, at det vi fik det til at virke...
Avatar billede fiskesuppe Nybegynder
08. januar 2003 - 00:39 #13
trim() fjerner mellemrum i starten og i slutningen af jeres String. I kan læse om den her: http://www.systinet.com/doc/wasp_uddi-31/api/org/idoox/uddi/client/util/Trim.html
Avatar billede fiskesuppe Nybegynder
08. januar 2003 - 00:50 #14
disky -> Min programmeringserfaring der er ikke er større end et halvt C-niveau på HTX giver mig desværre ikke anledning til at vurdere om det er bedst at bruge:

import java.lang.*;
double bogPris = Double.parseDouble(bogP);

eller

double bogPris = Double.valueOf(bogP.trim()).doubleValue();

Men hvis du vil have 8 point mere, så sig endelig til :)
Avatar billede disky Nybegynder
08. januar 2003 - 07:10 #15
Faktisk er den nedeste metode dobbelt konfekt, da den øverste faktisk .trim()'er helt af sig selv :)

Men pyt med de 8 point, jeg har ca 72000 af dem så jeg mangler ikke lige :)
Avatar billede Slettet bruger
08. januar 2003 - 12:17 #16
parseDouble() returnere det samme som valueOf ville have gjort (jvf. java api for Double klassen). De "trimmer" begge to, så at bruge trim() er redundant.

Til gengæld er parseDouble() den hurtigste metode, hvilket nedenstående program illustrerer:

import java.lang.*;

public class inputdata {
    private static final int count = 1000000;
    public static void main(String[] args) {
    String test="455.66667";
    try {
        long begin = System.currentTimeMillis();
        for (int i=0; i< count; i++) {
        (Double.valueOf(test)).doubleValue();       
        }
        long end1 = System.currentTimeMillis() - begin;

        begin = System.currentTimeMillis();
        for (int i=0; i< count; i++) {
        Double.parseDouble(test);       
        }
        long end2 = System.currentTimeMillis() - begin;

        System.out.println("ValueOf: " + end1);
        System.out.println("ParseDouble: " + end2);
    } catch (Exception e) {
        e.printStackTrace();
    }

    }
}
Avatar billede disky Nybegynder
08. januar 2003 - 16:25 #17
Post lige resultatet :)
Avatar billede Slettet bruger
08. januar 2003 - 16:43 #18
1235 ms for valueOF og 1093 ms for parseDouble

Det er ikke meget, men mange bække små :)
Avatar billede fiskesuppe Nybegynder
08. januar 2003 - 16:56 #19
ValueOf: 1222
ParseDouble: 1061
:)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester