Grazie mille! Questa operazione di conversione si chiama casting, vero?
Comunque ho un problemino, nel senso che utilizzavo una stringa numero già prima (in un'altra parte del mio programmino a cui sto lavorando) e quando la trattavo come numero (senza utilizzare la conversione) tutto filava liscio e riuscivo a fare anche operazioni aritmetiche. Ora invece mi restituisce questo errore:
Type mismatch: wanted string, got float instead
vi informo che uso le gtk, anche se onestamente non credo che derivi da ciò questo messaggio.
Hai ragione, scusami, ecco:
PRIVATE hprocess AS Process
PRIVATE information AS String
PRIVATE durata AS String 'Stringa che indica la durata del file audio/video in secondi
PRIVATE tempo AS String 'Indica il tempo totale del video in minuti
PUBLIC SUB ToolButton8_Click()
'TASTO PLAY******************************************************
'Riproduce un file audio/video il cui indirizzo è nella ComboBox1
DIM minuti AS String 'Visualizza i minuti totali e la scritta min.
DIM secondi AS String 'Visualizza i secondi totali e la scritta min.
DIM i AS Integer 'contatore
DIM lettere AS String 'Variabile per l'estrazione delle prime 4 lettere
lettere = (Left$(ComboBox1.Text, 4))
SELECT CASE lettere
CASE "/hom"
SHELL "mplayer -nosound -vo null -ss 24:00:00 -really-quiet -identify " & ComboBox1.Text & " 2>&1 | grep ID_LENGTH | cut -f2 -d=" TO durata
tempo = durata / 60
i = InStr(tempo, ".")
minuti = Left$(tempo, (i - 1))
secondi = Left$(Left$(tempo, (i + 2))) - Left$(minuti * 60, 2)
Label5.Text = minuti & "." & secondi & " " & "min."
hprocess = EXEC ["mplayer", "-wid", Embedder1.Handle, ComboBox1.Text]
'Timer per il trascorrere del tempo e dello slider
Timer1.Enabled = TRUE
Embedder1.Mouse = TRUE
CASE "/dev"
SHELL "mplayer -nosound -vo null -ss 24:00:00 -really-quiet -identify " & ComboBox1.Text & " 2>&1 | grep ID_LENGTH | cut -f2 -d=" TO durata
tempo = durata / 60
i = InStr(tempo, ".")
minuti = Left$(tempo, (i + 2)) & " " & "min."
Label5.Text = minuti
hprocess = EXEC ["mplayer dvd://1", " -dvd-device ", ComboBox1.Text, " -wid", Embedder1.Handle]
'Timer per il trascorrere del tempo e dello slider
Timer1.Enabled = TRUE
Embedder1.Mouse = TRUE
' CATCH 'In caso di operazione lettura dvd fallita
' Message.Error("Nessun dvd inserito!")
CASE ELSE
Message.Error("This is impossible")
END SELECT
END
non hai indicato dove ti da errore ma credo sia qui:
tempo = durata / 60
i = InStr(tempo, ".")
prova cosi:
tempo = (durata / 60 )
i = InStr(tempo, ".")
oppure
tempo =cstring(durata / 60 )
i = InStr(tempo, ".")
è vero ho dimenticato di dire dove sta l'errore.
ecco: secondi = Left$(Left$(tempo, (i + 2))) - Left$((minuti * 60), 2)
Ho anche aggiunto le parentesi ma niente.
Ho provato a mettere val ma mi da sempre lo stesso errore...
secondi = Left$(str(val(Left$(tempo, (i + 2)))) - val(Left$((minuti * 60), 2)))
niente non va.....
Ho trovato questa discussione durante la ricerca di un algoritmo di troncamento di un valore float alle prime due cifre decimali, strettamente legato al trattamento di dati numerici di tipo valuta.
Non avendo trovato alcunchè sul troncamento di valori float legato alle cifre decimali, mantenendo inalterata, ovviamente, la parte intera, ho scritto le seguenti istruzioni in grado di effettuare il troncamento occorrente alle mie necessità:
$Valuta = fValuta
i = InStr($Valuta ".")
IF i <> 0 THEN
$Int = Left($Valuta, i - 1)
$Dec = Mid($Valuta, i + 1, 2)
ENDIF
$Valuta = $Int & "." & $Dec
Semprecchè non esista già una funzione specifica, io non ho saputo fare di meglio. Secondo voi, può andare così o posso migliararlo ulteriormente?
Grazie per l'attenzione. :D
:ciao: :ciao:
Secondo voi, può andare così o posso migliararlo ulteriormente?
:ciao:
Non so se fa proprio al caso tuo:
Public Sub Button1_Click()
Dim a As Float = 5.123456789
a = Fix(a * 100) / 100
Print a
End
...alla fine ottengo in console: 5,12 :-[
Ti ringrazio per l'ottimo suggerimento.
Ho svolto la seguente prova nel mio programma, coi nomi campo effettivi:
PRINT "f_TotResta vecchio= '" & f_TotResta & "'"
PRINT "f_SaldoFin vecchio= '" & f_SaldoFin & "'"
f_TotResta = Fix(f_TotResta * 100) / 100
f_SaldoFin = Fix(f_SaldoFin * 100) / 100
PRINT "f_TotResta nuovo= '" & f_TotResta & "'"
PRINT "f_SaldoFin nuovo= '" & f_SaldoFin & "'"
risultato:
f_TotResta vecchio= '385.87'
f_SaldoFin vecchio= '385.870000000003'
f_TotResta nuovo= '385.86'
f_SaldoFin nuovo= '385.87'
Come puoi vedere, ha funzionato solo per il 2° campo, mentre il primo è stato alterato nella sua parte decimale, invalidando i passi successivi del programma.
:ciao:
Come puoi vedere, ha funzionato solo per il 2° campo, mentre il primo è stato alterato nella sua parte decimale, invalidando i passi successivi del programma.
:ciao:
:ciao:
...è alquanto strano !
Da quello che mi sembra di capire, f_TotResta iniziale è uguale a: 385.87 , mentre f_SaldoFin iniziale è uguale a: 385.870000000003
Ritenendo che quei valori iniziali fossero giusti, ho fatto questa prova:
Public Sub Button1_Click()
Dim f_TotResta As Float = 385.87
Dim f_SaldoFin As Float = 385.870000000003
Print "f_TotResta vecchio= '" & f_TotResta & "'"
Print "f_SaldoFin vecchio= '" & f_SaldoFin & "'"
f_TotResta = Fix(f_TotResta * 100) / 100
f_SaldoFin = Fix(f_SaldoFin * 100) / 100
Print "f_TotResta nuovo= '" & f_TotResta & "'"
Print "f_SaldoFin nuovo= '" & f_SaldoFin & "'"
End
Il risultato in console è stato il seguente:
f_TotResta vecchio= '385.87'
f_SaldoFin vecchio= '385.870000000003'
f_TotResta nuovo= '385.87' <------
f_SaldoFin nuovo= '385.87'
:-\
La dichiarazione dei tue campi numerici in questione è fatta all'inizio del form:
PRIVATE f_SaldoFin AS Float
PRIVATE f_TotResta AS Float = 0
f_TotResta è valorizzato a '0' nella stessa riga di dichiarazione perchè il suo contenuto viene sempre incrementato, mentre f_SaldoFin non ha bisogno di una valorizzazione iniziale perchè, la prima volta che riceve dati , li riceve tramite trasferimento. Entrambi i campi possono ricevere valori decimali o interi a seconda che la moneta in circolazione sotto la data corrente sia €uro o £ira. A parte tutto ciò, io sono convinto che il valore raggiunto in un dato momento da f_TotResta sia non proprio (tanto per rimanere nell'esempio) 385.87, ma un valore inferiore, assai vicino ad esso. Solo così posso spiegarmi il nuovo valore dopo il troncamento con f_TotResta = Fix(f_TotResta * 100) / 100.
Il troncamento si rende necessario per potere ottenere, in casi come quello che si è manifestato ieri, un'uguaglianza dalla if successiva che altrimenti non si verifecherebbe. Non dimentichiamo poi che la nostra attuale moneta arriva fino ai centesimi.
Purtroppo, sempre nello stesso programma, ho dovuto affrontare già in altre occasioni situazioni di valori numerici float che nominalmente avrebbero dovuto esporre valori uguali, ma che in pratica non è avvenuto, proprio come è successo ieri. Ciò mi ha fatto pensare al troncamento fino alle due cifre decimali. Però, alla luce della prova fatta ieri notte, dopo la tua brillante idea (io non ci avevo proprio pensato), resto sempre dell'opinione che la strada più sicura da percorrere sia il passaggio dei valori in campi di comodo, in formato stringa, come nella formula algoritmica con cui ho riaperto la discussione.
Grazie comunque, ti sono veramente grato. :D
:ciao: