Avatar billede davidfossil Nybegynder
27. april 2006 - 12:29 Der er 8 kommentarer og
1 løsning

Udskrive en fixed-point værdi

Jeg arbejder i et program med nogle penge, som jeg har valgt at holde i datatypen long i form af øre. På denne måde kan jeg foretage alle mine udregninger (plus og minus) i heltal, hvilket forekommer mig at være den nemmeste og sikreste måde at regne med penge i Java.

Mit problem opstår når jeg ønsker at udskrive en saldo til en String som jeg kan vise til brugeren. Her ønsker jeg naturligvis at indsætte et komma foran de to sidste cifre, og jeg kan ikke helt finde ud af hvordan dette gøres "korrekt". Man kan selvfølgelig dividere med 100, men så får jeg en double retur hvorved jeg (AFAIK) risikerer at miste præcision. Kan jeg ikke blot formatere en long med et fixed point?
Avatar billede arne_v Ekspert
27. april 2006 - 12:57 #1
du kan jo udskrive n/100 uden leading zeroes og . og n%100 med leading zeroes

men har du kigget på BigDecimal typen ?
Avatar billede davidfossil Nybegynder
27. april 2006 - 13:23 #2
1. Jo det kan jeg selvfølgelig godt - tænkte bare et der måske var en metode toString(int tal, int antalDecimaler) som jeg bare ikke kunne finde. Jeg ender nok med at fixe den selv så.

2. Ja, men mit indtryk var at den var en smule bøvlet. Hvorfor skal det være en reference type? Hvorfor skal den ligge i en eller anden stenet pakke som skal importes i samtlige af mine klasser? Kan man overhovedet foretage "alm. udregninger" med den fx: BigDecimal result = tal1 + tal2 ?
Avatar billede arne_v Ekspert
27. april 2006 - 13:29 #3
re 1)

hvis du bruger Java 1.5 så har du gode gamle printf !

re 2)


Lidt bøvlet.

Men den er beregnet til det.

Bl.a. matcher den database DECIMAL/NUMERIC typer.

Da Java ikke supporterer operator overload, så er det altid metode kald.
Avatar billede davidfossil Nybegynder
27. april 2006 - 14:09 #4
1) Kan jeg få printf til at udskrive en long 10000 som 100.00 ?
Avatar billede snoop_one Nybegynder
27. april 2006 - 14:11 #5
public static void main(String[] args) {
    DecimalFormat df = new DecimalFormat("0.00");
    System.out.println(df.format((double)56/100));
    System.out.println(df.format((double)185/100));
    System.out.println(df.format((double)36956/100));
}

Måske?
Avatar billede arne_v Ekspert
27. april 2006 - 14:19 #6
ja

        int v = 10000;
        System.out.printf("%d.%02d",v/100,v%100);
Avatar billede snoop_one Nybegynder
27. april 2006 - 14:19 #7
Eller,
public static void main(String[] args) {
    NumberFormat nf = NumberFormat.getCurrencyInstance();;
    System.out.println(nf.format((long)56));
    System.out.println(nf.format((long)185));
    System.out.println(nf.format((long)36956));
}

Måske?
Avatar billede davidfossil Nybegynder
27. april 2006 - 14:30 #8
arne (27/04-2006 14:19:03) > Det er nok det nærmeste jeg kommer en løsning. Havde dog håbet at der var en endnu lettere måde :)

Jeg har også kigget på DecimalFormatter som snoop_one nævner, og fandt den interessant metode setMultiplier(int). Denne gør præcis hvad jeg øsnker - bare omvendt! Ved at sætte den til 100 vil formatteren gange alt med 100 før den spytter det ud, men det er bare den forkerte vej i forhold til mit behov.

Hvis ikke der andre der har et bud må du gerne smide et svar, arne.
Avatar billede arne_v Ekspert
27. april 2006 - 18:55 #9
ok
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