Italian B4J - Separatore decimali

Gottrik

Member
Licensed User
Longtime User
Se non sbaglio, VB6 utilizza un separatore dei decimali in accordo con il paese e con la lingua selezionata , quindi la virgola “ , “ per l’Italia e il punto “ . “ per la Svizzera ecc. ecc.

La stessa cosa avviene con Microsoft Excel .

Quindi, per evitare errori, quando uso VB6 utilizzo la seguente istruzione, che “ converte il punto Chr(46) in virgola Chr(44) “ , per esempio, usando la cella Calibro.text :

Private Sub Calibro_KeyPress(KeyAscii As Integer)
If KeyAscii = 46 Then KeyAscii = 44
End Sub

Con VB6 funziona …

Con B4a il problema fortunatamente non esiste perché, se ho capito bene, quando si usa una “cella” destinata a ricevere un valore numerico, la tastiera offre solo il separatore “punto” .

Utilizzando B4J dovrei invece convertire la virgola (44) nel punto (46) , come fare ?

Grazie a tutti
 
non ricordo se esiste una libreria di qualche utente, ma puoi tentare in questo modo
Code: Copy
Dim a As Double :'importante deve essere Double
   a=1234.56
   Dim b As String
   b=NumberFormat2(a,0,2,2,True)
   b=b.Replace(".","^")
   b=b.Replace(",",".")
   b=b.Replace("^",",")
   Log(b)
 
Grazie Gianni

Ho provato e va bene se devo trasformare 1234.56 in 1234,56 ( quindi se da punto voglio ottenere la virgola ).
Però io devo fare il contrario, partendo 1234,54 voglio ottenere 1234.56 (dalla virgola voglio ottenere un punto )
Inoltre, se ho dichiarato ” Dim a as Double “ non posso poi digitare 1234,56 che viene inteso come stringa .

Possibile che non esista una libreria specifica ?

Invece con VB6 se inserisco un punto in una cella , ottengo immediatamente una virgola .
Questo perché Chr(46) viene immediatamente convertito in Chr(44)
Con B4J dovrei invece fare il contrario ... Chr(44) dovrebbe essere convertito subito in Chr(46).
 
Gianni
Forse, problema risolto.
Un po' laborioso, grazie per il tuo aiuto.
Ciao
 
se ti va di pubblicare la soluzione, potrebbere ritornare utile ad altri.
 
Solitamente dopo il ceck per inserire solo numeri e virgola e questo lo fai con l'evento TextChanged di una TextField, hai sempre una stringa appunto per la presenza di una "," se ci sono decimali.
Con la funzione Replace poi fai il seguito.
Infine quando fai le tue operazioni matematiche e qui deve esserci il "." e devi ritornare alla visualizzazione con la "," usi la funzione Numberformat2(double,1,2,2,False).Replace(".", ",")
Qui si presume che ci debbano essere due decimali (€)

Esempio d'inserimento numeri e virgola
Code: Copy
Sub txtdecimal_TextChanged (Old As String, New As String)
    Dim txt As TextField = Sender
    New = CeckIfIsDigit(New)
    txt.Text = New
    txt.SetSelection(txt.Text.Length, txt.Text.Length)
End Sub

Sub CeckIfIsDigit(new As String) As String
    Dim su As ApacheSU
    If new.Length = 0 Then Return ""
    Dim i As Int = su.CountMatches(new, ",")
    If i = 2 Then Return (new.SubString2(0, new.Length-1))
    If IsNumber(new.SubString(new.Length-1)) Or new.EndsWith(",") Then
        If new.Length = 1 And new.EndsWith(",") Then new = ""
    Else
        If new.Length = 1 Then
            new = ""
        Else
            new = new.SubString2(0, new.Length-1)
        End If
    End If
    Return new
End Sub

Un po elaborato ma devi essere sicuro che il dato inserito sia numericamente corretto.
Ci sono diversi modi anche meno elaborati ma a volte (anche se di rado) la scritta nel Textfield
entrava in un loop continuo e il dato sfarfallava.
Comunque è elaborato perchè se è già presente una virgola e ti sposti all'interno della Textfield con
i tasti freccia non devi avere la possibilità d'inserire un''altra virgola.
Ho visto che funzionava e non ci sono ritornato su ad affinare la Sub ma se avete voglia, giocateci
un pò e postate.
Naturalmente se era questo che s'intendeva non vorrei aver capito male.

Salute ragazzi.
 
Private Calibro As TextField
Public Cal as Double ( mi serve Public ... )
Private b As String

Digito 7,82 nella cella Calibro.Text ( mi darebbe errore senza la modifica seguente ):

Cal = Calibro.Text
b = NumberFormat2(Cal,0,2,2,True)
b = b.Replace(",",".")
Calibro.Text = b

Leggo 7.82 nella cella Calibro.Text quando ritorno nel Form ( ok , va bene così )

Avrei preferito una soluzione tipo VB6, non esiste una libreria specifica ?

Ciao e grazie ancora
 
eppure ricordo di una libreria per il controllo delle textbox, campi numerici, date , ecc. per b4j
 
Grazie Micro, proverò appena possibile
( Però, per me è un po' complicato ... )

Ma un bel :

Private Sub Calibro_KeyPress(KeyAscii As Integer)
If KeyAscii = 46 Then KeyAscii = 44
End Sub

come in VB6, non esiste proprio ?
 
Chiedo scusa, anche questa volta ho rischiato di annegare in un bicchier d'acqua ...
La soluzione è molto più semplice:
Dopo aver dichiarato : Private Calibro as TextField ( e così anche per le rimanenti celle, almeno una ventina ... )

Basta questa istruzione : Calibro.Text = Calibro.Text.Replace(",",".")

Se nella cella digito erroneamente 7,82 ottengo però 7.82 che dopo non causa errore quando trova :

Cal = Calibro.Text ( non c'è conflitto, perché Calibro.Text vale 7.82 , in accordo con Double )

( Cal è dichiarato come : Public Cal as Double )

Buona notte !
 
Ripeto Gottrik
di soluzioni ce ne sono tante, se ho complicato il codice è per avere un maggior controllo
su quello che inserisco e quell'evento lo puoi impostare su tutte le textfield che devono
contenere numeri decimali.
Cerca di dimenticare pian piano VB6 :)
 
Grazie "micro" , vedrò di seguire i tuoi consigli.
Per ora, la soluzione propostami da Gianni risolve il mio problema.
Saluti
 
Back
Top