Hej Ja det är en djä... soppa. Du måste gjort något fel. <b>Jag har en sträng "1.2" som jag vill konvertera till en double.</b> Hej Martin <b>Kan du inte berätta varför du vill göra det istället?</b> Det framgår inte varför du vill presenter med punkt. <code> Hej Andreas <b>Vid utskrift (skriver till fil), vill jag ha decimaler.</b> Varför vill du ha decimaler? Du skulle kunna använda Access/JET's OLEDB textfils drivrutin. Programmet jag gör är tänkt att vara en level-editor till ett spel jag har. Här är ett exempel på hur du kan öppna en fil genom ADO och Access/JET OLEDB Providern: Glömde en viktig bit i pusslet. Länken till dokumentationen om schema.ini; <b>Programmet jag gör är tänkt att vara en level-editor till ett spel jag har. Roligt att höra att du oxå stödjer iden med binärfilformat. Hehe, läste visst inte igenom tidigare inlägg ordentligt. Binärt klart ! Hej Du får lägga upp det som öppen källkod, så kan vi skriva om det att ta binärfiler. ;)CDbl/Val + "decimal symbol" problem
Jag har en sträng "1.2" som jag vill konvertera till en double.
Jag får följande svar med följande "Decimal Symbol"s (i "Regional and Language Options"):
"," ger
<code>
Val("1.2") => 1,2
CDbl("1.2") => 12
</code>
"." ger
<code>
Val("1.2") => 1.2
CDbl("1.2") => 1.2
</code>
något annat, exvis "p" ger:
<code>
Val("1.2") => 1p2
CDbl("1.2") => 12
</code>
Hur gör jag för att alltid få "1.2" oavsett decimal symbol?
Jag vill alltså att mitt program skall kunna köras hos alla användare med olika språkinställningar.Sv: CDbl/Val + "decimal symbol" problem
Förmodar att du matar in via TextBoxar.
<code>
'Använder alltid .(punkt) och Val
'Snyggar till decimaler med Round
Private Sub Text1_KeyPress(KeyAscii As Integer)
If KeyAscii = 44 Then KeyAscii = 46 'alltid punkt
End Sub
Private Sub Text2_KeyPress(KeyAscii As Integer)
If KeyAscii = 44 Then KeyAscii = 46 'alltid punkt
End Sub
Private Sub Command1_Click()
Label1.Caption = Val(Text1.Text) * Val(Text2.Text)
MsgBox Round(Label1.Caption, 2)
End Sub
</code>
Återkom om du vill ha ytterligare råd och dåd.Sv: CDbl/Val + "decimal symbol" problem
Val använder alltid "." oavsett de regionala inställningarna.
Jag tror att du har lyckats få med en implicit konvertering till sträng när du skall visa utdata. Implicita konverteringar sker alltid enligt de regionala inställningarna. Använd alltid Str/CStr när du skall konvertera tal till strängar så får du bättre koll och mindre problem (dock lite mer att skriva).
Så här borde det fungera: (berätta gärna om det inte gör det)
","
Str(Val("1.2")) => "1.2"
Str(CDbl("1.2")) => "1"
Str(Val("1,2")) => "12"
"."
Str(Val("1.2")) => "1.2"
Str(CDbl("1.2")) => "1.2"
Str(CDbl("1,2")) => "12"
"p"
Str(Val("1.2")) => "1.2"
Str(CDbl("1.2")) => "1.2"
Str(CDbl("1p2")) => "1.2"
Str(Val("1,2")) => "12"
Finns inte CLSID i VB?Sv: CDbl/Val + "decimal symbol" problem
Som sagts tidigare i denna tråd, Val() funktionen använder ALLTID punkt som decimalseparator.
Som jag identifierar är ditt problem är tvärt om: Decimal till sträng?
En fullösning:
Public Function AntiVal(Value As Double) As String
AntiVal = Replace(CStr(Value), Format(0, "."), ".", 1, 1)
End Function
Om du istället berättar varför du vill göra detta?
Är det så att du vill stoppa in ett värde i en SQL sträng, då SQL kräver att du använder punkt som decimalseparator?
Det finns i så fall andra, bättre metoder för att göra detta
Sv:CDbl/Val + "decimal symbol" problem
<b> Använd alltid Str/CStr när du skall konvertera tal till strängar</b>
Jepp funkade perfekt med Str(Val("1.2")), då får jag ALLTID "1.2" som svar.
Varför går jag då från String->Double->String?
Jo, jag tänkte som följande, att om jag matar in "1", så vill jag ha "1.0".
("1.2" => "1.2", "10.023" => "10.0", "90" => "90.0" osv)
Jag använder då
Format$(Val("1"), "0.0")
Detta ger dock värdet "1,2" vilket Val() inte gillar, utan får då "1" som svar:
Str(Val(Format$(Val("1"), "0.0"))) => "1"
Hur får jag Format$ att alltid returnera "." som decimal-tecken?
Sv:CDbl/Val + "decimal symbol" problem
Har indata som "20", "10.123", "0.0012".
Dessa vill jag ha en decimal på.
Och jag vill använda Val() och Format().
Går att lösa med, som du sa, Replace(Format$(1, "0.0"), ",", ".").Sv: CDbl/Val + "decimal symbol" problem
Handlar det om presenter för användare eller att en applikation/komponent kräver det?
Du talar inte om vad du gör. I vilket sammanhang du behöver formatera ditt tal med ett angivet antal decimaler och decimalseparator.
Detta är värdefull information för att finna en bra lösning.Sv:CDbl/Val + "decimal symbol" problem
Private Sub Command1_Click()
MsgBox Format$(Val("10.1623"), "0.0")
MsgBox Format$(Val("20"), "0.0")
MsgBox Format$(Val("0.00027"), "0.0")
End Sub
</code>Sv:CDbl/Val + "decimal symbol" problem
Vid utskrift (skriver till fil), vill jag ha decimaler.Sv: CDbl/Val + "decimal symbol" problem
Tror Vi hamnat i en återvändsgränd.!
Lönar sig inte att Vi försöker hjälpa honom !
Over and outSv: CDbl/Val + "decimal symbol" problem
Varför skriver du till fil?
Ska den in i ett system?
Ska någon läsa den, skall den skrivas ut?Sv: CDbl/Val + "decimal symbol" problem
Då kan du ange decimalseparator osv. Dessutom kan du lägga till poster med SQL eller med ett Recordset.
Är din fil, komma, tab eller fastbredd?Sv:CDbl/Val + "decimal symbol" problem
Jag sparar all data komma separerat i filen.
Det är inte nödvändigt att ha decimalen med om jag inte angivit decimaler,
men det jag undrar är hur man ändå gör det på ett korrekt sätt.Sv: CDbl/Val + "decimal symbol" problem
Dim con As ADODB.Connection
Dim rs As ADODB.Recordset
FileName = "[textfile#txt]"
path = App.Path & "\Text files\"
'This is connection for a text file
Set con = new ADODB.Connection
con.Open "Provider=Microsoft.Jet.OLEDB.4.0;" + _
"Extended Properties='Text';" + _
"Data Source=" & path & ";"
Set rs = new ADODB.Recordset
rs.Open "SELECT * FROM " & FileName, con, adOpenKeyset , adLockOptimistic
rs.Close
con.close
Nyckeln är schema.ini filen som skall ligga i samma katalog som textfilerna.
<code>
[textfile.txt]
ColNameHeader=False
Format=CSVDelimited
DecimalSymbol=.
</code>
Sv: CDbl/Val + "decimal symbol" problem
http://msdn.microsoft.com/library/en-us/odbc/htm/odbcjetschema_ini_file.asp
Öven om den är för ODBJ så är den tillämpar i detta fallet.
Något som oxå är mycket intressant är att du kan ange datatype för kolumner.
Detta borde underlätta för att läsa och skriva till textfiler.
Jag vet dock ej hur effektiv denna drivrutin är.
Om du vill skapa ett eget filformat för bannor så rekomenderar jag ett binärtfilformat istället.
Där du skriver User Defined Types(UDT):
Public Type Cell
X As Integer
Y As Integer
PictureIndex As Integer
End Type
Dessa kan du väldigt effektivt läsa och skriva till filer då ingen konvertering behöver göras till stränger.
Tyvärr kan du då inte längre redigera dem manuellt i en texteditior.
Sv:CDbl/Val + "decimal symbol" problem
Jag sparar all data komma separerat i filen. </b>
Då skulle jag säga att det du ska satsa på är en binär representation istället. Behöver inte tänka på skiten. Punkt och decimalkomma är enbart en ui- (eller möjligtvis system-)fråga.Sv: CDbl/Val + "decimal symbol" problem
Sv:CDbl/Val + "decimal symbol" problem
Sv: CDbl/Val + "decimal symbol" problem
Men ! begriper frågeställaren hur Vi menar ?Sv: CDbl/Val + "decimal symbol" problem
Ja, att spara banorna binärt är självklart det bästa.
Men spelet jag har läser in datat i text-format. Och jag gjorde spelet för 4 år sen, och orkar inte ändra.
Tack för alla tips och råd!Sv:CDbl/Val + "decimal symbol" problem