Newsgroup: it.comp.appl.access
Titolo: Estrarre parte decimale di un numero...

Salve,
Esiste in Access/VB una funzione nativa (senza l'utilizzo di MID(), Instr() 
...) che permetta l'estrazione della parte decimale da un numero?
ex:     Numero =  1.999,088
Fct(Numero) = 088
Ciao a tutti

"Massimiliano Bertoglio" <maxN...@NOSPAM.it> ha scritto nel messaggio 
news:495dce6f$0$840$4faf...@reader5.news.tin.it...

Potresti usare Int...nel senso che se sottrai al numero la parte intera ti 
resta quella decimale:
MiaVariabileDoubleOQuelloCheVuoi = 5.15 - Int(5.15)
dove 5.15 è il numero con decimali
risultato = 0,15
Ciao, Carlo 

 risultato = 0,15
Ma come ho fatto a non pensarci: semplice ed efficace!
Grazie Carlo  ;-)

 Grazie Carlo  ;-)
Prego.
A volte la soluzione è molto più vicina di quanto pensiamo!
Urca...nel nuovo anno sono diventato filosofo!
Ciao, Carlo 

 
attenzione ai numeri negativi però... in excel il comportamento è diverso e 
mi aspetto che sia lo stesso in access:
3.14    0.14
-3.14   0.86
-- 
/-\ /\/\ /\/\ /-\ /\/\ /\/\ /-\ T /-\

> risultato = 0,15
Puoi anche fare cosi:
mid("5.15",instr("5.15", ".")-1)
e non corri rischi.
P.S.: -1 se non ti serve ilo separatore decimale.
-- 
Ciao
Geppo

 /-\ /\/\ /\/\ /-\ /\/\ /\/\ /-\ T /-\
Fai attenzione che il problema non è di Excel ma dovuto all'uso della
funzione INT che a mio avviso non è appropriato.
Infatti INT sui negativi arrotonda a 4(nel tuo esempio), ma bastava
che Carlo usasse FIX per escludere il problema alla fonte.
Oltretutto c'è da valutare che i decimali non hanno segno(prerogativa
della parte intera) quindi per essere pignoli:
Decimali=ABS(Numero - Fix(Numero))
Ciao
@Alex

 Ciao "Massimiliano Bertoglio" <maxNOS...@NOSPAM.it> ha scritto nel messaggionews:495dd7eb$0$1108$4faf...@reader4.news.tin.it...

No Geppo, faccio finta di non averla vista... e mi evito anche i
commenti...!
@Alex

"Massimiliano Bertoglio" <maxN...@NOSPAM.it> wrote in message 
news:495dce6f$0$840$4faf...@reader5.news.tin.it...

========================================
Via VBA - Decimal Part
Public Function DP(Num As Double) As Long
If InStr(1, Num, ".") Then
    DP = Sgn(Num) * Mid(Num, InStr(1, Num, ".") + 1)
ElseIf InStr(Num, ",") Then
    DP = Sgn(Num) * Mid(Num, InStr(1, Num, ",") + 1)
Else
    Beep
End If
End Function
========================================
Via VBA - Integer Part
Public Function IP(Num As Double) As Long
If InStr(1, Num, ".") Then
    IP = Sgn(Num) * Mid(Num, 1, InStr(1, Num, ".") - 1)
ElseIf InStr(Num, ",") Then
    IP = Sgn(Num) * Mid(Num, 1, InStr(1, Num, ",") - 1)
Else
    Beep
End If
End Function
========================================
Le due parti sono rese col segno.
I separatori decimali previsti sono il punto e la virgola.
Bruno 

 Bruno
Bruno che senso ha dire che la parte decimale deve avere il segno...?
A parte l'usare le funzioni per i numeri e non per le stringhe, con le
quali si evita di dover gestire "," o "." come separatore di
sistema... ma se io voglio la parte decimale mi aspetto solo quella
dopo la virgola... e non ha segno...!
Cosa mi perdo...? (non sarà per la precisione... basterebbe convertire
in Decimal)
Boh sembra tutto tanto strano...
@Alex

 /-\ /\/\ /\/\ /-\ /\/\ /\/\ /-\ T /-\
Fai attenzione che il problema non è di Excel ma dovuto all'uso della
funzione INT che a mio avviso non è appropriato.
-----------------
Quoto. Il risultato con Int non sarebbe quello che Bertoglio si aspetta nel 
caso di numeri negativi.
Per saperlo aspettiamo un suo commento.
---------------------------
Infatti INT sui negativi arrotonda a 4(nel tuo esempio), ma bastava
che Carlo usasse FIX per escludere il problema alla fonte.
Oltretutto c'è da valutare che i decimali non hanno segno(prerogativa
della parte intera) quindi per essere pignoli:
----------------------------
Questa dei decimali che non hanno segno andrebbe meglio spiegata....
Nel contesto di cui parliamo e per le finalità di Bertoglio probabilmente è 
così ma
-0,15 non solo esiste ma è molto diverso da 0,15
D'altra parte -5.15-fix(-5.15)
da come risultato = -0,15
----------------------------
Decimali=ABS(Numero - Fix(Numero))
-------------------------------
Se non serve il segno, direi che questa è la soluzione ottimale...per sapere 
il segno potrebbe anche usare Sgn.
Ciao
@Alex
Ciao, Carlo 

 wrote in message 
news:d6d1fcdd-61aa-4450...@o4g2000pra.googlegroups.com...


 Geppo
No Geppo, faccio finta di non averla vista... e mi evito anche i
commenti...!
Effettivamente, poi, rileggendo il primo post puo' sembrare una presa in 
giro, ma giuro che non l'ho fatto di proposito ed inoltre c'è anche un 
errore.
Chiedo Venia.
P.S.: grazie @Alex per aver evitato i commenti.
@Alex
-- 
Ciao
Geppo 


Beh, in effetti nel mio caso il numero da cui estrarre la parte decimale è 
sempre > 0.
Quindi le due soluzioni sono equivalenti...
Ciao  ;-)

 
su questo non discuto, ho voluto segnalare la diversa gestione dei numeri 
negativi della funzione INT


 wrote in message 
news:d6d1fcdd-61aa-4450...@o4g2000pra.googlegroups.com...
Bruno che senso ha dire che la parte decimale deve avere il segno...?
A parte l'usare le funzioni per i numeri e non per le stringhe, con le
quali si evita di dover gestire "," o "." come separatore di
sistema... ma se io voglio la parte decimale mi aspetto solo quella
dopo la virgola... e non ha segno...!
Cosa mi perdo...? (non sarà per la precisione... basterebbe convertire
in Decimal)
Boh sembra tutto tanto strano...
@Alex
====================================
Ho fatto un po' di confusione: avevo tre funzioni e ne ho
inviate due impasticciate.
Vediamo di recuperare.
Numero    -1991.088
--------------------
1 - Parte intera
===========================
Public Function IP(Num As Double) As Long
If InStr(1, Num, ".") Then
    IP = Mid(Num, 1, InStr(1, Num, ".") - 1)
ElseIf InStr(Num, ",") Then
    IP = Mid(Num, 1, InStr(1, Num, ",") - 1)
Else
    Beep
End If
End Function
                            Restituisce     -1991
=============================
2 - Parte decimale
=============================
Public Function DP(Num As Double) As Double
DP = Num - IP(Num)
End Function
                           Resttituisce   -0.088
===============================
E i conti tornano:
    IP   +  DP   = Numero
-1991 - 0.088 = -1991.088
3 - Parte decimale restituita come parte intera
================================
Public Function DP2Int(Num As Double) As Long
If InStr(1, Num, ".") Then
    DP2Int = Mid(Num, InStr(1, Num, ".") + 1)
ElseIf InStr(CStr(Num), ",") Then
    DP2Int = Mid(Num, InStr(1, Num, ",") + 1)
Else
    Beep
End If
End Function
                       restituisce 88
==================================
Così dovrenno essere d'accordo tutti, a parte eventualmente
la terminologia.
Ciao
Bruno

 Bruno
Oddio, ma anche tu usi "mid" e "instr" nooooooooo.........se ti prende @Alex 
zsei finito :-) :-)
-- 
Ciao
Geppo 

 @Alex zsei finito :-) :-)
1 -
Public Function IP(Num)
    Num = CDec(Num)
    IP = Sgn(Num) * Int(Abs(Num))
End Function
2 -
Public Function DP(Num)
    Num = CDec(Num)
    DP = Num - Sgn(Num) * Int(Abs(Num))
End Function
3 -
Public Function DP2Int(Num)
    Dim D, i As Integer
    Num = CDec(Num)
    D = Abs((Num - Sgn(Num) * Int(Abs(Num))))
    Do Until Int(D) = D
        i = i + 1
        D = D * 10 ^ i
    Loop
    DP2Int = D
End Function
Cosě va meglio?
Bruno 

 Bruno
-- 
Ciao
Geppo 

 Ciao, Carlo
Ciao Carlo
@Alex

 Geppo
Spero tu abbia capito il senso tecnico oltre che fare le facciette...
@Alex

 Bruno
Ottimo direi..!
@Alex

 ha scritto nel messaggio 
news:ada170a0-974e-4968...@r10g2000prf.googlegroups.com...
---cut---
Spero tu abbia capito il senso tecnico oltre che fare le facciette...
Non solo m'impegno a capire, ma faccio tesoro dei vostri interventi.
Grazie.
@Alex
-- 
Ciao
Geppo