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
 

giannimaione

Well-Known Member
Licensed User
Longtime User
non ricordo se esiste una libreria di qualche utente, ma puoi tentare in questo modo
B4X:
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)
 

Gottrik

Member
Licensed User
Longtime User
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).
 

Gottrik

Member
Licensed User
Longtime User
Gianni
Forse, problema risolto.
Un po' laborioso, grazie per il tuo aiuto.
Ciao
 

giannimaione

Well-Known Member
Licensed User
Longtime User
se ti va di pubblicare la soluzione, potrebbere ritornare utile ad altri.
 

micro

Well-Known Member
Licensed User
Longtime User
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
B4X:
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.
 

Gottrik

Member
Licensed User
Longtime User
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
 

giannimaione

Well-Known Member
Licensed User
Longtime User
eppure ricordo di una libreria per il controllo delle textbox, campi numerici, date , ecc. per b4j
 

Gottrik

Member
Licensed User
Longtime User
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 ?
 

Gottrik

Member
Licensed User
Longtime User
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 !
 

micro

Well-Known Member
Licensed User
Longtime User
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 :)
 

Gottrik

Member
Licensed User
Longtime User
Grazie "micro" , vedrò di seguire i tuoi consigli.
Per ora, la soluzione propostami da Gianni risolve il mio problema.
Saluti
 
Top