Newsgroup: it.comp.lang.visual-basic
Titolo: Isnumeric e Currency: help!

Ciao
Sto realizzando un programma che deve memorizzare in variabili currency
delle stringhe numeriche. Per testare se si tratta di una stringa numerica,
uso
la funzione Isnumeric;
tuttavia mi è capitato un caso strano:
applicando la funzione Isnumeric ad una stringa del tipo "0d261" mi viene
restituito
true!
ecco il codice di esempio:
Private Sub Command1_Click()
Dim s As String
Dim i As Currency
    s = "0d261"
    If IsNumeric(s) Then
        MsgBox "e' numerico"
        i = CCur(s)
    End If
End Sub
il risultato e' che entro nell'if ed all'struzione di conversione CCUR
mi esce un errore di overflow!!!
NB: Sto lavorando su di un PC con impostazioni inglesi(USA)
Saro' costretto a costruirmi una funzione Isnumeric ad hoc andando a
controllare che i caratteri della stringa
siano compresi entro l'intervallo dei caratteri numerici???
Grazie anticipatamente a coloro che vorranno aiutarmi.

 true!
Che IsNumeric non sia tutto furbo me ne sono accorto anch'io...
(anche se alcuni sostengono il contrario).
Per curiosita' prova con "0z261"  e ti dara' false. Questo significa
che il numero che hai fornito e' ok perche' e' interpretabile come
esadecimale.
Anche CDbl non e' il massimo per le conversioni da stringa a
numero.   Fa cose pazze soprattutto con i separatori decimali.
Mi sa che ti conviene farti un IsNumeric tutto tuo.
--
Frogman
indirizzo e-mail corretto: 
be...@reboot.to
--------------------------------------------------------
Non fate i bambini in provetta.
Fateli nella zuppiera che ce ne stanno di piu'.
--------------------------------------------------------

esadecimale.
Lo pensavo anch'io, ma come ho risposto a max in un altro Thread (ma perchè
ne ha postato un altro uguale?) prova a scrivere questi nella finestra di
debug... ne resterai sorpreso
? 0d261
? 1d261
? 2x261
? 3zd261
? 3dz261 ' a questo punto questa proprio non la capisco...
Ciao

 ha scritto nel messaggio news:8pdao9$bh2$1...@nslave2.tin.it...

Qui ci vorrebbe Maurizio a spiegarcela.   Quando qualche giorno
fa, nel thread "E' un bug si o si" affermavo che IsNumeric non e'
a posto al 100% mi aveva risposto che la mia affermazione era
errata al 100%.   Mi basavo su altre considerazioni in effetti, ma
la conclusione e' sempre la stessa.
Che dire poi di CDbl quando lo si adopera per convertire stringhe
in double?  Pazzia pura...   Definisci il punto come separatore
decimale nel tuo sistema (come d'altronde presso gli stessi
sviluppatori di VB). Poi fai:
dim d as Double
d=cdbl("1.2")      ' nota bene:  col punto decimale
...e lui in alcuni sistemi ti ritorna 12 (sul mio ad esempio), ma non
su tutti. Ho fatto fare lo stesso esperimento ad alcuni miei amici,
e ho avuto risultati discordi.   Come fidarsi ?
accoppialo con IsNumeric e vedrai che belle porcherie saltano
fuori...  specie su programmi o routines che devono funzionare
con piu' impostazioni locali...


e ho avuto risultati discordi.   Come fidarsi ?
Non ho ben capito se nel tuo caso ritorna 12 pur avendo impostato il
separatore decimale come ".".
In questo caso mi sembra molto strano.
Però puoi fare come in genere si dovrebbe: imposti il punto decimale, fai la
conversione, rimetti a posto il punto decimale.
Ciao

 conversione, rimetti a posto il punto decimale.
Come "Imposti il punto decimale" ??
Dovrei cambiare le impostazioni nel pannello di controllo velocissimamente
mentre il sw gira?  Non sono Flash...
Cmq ho riprovato per sicurezza sul mio sistema (w2000, vb6.0 no SP) e
confermo quanto su esposto.
Piccola prova: 
http://www.reboot.to/varie/bug.jpg


> max:

Caro max, la cosa mi ha incuriosito perche' sono uno di quelli
che si fida abbastanza di IsNumeric.
Ho cosi` fatto qualche prova, consultato documentazione, e
seguito con attenzione il dipanarsi del dialogo fra Frogman e
Zanna.
Ma vorrei fare una premessa. E ti sottopongo il seguente
esempio:
    Option Explicit
    Sub Main()
      Dim s As String
10    s = "922337203685478"
      If IsNumeric(s) Then
20      Debug.Print CCur(s)
      Else
        Debug.Print "ERRORE!"
      End If
    End Sub
VB3Pro:
Errore 13, Type mismatch, alla riga 20.
VB4Pro/32:
Errore 6, Overflow, alla riga 20. Con VB6WME otteniamo questo
stesso esito e, suppongo, anche con VB5.
Ora sostituiamo la riga 10 con la seguente:
10    s = "0d261"
VB3Pro:
Output: ERRORE!
VB4Pro/32:
Errore 6, ecc.
E` evidente che qualcosa e` cambiato nel passaggio da VB3 a
VB4/32 perche', a fronte di un comportamento differente, nel
caso di VB3, per il quale solo "922337203685478" e` un numero
e non "0d261", da VB4/32 in poi sia "922337203685478" che
"0d261" sono "numeri". E che numero sara` mai "0d261"? Non un
esadecimale, come qualcuno ha detto, ma l'equivalente di
"0e261", ovvero:
    0E+261
Eggia'... La notazione scientifica! Il perche' possa essere
anche usato "d" oltre ad "e" non lo so. Ma le cose, direi,
stanno cosi` e mi piacerebbe sapere perche'.
Immagino che tu non ti sorprenda per il fatto che
"922337203685478", superato, giustamente, il test di
"numericita`", generi un errore quando tenti di convertirlo in
Currency. Effettivamente e` "troppo grande" per stare in una
variabile dichiarata Currency. Pero` e` una situazione che
potrebbe capitare, e tu la gestiresti come va gestita, senza
sorprenderti poi molto. Invece con "0d261", che e` anche lui
un numero legittimo per VB, fai un po' di storie... Ti capisco
perche' la cosa, non essendo documentata (almeno credo) fa un
po' girare i totani. Zitto zitto, come se niente fosse (ma
forse ne ha parlato prima in uno dei suoi tanti articoli)
Balena nel suo "Programmare VB6" se ne viene fuori con la
frase:
"The IsNumeric function returns True if the value can be
successfully converted to a number using the CDbl function,
even if the native format is different. (The Variant variable
holds a string, for example.)"
CDbl... capisci?! E dove stava scritto questo? Non nella guida
relativa ad IsNumeric, che recita (VB6):
"Restituisce un valore Boolean che indica se un'espressione
può essere valutata come numero.
Sintassi
IsNumeric(espressione)
L'argomento obbligatorio espressione è un valore di tipo
Variant contenente un'espressione numerica o un'espressione
stringa.
Osservazioni
IsNumeric restituisce True se espressione viene riconosciuta
per intero come dato numerico, in caso contrario restituisce
False.
IsNumeric restituisce False se espressione è un'espressione
data."
La cosa curiosa e` che, mentre nella guida di VB si specifica
che espressione "e` un valore di tipo Variant", questo
concetto non e` espresso nella guida di VB4 (e VB5?) mentre
era gia` presente nella guida di VB3.
E sappiamo bene che i Variant di VB3 non sono piu gli stessi
da VB4 (32?) in poi:
"The Variant data type supported under Visual Basic 3.0 is not
compatible with the OLE 2.0 variants used by Visual Basic
4.0." (Appleman)
Ecco, se non altro, il motivo del differente comportamento di
cui sopra. Almeno credo.
Che dire, in conclusione?
Che dopo aver testato se e` un numero... devi testare se e` un
numero che ricade nel range che va bene a te.
Che quando converti da stringa a numero devi porti il problema
se quello che tu intendi per numero e` la stessa cosa che
intende VB.
Sbaglio?
--
Ciao.
Maurizio
--------
?SPQR(C)
 X