Newsgroup: it.comp.lang.visual-basic
Titolo: Gestire il punto e la virgola..

Ciao a tutti,a qualcuno è mai capitato di dover gestire il punto e la
virgola? Es. ho 2 textbox dove inserendo 2 valori, il risultato finale deve
essere la somma dei due,nel caso l'utente voglia inserire un valore decimale
tipo 2,1 ma anzichè utilizzare la virgola utilizzi il punto del tastierino
alfanumerico la somma non sarà corretta, quindi per ovviare al problema ho
inserito nell'evento Keypress() delle due textbox la conversione del punto
in virgola (IF KEYASCII=44 THEN KEYASCII=46), ma questo metodo non funziona
nel caso l'inserimento venga fatto da una inputbox.(non supporta il metodo
keypress) è possibile porvi rimedio?
Grazie dei consigli,ciao!

...

Lo gestisci a valle:
Mid$(Str, InStr(Str, ",")) = "."
Ciao

Fai il controllo quando il textbox perde il controllo (lostfocus) e fai un
ciclo utilizzando Mid$, che ti controlla tutti i caratteri e se ti trova un
"." mette una virgola!
forse esiste un modo migliore di farlo....ma in questo momento non mi viene
in mente nulla (causa sonno) :-)
Ciao Simo



Io sono alle prime armi ma dato che stň studiando un libro e sono proprio
all'istruzione Mid ti posso aiutare:
Dim lun As String, punto As Integer
dim a$
a$ = inputbox("inserisci valore","Valore")
lun = Len(Trim(a$)) 'calcola la lunghezza del numero e toglie eventuali
spazi
For punto = 1 To lun
If Mid(a$, punto, 1) = "." Then
MsgBox "nientepunti, usa la virgola per valori decimali", vbOKOnly, "OCCHIO"
else
' tutto ok, inserisci quello che gli vuoi far fare
end if
In piů dovresti verificare che quello che inserisce nella Inputbox sia
effettivamente un numero, lo potresti fare con una funzione tipo:
Public Function ispositive(x As Variant) As Boolean
' verifica che sia un numero, che il numero sia positivo, e che
' comunque sia compreso nel range Integer per evitare overflow(puoi anche
aumentarlo inserendo un parametro long)
If IsNumeric(x) Then
    If CSng(x) > 0 Then
        If CSng(x) <= 32768 Then
            ispositive = True
        Else
            ispositive = False
        End If
    Else
        ispositive = False
    End If
Else
ispositive = False
End If
End Function
La funzione deve poi essere richiamata tramite un
ispositive(a$)
Ciao
Alessandro

End Function
Perchè scomodare un Single se poi fai il check di overflow su un intero?
Poi, IsNumeric() è una brutta bestia. Sconsiglio l'utilizzo.
Motivo?
IsNumeric("5,5") -> True
IsNumeric("5.5") -> True
Non tiene conto delle impostazioni internazionali e non usa un separatore
decimale fisso.
Al contrario della CDbl() che tiene conto delle impostazioni internazionali
(quindi un uso congiunto di IsNumeric() e CDbl() può portare a un bel RTE).
In realtà la CDbl() (almeno sul mio sistema) funziona correttamente solo con
le impostazioni internazionali di tipo americano.
Con i separatori all'italiana ottengo:
CDbl("5,5") -> 55
CDbl("5.5") -> 55
Personalmente uso sempre Val() per convertire una stringa in numero, con la
limitazione che non sai se un numero è stato inserito = 0 o non era
numerico.
In alternativa puoi usare qualcosa tipo questo:
    Function MyIsNumeric(Value As Variant) As Boolean
        Dim Dbl as Double
        On Error ReSume Next
        Dbl = Value
        MyIsNumeric = (Err.Number = 0)
    End Function
Attento anche alle funzioni stringa: Terminano tutte per $ anche se pochi lo
usano.
    Quelle come Mid (tipo Vaiant) dovrebbero essere scritte come Mids$ (tipo
String).
Ciao

 String).
nel mio caso è fatto a posta, dato che dopo specifico (e controllo)  il tipo
di dati della funzione ho volutamente mettere un variant
ciao
Alessandro