Gambas-it

Archivi (sola lettura) => Programmazione (Gambas 2) => Topic aperto da: Lux - 11 Settembre 2009, 17:57:40

Titolo: Stringhe e numeri
Inserito da: Lux - 11 Settembre 2009, 17:57:40
è possibile trasformare una stringa in un numero e trattarla come tale?
se ad esempio ho una stringa composta da numeri ma che tratto come stringa e poi vorrei ritrattarla come numero è possibile?
Non so se mi sono spiegato bene.....
Ciao!
Titolo: Re: Stringhe e numeri
Inserito da: Ceskho - 11 Settembre 2009, 18:01:02
Puoi usare Val() e Str()

La prima accetta una stringa e la trasforma in un numero...
Ad esempio

Codice: [Seleziona]
Val("589")


restiuirà 589 come numero

mentre Str accetta un variant e restituisce una stringa. Ad esempio

Codice: [Seleziona]
Str(1236)


restiuisce una stringa del tipo "1236"
Titolo: Re: Stringhe e numeri
Inserito da: fsurfing - 11 Settembre 2009, 20:07:11
oltre a val(stringa) puoi usare anche  cint(stringa) per convertire una stringa in numero,

il passo inverso invece lo puoi quasi sempre omettere infatti se in una variabile inserisci un numero questo verrà trattato come una stringa in automatico.


inoltre sulla 2.15.2 se in una variabile integer memorizzi una stringa contenente numeri questa viene convertita automaticamente, cosa non valida sulle versioni precedenti, quindi per sicurezza conviene sempre effettuare una conversione nel formato corretto
Titolo: Re: Stringhe e numeri
Inserito da: Lux - 11 Settembre 2009, 22:04:43
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:
Codice: [Seleziona]
Type mismatch: wanted string, got float instead

vi informo che uso le gtk, anche se onestamente non credo che derivi da ciò questo messaggio.
Titolo: Re: Stringhe e numeri
Inserito da: fsurfing - 11 Settembre 2009, 22:05:53
dovresti inserire uno stralcio di codice
Titolo: Re: Stringhe e numeri
Inserito da: Lux - 11 Settembre 2009, 22:11:53
Hai ragione, scusami, ecco:
Codice: [Seleziona]
 
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
Titolo: Re: Stringhe e numeri
Inserito da: fsurfing - 12 Settembre 2009, 12:40:49
non hai indicato dove ti da errore ma credo sia qui:

Codice: [Seleziona]

 tempo = durata / 60
i = InStr(tempo, ".")


prova cosi:


Codice: [Seleziona]

 tempo = (durata / 60 )
i = InStr(tempo, ".")


oppure

Codice: [Seleziona]

 tempo =cstring(durata / 60 )
i = InStr(tempo, ".")
Titolo: Re: Stringhe e numeri
Inserito da: Ceskho - 12 Settembre 2009, 12:50:55
Scusa ma quando fai durata/60 non stai dividendo una stringa per un intero?

Forse dovrebbe essere

tempo = (val(durata)/60)
Titolo: Re: Stringhe e numeri
Inserito da: Lux - 12 Settembre 2009, 12:55:35
è vero ho dimenticato di dire dove sta l'errore.
ecco:
Codice: [Seleziona]
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...
Titolo: Re: Stringhe e numeri
Inserito da: Ceskho - 12 Settembre 2009, 12:58:59
Prova con


secondi = Left$(str(val(Left$(tempo, (i + 2)))) - val(Left$((minuti * 60), 2)))
Titolo: Re: Stringhe e numeri
Inserito da: Lux - 12 Settembre 2009, 13:01:35
Codice: [Seleziona]
secondi = Left$(str(val(Left$(tempo, (i + 2)))) - val(Left$((minuti * 60), 2)))

niente non va.....
Titolo: Re: Stringhe e numeri
Inserito da: Lux - 12 Settembre 2009, 13:13:51
forse ci sono, però ho bisogno ancora di un vostro aiutino, mi direste come faccio a troncare ed approssimare un numero per eccesso o per difetto?
Titolo: Re: Stringhe e numeri
Inserito da: Ceskho - 12 Settembre 2009, 14:42:28
Intendi che vuoi solo la parte intera o che vuoi un numero decimale con x numeri dopo la virgola?
Titolo: Re: Stringhe e numeri
Inserito da: Lux - 12 Settembre 2009, 18:39:43
Citazione
Intendi che vuoi solo la parte intera o che vuoi un numero decimale con x numeri dopo la virgola?

vorrei un numero decimale con x numeri dopo la virgola ;-)
Titolo: Re: Stringhe e numeri
Inserito da: Ceskho - 12 Settembre 2009, 19:08:50
Puoi trasformare il numero in stringa e usare format: http://gambasdoc.org/help/lang/format

E' la prima cosa che mi viene in mente.
Titolo: Re: Stringhe e numeri
Inserito da: Gaspare - 15 Settembre 2009, 17:00:35
qualcuno ha giustamente chiesto prima: Ma vuoi fare operazioni aritmetiche con delle stringhe?

entrambi le variabili tempo e durata sono state dichiarate stringhe e quindi gambas le tratta come tali anche se vi assegniamo dei numeri (li converte automaticamente).
per usare queste variabili in operazioni matematiche vanno riconvertite e diventano (se non contengono altri caratteri oltre alle cifre):
cint(tempo) e cint(durata)
Titolo: Re: Stringhe e numeri
Inserito da: md9327 - 16 Settembre 2009, 11:30:42
Esatto!

Comunque, il troncamento di un numero può essere fatto in diversi modi:
- usare le funzioni CInt(float number)
- convertirlo in stringa come scritto da cesko, e riconvertire la stringa con Val()

L'arrotondamento si può eseguire con Round(a,b). Il primo parametro è il valore float, il secondo indica il numero di digit che intendi ritornare insieme al valore convertito; se indichi 0 il valore ritornato sarà arrotondato all'ultima cifra intera. Valori negativi ritornano un numero con decimali; valori positivi arrotonderanno alla cifra intera (es. Round(1972, 2)=2000.
Titolo: Re: Stringhe e numeri
Inserito da: Picavbg - 07 Febbraio 2012, 22:51:30
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à:
Codice: [Seleziona]
$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:
Titolo: Re: Stringhe e numeri
Inserito da: vuott - 07 Febbraio 2012, 23:06:43
Secondo voi, può andare così o posso migliararlo ulteriormente?
:ciao:
Non so se fa proprio al caso tuo:

Codice: [Seleziona]
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   :-[
Titolo: Re: Stringhe e numeri
Inserito da: Picavbg - 07 Febbraio 2012, 23:55:33
Ti ringrazio per l'ottimo suggerimento.
Ho svolto la seguente prova nel mio programma, coi nomi campo effettivi:
Codice: [Seleziona]
  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:
Titolo: Re: Stringhe e numeri
Inserito da: vuott - 08 Febbraio 2012, 03:18:19
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:
Codice: [Seleziona]
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'
                                                           :-\
Titolo: Re: Stringhe e numeri
Inserito da: Picavbg - 08 Febbraio 2012, 10:24:49
La dichiarazione dei tue campi numerici in questione è fatta all'inizio del form:
Codice: [Seleziona]
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:
Titolo: Re: Stringhe e numeri
Inserito da: vuott - 08 Febbraio 2012, 10:31:10
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.

 :ciao:
...è lo stesso sospetto che avevo io. Quello strano risultato non poteva essere determinato da Fix, in quanto - come sai - esso restituisce la parte intera sic et simpliciter di un numero... un po' come Int .
Titolo: Re: Stringhe e numeri
Inserito da: fsurfing - 08 Febbraio 2012, 12:37:23
io per arrotondare i decimali ho sempre utilizzato round

dim f as float = 12.6800000003

f=round(f,-2)

print f

sto scrivendo dal telefono,per cui non posso provare il codice, ma se la memoria non mi inganna dovrebbe essere funzionante, il -2 indica ilnumero di cifre decimali
Titolo: Re: Stringhe e numeri
Inserito da: vuott - 08 Febbraio 2012, 12:44:24
io per arrotondare i decimali ho sempre utilizzato round
dim f as float = 12.6800000003
f=round(f,-2)
print f
sto scrivendo dal telefono,per cui non posso provare il codice, ma se la memoria non mi inganna dovrebbe essere funzionante, il -2 indica ilnumero di cifre decimali

Soccorso "Sgombra neve" !   :P
...)-oHO
Ho provato io il tuo codice, fsurfing  :ciao: , e funziona perfettamente !
Molto bene: un'istruzione anche più breve di quella che avevo suggerito io.
Titolo: Re: Stringhe e numeri
Inserito da: Picavbg - 08 Febbraio 2012, 13:00:31
Qui non abbiamo bisogno dello spazzaneve, ma solo di scafandri da palombaro per immergerci nella pioggia quasi continua. Poi considerando che ci sono località con -21°, noi, con appena 3°, potremmo scendere al mare, per fare il bagno.  :D

Ho provato  anch'io il codice suggerito da fsurfing ed, effettivamente, sembra che funzioni. Ecco il risultato:
Citazione
Codice: [Seleziona]
PRIVATE f_SaldoFin AS Float
PRIVATE f_TotResta AS Float = 0
------- bla bla -------
------- bla bla -------
 PRINT "f_TotResta vecchio= '" & f_TotResta & "'"
  PRINT "f_SaldoFin vecchio= '" & f_SaldoFin & "'"
  f_TotResta = Round(f_TotResta, -2)
  f_SaldoFin = Round(f_SaldoFin, -2)
  PRINT "f_TotResta nuovo= '" & f_TotResta & "'"
  PRINT "f_SaldoFin nuovo= '" & f_SaldoFin & "'"
'------------------------------------------------------
f_TotResta vecchio= '385.87'
f_SaldoFin vecchio= '385.870000000003'
f_TotResta nuovo= '385.87'
f_SaldoFin nuovo= '385.87'

Grazie a tutti e due.  :2birre: