Newsgroup: it.comp.lang.visual-basic
Titolo: funzione FORMAT con un orario

Ho di nuovo un problema con questa funzione. Mi sono accorto della presenza
di un bug!
Ho una funzione che mi porta le ore in centesimi. Richiamo questa funzione
passandogli l'argomento "ore"
Il problema è che se gli passo un orario intero (ossia senza minuti) quando
richiama
la funzione "OreCentesimi" ed arriva al passaggio "min = Right(ore, 2)"
invece di darmi zero mi da
un risultato.
In pratica la funzione funziona perfettamente tranne quando gli do un orario
intero.
Ho provato ad usare la funzione  FormatNumber(txtOre.Text, 2) in modo da
far diventare hh in hh,mm
ma risolve il caso quando le ore sono intere ma mi sballa quando immetto un
orario con la virgola!
Infatti immettendo per esempio 60,30 la funzione FormatNumber(txtOre.Text,
2) anzichè lasciare l'orario
così com'è me lo fa diventare cosi: 6.030,00
Come posso risolvere questo problema?
C'è un modo per dirgli se l'orario è intero allora lascialo cosi se invece
ci sono i minuti passa l'orario
come argomento alla funzione OreCentesimi?
Sono le 6.11 am meglio che vada a nanna!!
Sono cotto!!
Spero in un vostro aiuto!
----------------------------------------------
Private Sub cmdOk_Click()
Dim ora As Single
Dim oreVolo As Single
    ora = txtOre.Text
    Call OreCentesimi(ora)
    txtOreCentesimi.Text = ora
End sub
------------------------------------------
Public Function OreCentesimi(ore As Single)
Dim minuti As Double
Dim ora_centesimi As String
Dim min As Single
Dim ora As String
    ora = Left(ore, 2)
    min = Right(ore, 2)
    minuti = min * 100 / 60
'Aggiunge uno zero davanti minuti nel caso questi siano minori di 10
'perchè se per esempio metto 30,05 mi da un risultato di 30,8 anzichè 30,08
        If minuti < 10 Then
            minuti = CInt(minuti * 10)
            ore = ora & "," & 0 & Left(minuti, 1)
        Else
            ore = ora & "," & Left(minuti, 2)
        End If
End Function

 di un bug!
<Megacut>
Non faccio commenti ne' sulla tua domanda perche' non ho capito niente, 
ne' sul tuo codice perche' mi e' venuta una stretta allo stomaco. ;-)
Ti pongo pero' una domanda:
perche' non utilizzi la funzione format e/o la funzione timeserial per 
ottenere cio' che ti serve?
ciao
	maxx
-- 
NOSPAM: Rimuovere i trattini dallo username!
Cut hyphens from my username!

 ha scritto nel messaggio
news:ncLOb.48054$Jw2....@tornado.fastwebnet.it...


 Avevo scritto format(hh,2)
e dove hai trovato questa sintassi della funzione format?
--
Salutoni
Sergio
per rispondere... togli il group dall'indirizzo

 ha scritto nel messaggio
news:bugq1s$h2q5h$1...@ID-173193.news.uni-berlin.de...


 Sintassi della funzione FormatNumber
ah, ecco, c'era qualcosa che non mi tornava.
è la sintassi di FormatNumber, non quella di Format.
prova a cercare format nell'help in linea, e guarda che cosa c'è scritto.


 nell'etichetta delle ore viene immesso un orario intero cioè senza minuti.
Io ho fatto così:
1) mi assicuro che ciò che è scritto nel textbox sia un'orario utilizzando
la funzione IsDate():
    If IsDate(txtOra.Text) Then
2) dall'orario ricavo l'Ora con la funzione Hour():
    dblOra = CDbl(Hour(txtOra.Text))
3) dall'orario ricavo i minuti con la funzione Minute():
    dblMinuti = CDbl(Minute(txtOra.Text))
4) trasformo i minuti in frazione di ora:
    dblMinuti = dblMinuti / 60
5) l'orario espresso in frazione risulta quindi:
    dblOrario = dblOra + dblMinuti
Ho espanso il mio codice per fartelo capire, in realtà io ho fatto:
    dblOrario = CDbl(Hour(txtOra.Text)) + CDbl(Minute(txtOra.Text)) / 60
Ciao!
Esteban

Ciao,
io ho fatto cosě per risolvere (prova e fammi sapere):
Function Cents(Valore As Double) As String
    Dim Intero As Integer
    Dim Decimale As Integer
    Dim Decim2 As Double
    Intero = Int(Valore)
    Decimale = (Valore - Intero) * 100
    Decimale = (Decimale * 100) / 60
    Decim2 = Decimale / 100
    Cents = Format(Intero + Decim2,"00.00")
End Function
Mirco.
:-P
------------------------------------------------------------
KATACLiSM
http://xoomer.virgilio.it/kataclism

 internet stasera
Un consiglio: ho l'impressione che tu stia utilizzando solo dei libri 
per scrivere il codice e studiare e' positivo. Pero' serve anche un 
manuale di riferimento in cui vengono illustrate in dettaglio tutte le 
funzioni disponibili. Un ottimo manuale e' la guida in linea di VB o 
MSDN, che nonostante molte mancanze e imprecisioni consente di capire 
cosa effettivamente fanno le istruzioni di VB.
Ti confermo che la funzione TimeSerial e' viva e vegeta.
I suggerimenti che ti sono gia' stati dati sono piu' che validi e quindi 
non aggiungo altro se non che il tono della mia risposta era scherzoso e 
voleva essere un ironico stimolo a migliorare, non un insulto a chi 
studia e sta imparando da solo.
buon lavoro


     dblOrario = dblOra + dblMinuti
[cut]

 ha scritto nel messaggio
news:bugrbs$hpk1s$1...@ID-173193.news.uni-berlin.de...


Grazie a Mirco e a Ganzos ho risolto anzi per dirla tutta mi hanno risolto
il problema...
Metto qui la soluzione e per la gioia di emmexx il codice è molto più snello
=)
Lo so che devo mettere i controlli per impedire all'utente di scrivere
lettere o segni diversi da virgola e punto.
Una cosa per volta...=))) Purtroppo non sono come voi!!!!!!!
Mi è stato consigliato da Ganzos di usare il Keypress ma prima me lo devo
studiare ;)
Grazie di nuovo a tutti
------------------------------------------------------
Private Sub cmdOkDatiVolo_Click()
Dim Ora As String
Ora = txtOre.Text
If txtOreVolo.Text <> -1 Then
    Call OreCentesimi(Ora)
    txtOreCentesimi.Text = Ora
    Call CalcolaMaggiorazioni(CSng(Ora))
Else
   MsgBox "Inserisci le ore di volo mensili", vbExclamation, "Errore"
   txtOre.text.SetFocus
   Exit Sub
End If
------------------------------------------------------
Public Function OreCentesimi(Ora As String) As String
Dim h As Integer
Dim m As Single
Dim k As Single
Ora = Replace(Ora, ".", ",")
Ora = CSng(Ora)
h = Int(Ora)
m = Ora - h
Ora = h + m * 100 / 60
Ora = FormatNumber(Ora, 2)
End Function

 Ora = CSng(Ora)
Ma Ora non è un String???
Ciao!
Esteban


------------------------------------------------------
Public Function OreCentesimi(Ora As String) As String
Dim h As Integer
Dim m As Single
Dim k As Single
Ora = Replace(Ora, ".", ",")
Ora = CSng(Ora)


 ore in centesimi.
Il problema č che tu dichiari la variabile come String e poi la usi come
Single. Certo, Visual Basic te lo lascia anche fare, ma non č proprio il
miglior modo di operare.
Potresti, all'interno della funzione, dichiarare una variabile Single a cui
assegnare il valore della conversione in Single della variabile String,
oppure, se ti piace poter cambiare il tipo di dati di una variabile quando
piů ti piace, definisci la variabile come Variant.
Ciao!
Esteban

 basta farlo dalla funzione ed evito di scrivere righe di codice doppio!
Basta, mi arrendo!
Esteban

 ha scritto nel messaggio
news:bupj6t$l0egn$1...@ID-217323.news.uni-berlin.de...


 chiamata alla funzione
Capisco il tuo problema.
Io non ti ho detto di convertire in Single un valore String prima di
passarlo alla tua funzione, ho solo detto che se dichiari una variabile come
String, poi convertire la variabile (non il valore) in Single non č il modo
corretto di fare le cose. Quello che dovresti fare č semplicemente:
Public Function OreCentesimi(ByVal Ora As String) As String
    'Definisco una variabile single in cui metto la conversione
    'in single del valore string passato alla funzione
    Dim sngOra As Single
    Ora = Replace(Ora, ".", ",")
    sngOra = CSng(Ora)
Ma poi, ora vedo: la funzione cosa ritorna? Dovrebbe ritornare il valore
calcolato, giusto?
Allora fai cosě:
    sngOra = Int(sngOra) + (sngOra - h) * 100 / 60
    OreCentesimi = CStr(FormatNumber(sngOra, 2))
End Function
E la chiamata alla funzione la fai cosě:
    txtOreCentesimi.Text = OreCentesimi(txtOre.Text)
Spero ora di essere stato chiaro ed essere riuscito a farti capire l'errore.
In piů ti ho mostrato come evitare di dichiarare variabili inutili (h, m, k
(a che serviva?) e anche Ora definita nella Sub cmdOkDatiVolo_Click()).
Ciao!
Esteban

E' bello sentirsi stupidi e poi il giorno dopo sentirsi poco meno stupidi
rispetto a ieri
Esteban hai ragione la tua frase nn l'avevo capita ma č anche vero che
quando uno ci si
mette le cose le fa capire bene. Stessa cosa vale per chi tenta di capirle.
Hai ragione mea culpa
Colpa dell'occhio clinico che io non ho!
Grazie spero un giorno di renderti il piacere
[cut]
