Autore Topic: [Risolto] Funzione conversione float  (Letto 2698 volte)

Offline dex

  • Gran Maestro dei Gamberi
  • *****
  • Post: 872
    • Mostra profilo
[Risolto] Funzione conversione float
« il: 15 Marzo 2019, 07:44:32 »
Ciao raga mi serve capire come convertire testo in numero float senza errori

mi arrivano stringhe con numeri ma alcune sono sporche tipo: 25ò25   87)756


le devo convertire in float oppure ritornarmi 0 se sporca.

tipo:
Codice: [Seleziona]
Print Cinst(Val(stringa))

solo che cosi quando arrivano sporche mi va in errore, come posso rimediare?
« Ultima modifica: 16 Marzo 2019, 01:51:49 da dex »

Offline Gianluigi

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 4.244
  • Tonno verde
    • Mostra profilo
Re:Funzione conversione float
« Risposta #1 il: 15 Marzo 2019, 10:01:39 »
Una cosa così dovrebbe andare bene:

Codice: [Seleziona]
  If Not IsNull(Val("87)756")) Then
    Print "È un numero"
  Else
    Print "Non è un numero"
  Endif

Anche più veloce:
Codice: [Seleziona]
  If Val("87)756") Then
    Print "È un numero"
  Else
    Print "Non è un numero"
  Endif

Naturalmente questo codice fa passare qualunque stringa interpretabile da Val, tienine conto.
« Ultima modifica: 15 Marzo 2019, 10:32:21 da Gianluigi »
nuoto in attesa del bacio di una principessa che mi trasformi in un gambero azzurro

Offline dex

  • Gran Maestro dei Gamberi
  • *****
  • Post: 872
    • Mostra profilo
Re:Funzione conversione float
« Risposta #2 il: 15 Marzo 2019, 10:41:09 »
Ciao Gianluigi

avevo già provato qualcosa di simile con val, il problema è che le stringhe contenenti le cifre hanno separatore decimale diverso, alcune hanno il punto altre la virgola, e val ora non ricordo con quale, ne riconosceva soltanto una.
ho fatto delle prove anche conuna struttura if e chr che mi convertiva in 0 tutti i caratteri alfanumerici, ma anche li non andava bene in quanto una stringa tipo:
12klh45 diventava 1200045.

L'unica possibilità è una struttura if che controlla singolarmente i caratteri e se ne trova di alfanumerici cambia il contenuto della stringa in 0, data la quantità delle stringhe richiede molte risorse.
speravo in una cosa più semplice tipo isnumber ecc..

Offline Gianluigi

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 4.244
  • Tonno verde
    • Mostra profilo
Re:Funzione conversione float
« Risposta #3 il: 15 Marzo 2019, 10:43:20 »
Per me ti stai sbagliando, prova meglio.
Val riconosce sia la virgola che il punto.

Rettifica: Hai ragione riconosce solo la virgola.
La cosa è normale in quanto Val localizza.
Potresti provare prima con un Replace():
Codice: [Seleziona]
If "876.00" Like "*.??" Then Print Replace("876.00", ".", ",")

C'era un refuso, Print scordai!
« Ultima modifica: 15 Marzo 2019, 13:12:17 da Gianluigi »
nuoto in attesa del bacio di una principessa che mi trasformi in un gambero azzurro

Offline dex

  • Gran Maestro dei Gamberi
  • *****
  • Post: 872
    • Mostra profilo
Re:Funzione conversione float
« Risposta #4 il: 15 Marzo 2019, 10:56:54 »
devo provare a passare replace prima

Offline Gianluigi

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 4.244
  • Tonno verde
    • Mostra profilo
Re:Funzione conversione float
« Risposta #5 il: 15 Marzo 2019, 11:00:12 »
Naturalmente se hai dei numeri tipo 12,345.67 la cosa si fa più complicata.
Ma se hai solo separatori decimali il codice di prima dovrebbe funzionare bene.
nuoto in attesa del bacio di una principessa che mi trasformi in un gambero azzurro

Offline dex

  • Gran Maestro dei Gamberi
  • *****
  • Post: 872
    • Mostra profilo
Re:Funzione conversione float
« Risposta #6 il: 15 Marzo 2019, 11:43:12 »
in effetti mi capitano anche quelli.
devo fare un if che controlla, se trova . e , mi deve togliere la virgola e poi con replace converto la virgola in punto

Offline Gianluigi

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 4.244
  • Tonno verde
    • Mostra profilo
Re:Funzione conversione float
« Risposta #7 il: 15 Marzo 2019, 12:44:30 »
Penso che una cosa così dovrebbe andare:
Codice: [Seleziona]
Public Sub Main()

  Dim s As String

  '' Se il numero più grande è una cosa del genere s = "123,456,789,987.89"
  '' parti da quel pattern e scali fino a:
  s = "123,456.78" '' che funziona anche su 12,345.67 e 1,234.56
  If s Like "*,*,*,*.??" Then
    Print Scan(s, "*,*,*,*.*")[0] & "." & Scan(s, "*,*,*,*.*")[1] & "." & Scan(s, "*,*,*,*.*")[2] & "." & Scan(s, "*,*,*,*.*")[3] & "," & Scan(s, "*,*,*,*.*")[4]
  '' ...
  Else If s Like "*,*.??" Then
    Print Scan(s, "*,*.*")[0] & "." & Scan(s, "*,*.*")[1] & "," & Scan(s, "*,*.*")[2]
  Endif

End

Naturalmente tenendo anche conto dei numeri senza separatori decimali...
« Ultima modifica: 15 Marzo 2019, 13:04:19 da Gianluigi »
nuoto in attesa del bacio di una principessa che mi trasformi in un gambero azzurro

Offline dex

  • Gran Maestro dei Gamberi
  • *****
  • Post: 872
    • Mostra profilo
Re:Funzione conversione float
« Risposta #8 il: 15 Marzo 2019, 17:20:39 »
Buona idea
visto che i miei numeri sono più piccoli di quello che hai ipotizzato dovrebbe venire più snello.

Grazie Gianluigi

Offline Gianluigi

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 4.244
  • Tonno verde
    • Mostra profilo
Re:Funzione conversione float
« Risposta #9 il: 15 Marzo 2019, 17:28:29 »
Prego  :)
Scan è molto potente e veloce solo ricordati di passarlo a una matrice così fai prima e meglio  :ciao:
nuoto in attesa del bacio di una principessa che mi trasformi in un gambero azzurro

Offline dex

  • Gran Maestro dei Gamberi
  • *****
  • Post: 872
    • Mostra profilo
Re:Funzione conversione float
« Risposta #10 il: 15 Marzo 2019, 17:36:50 »
dice che conviene metterlo in matrice?
i miei dati al massimo sono 1,000.2222

non ho mai usato scan

se dovesse arrivare 5.666,3333, da come ho letto il tuo codice non dovrebbe fare nulla, giusto?
« Ultima modifica: 15 Marzo 2019, 17:39:55 da dex »

Offline Gianluigi

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 4.244
  • Tonno verde
    • Mostra profilo
Re:Funzione conversione float
« Risposta #11 il: 15 Marzo 2019, 17:40:40 »
No, se hai solo una virgola e un punto non serve.
Usi solo Like e Scan per tutto e non ti serve più Replace.
nuoto in attesa del bacio di una principessa che mi trasformi in un gambero azzurro

Offline Gianluigi

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 4.244
  • Tonno verde
    • Mostra profilo
Re:Funzione conversione float
« Risposta #12 il: 15 Marzo 2019, 17:45:09 »


se dovesse arrivare 5.666,3333, da come ho letto il tuo codice non dovrebbe fare nulla, giusto?

Devi vedere quali sono i dati che ti arrivano e in base a quelli ti crei i pattern.
Se vuoi puoi scrivere qui tutte le varianti e io ti scrivo il codice, ma credo che tu non ne abbia bisogno.
Comunque "a eshposizione"
nuoto in attesa del bacio di una principessa che mi trasformi in un gambero azzurro

Offline dex

  • Gran Maestro dei Gamberi
  • *****
  • Post: 872
    • Mostra profilo
Re:Funzione conversione float
« Risposta #13 il: 15 Marzo 2019, 17:46:14 »
ho appena letto il wiki di scan
caspita è molto versatile, potrei anche utilizzarlo per pulire le mie stringhe dai caratteri alfanumerici

Offline dex

  • Gran Maestro dei Gamberi
  • *****
  • Post: 872
    • Mostra profilo
Re:Funzione conversione float
« Risposta #14 il: 15 Marzo 2019, 17:48:44 »
semplice a me i dati arrivano:

1234
1234.55
1.222,235569
3,898.4444

ho solo queste varianti, quando i decimali superano 4 le taglio