Newsgroup: it.comp.lang.visual-basic
Titolo: Conversione stringa - Numero

Ciao Ragazzi, scusate se vi disturbo x questa cavolata....ma nn capisco
una cosa:
Ho una stringa ricavata da una right...
dim importo
importo = val(Right(record, 6)).....dentro la right ho "  9.00"
ora la devo convertire in numerico visto che devo fare una
mltiplicazione con un altro valore...
importo = Empty
come mai ?
grazie
Ciao

Il 10/04/2006, 
luca_c...@hotmail.com
 ha detto :

Per non entrare nei meandri delle interpretazioni dei variant, ti 
suggerisco di tipizzare, poi vediamo se va:
Dim Importo as Currency
Importo = Val(Right$(record, 6))
Debug.Print CStr(Importo)
Ciao
Alberto
-- 
A questo punto hanno trovato un muro,
un muro duro, molto molto duro,
che siamo noi.

 Debug.Print CStr(Importo)
Quel Right$ mi spaventa un po :)
Premesso che Val mi pare scarti già di suo gli spazi, forse un Trim$ è 
meglio...
Ciao 

Ciao Ragazzi, porca miseria non va !!
Dim Importo as Currency
Importo = Val(Right$(record, 6))
Importo è = 0 !!
ho provato persino a fare una val("  9.00") .... mi restituisce 900
non capisco perchè !! menomale che sull'help, dive che la VAL
gestisce i decimali solo separati con il (.)

 spazi? Non è che invece sono caratteri non stampabili?
Nota che nel mio post gli suggerivo di fare un copiaincolla del mio 
codice...
Metti ad esempio che sia roba che arriva dalla Francia, dove hanno un 
carattere che rasenta la stupidità, ossia un carattere completamente 
vuoto, identico ad uno spazio, ma che *non è* uno spazio...


Sembra che Fabio abbia detto :

?
Se usa Right$, è perchè a sinistra c'è della roba che non serve...


Dopo dura riflessione, 
luca_c...@hotmail.com
 ha scritto :

Cioè, se tu digiti:
Debug.Print CStr(Val("    9.00"))
Ottieni 0 ?
(Prova a copiaincollare quanto sopra e riposta).



Sei sicuro che i primi 2 caratteri di Right(record, 6) siano effettivamente
spazi? Non è che invece sono caratteri non stampabili?
Debug.Print Asc(Right(record, 6))
Debug.Print Asc(Right(record, 5))
Cosa viene fuori?
Bye
Raf

 vuoto, identico ad uno spazio, ma che *non è* uno spazio...
Ma pensa te, questa non la sapevo.
Ciao

 Importo è = 0 !!
Ha ragione Fabio: devi utilizzare un Trim$
Prova così:
  Dim Imporo as Currency
  Importo = Trim$(Val(Right$(record,6)))
 
Ciao
Efisio

Rafunk scriveva il 11/04/2006 :

Già.
E, considerando che viene usato da Windows come separatore delle 
migliaia, ma il Val lo considera non valido e arresta il parsing quando 
lo trova, capisci bene perchè ripeto sempre di non basarsi sulla 
minchiata del Replace$ della virgola col punto, ma di ricavare sempre i 
separatori locali e individuarli, per l'interpretazione delle stringhe 
a contenuto numerico.


Nel suo scritto precedente, fifisio ha sostenuto :

No, questo no.
Di minchiate ne ho viste e lette, ma, per favore, a tutto c'è un 
limite.


 mltiplicazione con un altro valore...
Prima sostituisci il "." con la "," e poi procedi con la conversione,
ovvero:
Dim s as string
Dim importo as currency   ' oppure double
s="    9.81"
importo=CCur(Replace(s, ".", ",", 1, -1, vbTextCompare))

Il 11/04/2006, Negus ha detto :

Oh my God...
Questo thread sta prendendo una brutta piega...


Grazie ragazzi x i consigli,    Albe, lo so che non è corretto fare
una replace, ma per ora ho risolto così:
appoggio = Right(record, 6)
importo_new = CDbl(Trim(Replace(appoggio, ".", ",")))
Per ora lo lascio così, perche stò sclerando per un 'altra cosa...
posso  consiglio ?
io ho la necessità di aprire 3 file txt, o meglio 2 in lettura e 1 in
scrittura CONTEMPORANEAMENTE
file1 = freefile()          mi restituisce 1
file2 = freefile(file+1)  mi restituisce 256
file3= freefile(file2+1) mi restituisce 256
Quindi se il primo file lo uso per scrivere il secondo x leggere il
"primo" file ma quando vado ad aprire il 3 file in lettura, GIUSTAMENTE
mi dice che è già aperto !!
Non posso chiudere i file perche devo fare un confronto tra righe....e
non posso usare tabelle...
Sapete darmi un consiglio ??

luca_c...@hotmail.com
 ha scritto:


 non posso usare tabelle...
Beh, l'ideale è fare
File1=FreeFile()
Open #file1....
File2=FreeFile()
Open #file2....
File3=FreeFile()
Open #file3....
Ciao



Chiama FreeFile senza argomento (vedi la guida per il significato) e subito dopo
*apri* il file corrispondente, altrimenti è ovvio che restituisca sempre lo
stesso numero, visto che finché non lo usi per aprire un file resta disponibile.
Bye
Raf

 non posso usare tabelle...
dim File1 as integer
dim File2 as integer
dim File3 as integer
file1 = freefile          
open pathfile1 for input as file1
file2 = freefile  
open pathfile2 for input as file2
file3= freefile
open pathfile3 for output as file3
Così dovrebbe andare...

 Importo è = 0 !!
Ha ragione Fabio: devi utilizzare un Trim$.
Prova così:
 Dim Importo as Currency
 Importo = Trim$(Val(Right$(record,6)))
Ciao
Efisio

 Importo è = 0 !!
Ha ragione Fabio: devi utilizzare un Trim$.
Dim Importo 
Importo = Trim$(Val(Right$(record,6)))
Ciao, Efisio

ho già provato..... mi dà errore dice che il file è già aperto !
Io non li chiudo i file....devo tenerli aperti in quanto tra i 2 file
di lettura devo fare un confronto e scrivo in quello di scrittura !
Grazie ciao


Ma fai più o meno come ti ha scritto Andrea?
L'importante è che non ricicli lo stesso numero per aprire contemporaneamente 2
file diversi, ovviamente.
Bye
Raf

 Questo thread sta prendendo una brutta piega...
Altrimenti potrebbe usare l'API GetLocaleInfo per raccogliere le varie
impostazioni per controllare gli inserimenti in input.
Altre soluzioni?

Negus ha pensato forte :

Non per controllare gli inserimenti, ma da usare come terzo argomento 
del replace, altrimenti il fatto che vada o non vada diventa puro culo.
Comunque, non serve nessuna Api, basta un 
Replace$(Format$(1.1@,"0.0"),"1","")
Ciao


 Replace$(Format$(1.1@,"0.0"),"1","")
Se non erro con questa si prenderebbe il sep. delle migliaia vero?
Replace$(Format$(1111@,"0,0"),"1","")
Tnx :)

Nel suo scritto precedente, Andrea ha sostenuto :

Direi di si.


 Direi di si.
Tnx ho keepato il msg per quando farò la nuova gestione dei decimal sulle
txt :)

 Tnx ho keepato il msg
Pietà.


 Replace$(Format$(1.1@,"0.0"),"1","")
Accidenti, e poi rispondi a me "oh my god" !
Molto più elegante e precisa con GetLocaleInfo, a questo punto.

 Molto più elegante e precisa con GetLocaleInfo, a questo punto.
Quella è un'API.
Gira solo su Windows (il codice VB è compilabile anche in altri 
ambienti, ad esempio Linux), se passi a .Net devi comunque segarla 
(cioè, puoi lasciarla, ma un principio base di .Net è la portabilità, e 
l'API è la cosa meno portabile del mondo).
Quando si parla di API, il termine 'eleganza' non esiste. Uno è libero 
di utilizzarle, ma che siano una cosa da usare senza pensieri, proprio 
no.
Se tu stai scrivendo in VB, devi usare VB, ogni 'canchero' che bypassi 
il compilatore è, a prescindere, un rischio.
Comunque, al di là dell'eleganza, il tuo CCur funziona solo in alcuni 
sistemi operativi, e non mi sembra una soluzione 'da suggerire'.


 sistemi operativi, e non mi sembra una soluzione 'da suggerire'.
Più che soluzione da suggerire, l'ho vista come uno spunto.

 Più che soluzione da suggerire, l'ho vista come uno spunto.
Beh, rileggi il tuo post. A me sembra un 'consiglio'.
Ma quando si consiglia una cosa sbagliata, mi permetto di 'disturbare'.
Ciao


 Ma quando si consiglia una cosa sbagliata, mi permetto di 'disturbare'.
Nessun disturbo.

Ciao e scusate il ritardo....
grazie per le dritte, ma non riesco proprio come dite voi !
al massimo posso aprire contemporaneamente 2 file
in quanto il freefile assegna 1 / 256
quindi ho deciso di crearmi un Array dove con un cilco metto tutto il
contenuto di 1 file.
così ne posso tenere 2 aperti e posso anche scrivere.
Non sò dove posso "sbagliare" ma così funziona, mentre aprendone 3
no.(non scrive il file) (non ho output, ma append) è uguale.....
Grazie ragazzi x l'auito
 zao zao

 Quali problemi si incontrerebbero su altri sistemi operativi?
Intendevo, ammetto l'imprecisione, che non funziona con sistemi 
operativi impostati con separatore diverso dalla virgola. Ad esempio, 
in sistemi operativi in inglese, visto che il CCur è una funzione 
localizzata.


  zao zao
Ciao
Raf

 Se usa Right$, è perchè a sinistra c'è della roba che non serve...
Boh... diceva che c'è "  9.00"
Ciao. 

Fabio ha spiegato il 11/04/2006 :

Diceva che c'è "   9.00" *dentro la right*, non dentro la stringa.


 Importo č = 0 !!
Ha ragione Fabio: devi utilizzare un Trim$
Prova cosě:
  Dim Imporo as Currency
  Importo = Trim$(Val(Right$(record,6)))
Io per sicurezza ci metterei anche una Left$, tanto per sicurezza...
  Importo = Left$(Trim$(Val(Right$(record,6))))
Ciao 

 operativi in inglese, visto che il CCur è una funzione localizzata.
Ricordiamoci che le impostazioni internazionali sono a livello di utente e 
non di SO ne dipendono dalla lingua dell'SO.
Ciao 

 Diceva che c'è "   9.00" *dentro la right*, non dentro la stringa.
Su, dai... non farmi spiegqare proprio a te come si deve interpretare il 
pensiero di chi scrive qui dentro :)
Se mi dice
Right(record, 6))
e poi che dentro la Right c'è "  9.00", noi che dobbiamo stare sempre due 
(non uno) passi sempre più avanti di chi scrive intendiamo che 'sto 
accidenti di record contiene "  9.00".
Poi magari tu sei ancora più avanti e io non ti seguo più :P
Ciao

Wow!
Che bello! pieno di scienziati. Tutti alunni di Charles Simonyi...
So perfettamente qual è la funzione del *Trim$*, un semplice *val*
basta.
Chi ha fatto la domanda iniziale ha chiesto semplicemente di poter
convertire un right$ (record,6)= " 9.00" in un valore numerico da
moltiplicarlo con un altro valore. Non ha chiesto nè decimali nè
impostazioni internazionali.
La prossima volta ci metto un bel I'm joking così si evitano
*minchiate*.
Comunque quel Left$... io ci avrei messo un bel LTrim$...
I'm joking

 pensiero di chi scrive qui dentro :)
In realtà, a me sembrava talmente chiaro che non ho ritenuto di dover 
'interpretare'.
Ma non lo sapremo mai, perchè nonostante gli abbia chiesto, e poi 
sollecitato, un chiarimento, l'OP è sparito.


 I'm joking
Stavolta quantomeno si capisce che sei ironico.


 Chi è?
Il papà di ms office...

 sollecitato, un chiarimento, l'OP è sparito.
Non essere così cattivo, magari ha da fare :)
Ciao 

 Che bello! pieno di scienziati. Tutti alunni di Charles Simonyi...
Mi contesti che le impostazioni internazionali sono a livello di utente?
Ciao

Fabio ha spiegato il 12/04/2006 :

Se non avesse postato diverse volte, dopo la mia richiesta 1 e 2, non 
me la prenderei. Ma essere glissato (che non si dice, ma rende l'idea) 
non mi piace.


 Mi contesti che le impostazioni internazionali sono a livello di utente?
Assolutamente si.
Ogni utente all'avvio della sessione carica le proprie impostazioni
internazionali.
HKEY_CURRENT_USER\Control Panel\International\.....
Non ricordo per i sistemi Win9x ma da Win2K in poi si.

 Assolutamente si.
Cioè, concordi ma contesti?
E chi sei, la Santanchè?


 E chi sei, la Santanchè?
??? F1...
Ti piacerebbe.... grrrrrrrr....

 HKEY_CURRENT_USER\Control Panel\International\.....
Uč, scienziato, questo si chiama "confermare" non "contestare" ;)
Ciao 

 Uè, scienziato, questo si chiama "confermare" non "contestare" ;)
Ops!! Scusa avevo letto male..

 Direi di si.
dico di no:
?Replace$(Format$(1111@,"0,0"),"1","")
.
?Mid$(CStr(1.1),2,1)
,
-- 
ciao, hal

hal1961, giovedì alle 22.12.40, ha estratto dai neuroni:

Dici di no o dici di si?


 .
Che separatore delle migliaia hai? Se hai l'impostazione ita dovrebbe
essere corretto che dia il punto no?
In fondo la virgola in una format usa il separatore di Win, quindi dovrebbe
essere corretto per avere i separatori indipendentemente se uno usa la
notazione ITA o ENG ecc.
-- 
DBMS Firebird
VB6 + Ado

 Dici di no o dici di si?
dico che sulla macchina dove ho provato, e` giusta la soluzione
con la Mid$.
sistema windows 2000 pro inglese, con regional options per l'utente,
che ha eseguito le due righe di codice sopra, in italiano.
-- 
ciao, hal

 che ha eseguito le due righe di codice sopra, in italiano.
Strano, in teoria le due soluzioni dovrebbero equivalere, anzi quella del 
Replace dovrebbe mettere al riparo da separatori con più di un carattere.
Sul mio sistema (WinXp ita con impostazioni ita) funziona anche modificando 
le impostazioni internazionali.
Ciao

Il 14/04/2006, hal1961 ha detto :

Non ti seguo.
Se le impostazioni locali dell'utente sono quelle italiane, è giusto 
che il separatore delle migliaia sia il punto, quindi la soluzione del 
replace mi sembra corretta.
Proprio non capisco a cosa tu ti stia riferendo.
Ciao


 Proprio non capisco a cosa tu ti stia riferendo.
ops... parlavate di separatore delle migliaia e io pensavo al separatore
dei decimali: e` stato un mio qui-quo-qua :-P
be', in tal caso mi pare piu` chiara ed efficiente da usare e leggere la
chiamata all' API, ma per l'applicazione media visual basic non dovrebbe
far differenza.
buona l'idea della Replace, quindi ;-)
-- 
ciao, hal