Avatar billede jesperthomsen1980 Nybegynder
28. marts 2005 - 15:05 Der er 17 kommentarer og
1 løsning

Decimaltal med 2 decimaler

Hej eksperter.

Jeg har forgæves søgt på nettet efter en løsning på mit problem. Jeg er ved at oprette en faktura, og det virker sådan set godt nok. Dog er problemet, at der ikke er decimaler på, så mit spørgsmål er, hvordan jeg løser mit problem, så jeg på fakturaen kan skrive tal med nøjagtig to decimaler!?!

VH Jesper
Avatar billede arne_v Ekspert
28. marts 2005 - 15:09 #1
Imports System

Module Main
    Sub Main()
        Console.WriteLine(String.Format("{0:0.00}",123))
        Console.WriteLine(String.Format("{0:0.00}",12.3))
        Console.WriteLine(String.Format("{0:0.00}",1.23))
    End Sub
End Module
Avatar billede jesperthomsen1980 Nybegynder
28. marts 2005 - 15:14 #2
Ok - men det er vel kun når man skal skrive et tal ud?

Jeg har snarere brug for en konstant der husker på det tal med to decimaler, da jeg ligger nogle ting sammen inden jeg skriver det ud.
Ligesom en integer gemmer en værdi uden decimaler.

Håber du forstår, og undskyld hvis jeg ikke lige har været klar nok i beskrivelsen af det problem jeg har...
Avatar billede arne_v Ekspert
28. marts 2005 - 15:18 #3
Tal opbevares internt i binært format hvor decimaler ikke giver nogen mening.

Decimaler er kun noget man angiver når det skal udskrives/vises.

Til det formål er String.Format udmærket.

Hvis du har problemer med at opbevare og/eller regne på beløb så skal jeg lige
høre hvilken data type du bruger ?
Avatar billede arne_v Ekspert
28. marts 2005 - 15:20 #4
integer kan ikke gemme decimaler
double kan gemem decimaler men har andre uhensigtsmæssigheder i forbindelse med beløb
decimal er det rigtige valg for beløb
Avatar billede jesperthomsen1980 Nybegynder
28. marts 2005 - 15:21 #5
Jeg har brugt integer indtil nu, og den runder fint nok af (enten op eller ned), men hvis man gemmer en integerværdi på feks 10,25, så husker den vel ikke på ,25,  når jeg skriver den ud?
Avatar billede jesperthomsen1980 Nybegynder
28. marts 2005 - 15:23 #6
Det vil sige, at jeg skal ændre det til decimal i stedet for integer, og så bruge dit første svar når jeg skal sætte beløb på fakturaen. Altså med 2 decimaler?
Avatar billede arne_v Ekspert
28. marts 2005 - 15:25 #7
Jep.

Decimal kan huske decimaler (pudsigt med det navn ikke !) og String.Format kan
styre udskriften.
Avatar billede jesperthomsen1980 Nybegynder
28. marts 2005 - 15:26 #8
Jeg siger tak..

smid lige et svar:-)
Avatar billede arne_v Ekspert
28. marts 2005 - 15:27 #9
kommer her
Avatar billede jesperthomsen1980 Nybegynder
28. marts 2005 - 15:28 #10
takker
Avatar billede jesperthomsen1980 Nybegynder
28. marts 2005 - 15:41 #11
Kan man forresten bruge  (String.Format("{0:0.00}", Pris)) hvis man skal gemme det i en database. Altså med 2 decimaler i en sql statement?
Avatar billede arne_v Ekspert
28. marts 2005 - 15:51 #12
Ja.

Men kan du ikke lige så godt skifte til parameters og løse dette problem +
problemer med tid + problemer med SQL injection i et hug ?
Avatar billede jesperthomsen1980 Nybegynder
28. marts 2005 - 15:54 #13
Hvad forståes ved parameters?
Avatar billede jesperthomsen1980 Nybegynder
28. marts 2005 - 15:55 #14
Bare eventuelt hvis du ligger med et link hvor jeg kan finde mere om det. Er støt på det et par gange uden at tænke videre over det.
Avatar billede arne_v Ekspert
28. marts 2005 - 15:59 #15
Jeg har et eksempel med tid som jeg postede her for et par uger siden.

(du kender godt pronlemet med INSERT af tid ikke - er det nu ddmmyy eller
mmddyy eller yymmdd eller ...)
Avatar billede arne_v Ekspert
28. marts 2005 - 15:59 #16
Imports System
Imports System.Threading
Imports System.Data.OleDb

Class MainClass
    Public Shared Sub Main(ByVal args As String())
        Dim con As OleDbConnection = New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\Database\MSAccess\Test.mdb")
        con.Open
        Dim cre As OleDbCommand = New OleDbCommand("CREATE TABLE dtest (i INTEGER PRIMARY KEY, d DATETIME)", con)
        cre.ExecuteNonQuery
        Dim ins As OleDbCommand = New OleDbCommand("INSERT INTO dtest VALUES (?, ?)", con)
        ins.Parameters.Add("@i", OleDbType.Integer)
        ins.Parameters.Add("@d", OleDbType.Date)
        Dim i As Integer
        For i = 0 To 9
            ins.Parameters("@i").Value = i
            ins.Parameters("@d").Value = DateTime.Now
            ins.ExecuteNonQuery
            Thread.Sleep(1000)
        Next
        Console.WriteLine("All rows :")
        Dim sel As OleDbCommand = New OleDbCommand("SELECT * FROM dtest", con)
        Dim rdr As OleDbDataReader = sel.ExecuteReader
        While rdr.Read
            Dim iv As Integer = CType(rdr(0), Integer)
            Dim dv As DateTime = CType(rdr(1), DateTime)
            Console.WriteLine(iv & " " & dv)
        End While
        rdr.Close
        Console.WriteLine("Rows last 5 seconds since " + DateTime.Now + " :")
        Dim sel2 As OleDbCommand = New OleDbCommand("SELECT * FROM dtest WHERE d > ?", con)
        sel2.Parameters.Add("@d", OleDbType.Date)
        sel2.Parameters("@d").Value = DateTime.Now.AddSeconds(-5)
        Dim rdr2 As OleDbDataReader = sel2.ExecuteReader
        While rdr2.Read
            Dim iv As Integer = CType(rdr2(0), Integer)
            Dim dv As DateTime = CType(rdr2(1), DateTime)
            Console.WriteLine(iv & " " & dv)
        End While
        rdr2.Close
        Dim drp As OleDbCommand = New OleDbCommand("DROP TABLE dtest", con)
        drp.ExecuteNonQuery
        con.Close
    End Sub
End Class
Avatar billede arne_v Ekspert
28. marts 2005 - 16:01 #17
Princippet er at at man laver sin SQL statement med placeholders (? med OLE DB,
@navn med SQLServer) og så assigner variablene direkte over i parameter value
uden nogen formatering.
Avatar billede jesperthomsen1980 Nybegynder
28. marts 2005 - 16:03 #18
Takker - det kigger jeg lige nærmere på...
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