Discussione:
[?] [VB.Net] Decimali, formattazione e conversione double to string
(troppo vecchio per rispondere)
Andreavax
2005-08-31 22:55:28 UTC
Permalink
Buongiorno a tutti,
vi ringrazio ancora per l'aiuto che mi avete da poco fornito, ma ho
ancora un piccolo problema che, data la mia scarsa conoscenza, non
riesco a risolvere :-(

N.B.
per avere maggiori informazioni fate riferimento a "Separatore decimali
e impostazioni internazionali" (31/08/2005 14.13)

Grazie a voi ho risolto il problema del formato affinché resti
indipendentemente dalle impostazioni del sistema operativo utilizzando
solo funzioni delocalizzate.

Come posso formattare un numero (es. 0.00000) *durante* la conversione
da double a string senza cadere in funzioni localizzate? Il tipo di dato
è corretto per questa operazione (effettuo dei calcoli che necessitano
la precisione al 6° decimale)?

Vi ringrazio anticipatamente, Andrea
Albe V°
2005-09-01 07:26:52 UTC
Permalink
Come posso formattare un numero (es. 0.00000) *durante* la conversione da
double a string senza cadere in funzioni localizzate? Il tipo di dato è
corretto per questa operazione (effettuo dei calcoli che necessitano la
precisione al 6° decimale)?
Premetto che parlo per VB6, non .Net, ma immagino ci siano concetti
riproducibili.

Esistono solo due funzioni delocalizzate di conversione da Double a
String, e sono Str e Format$ (con precauzioni).

Str, però, non garantisce che il numero abbia tutti gli zeri in coda.
Cioè, se il double vale 5, la stringa sarà "5", e non "5.000000" come
tu vuoi.

Allora si deve usare Format$. Ma Format$ inserisce il separatore
locale, non il punto (che è il separatore 'delocalizzato').
La cosa migliore è ricavare il separatore locale, e fare un replace
subito dopo il Format$:
PUBLIC FUNCTION DOUBLE2STRING_6DEC(BYVAL VALORE AS DOUBLE) AS STRING
DIM SEP_LOC AS STRING
SEP_LOC=REPLACE$(CSTR(1.1),"1","")
DOUBLE2STRING_6DEC=FORMAT$(VALORE,"0.000000")
DOUBLE2STRING_6DEC=REPLACE$(DOUBLE2STRING_6DEC,SEP_LOC,".")
END FUNCTION

E' una di quelle funzioni personalizzate di cui ti accennavo ("Spesso
occorrerà scrivere parser proprietari."). Anche se non è un parser.

Ciao

Alberto
--
Autore di
"Petting for Dummies"
Andreavax
2005-09-01 08:11:48 UTC
Permalink
Non ho parole :-) GRAZIE per la cortesia!!!
Post by Albe V°
Post by Andreavax
Come posso formattare un numero (es. 0.00000) *durante* la conversione
da double a string senza cadere in funzioni localizzate? Il tipo di
dato è corretto per questa operazione (effettuo dei calcoli che
necessitano la precisione al 6° decimale)?
Premetto che parlo per VB6, non .Net, ma immagino ci siano concetti
riproducibili.
Esistono solo due funzioni delocalizzate di conversione da Double a
String, e sono Str e Format$ (con precauzioni).
Str, però, non garantisce che il numero abbia tutti gli zeri in coda.
Cioè, se il double vale 5, la stringa sarà "5", e non "5.000000" come tu
vuoi.
Il problema non è avere gli zeri in coda quanto limitare i decimali dei
risultati. Uno dei risultati possibili è: 0.043080000000000001!!!
Post by Albe V°
Allora si deve usare Format$. Ma Format$ inserisce il separatore locale,
non il punto (che è il separatore 'delocalizzato').
La cosa migliore è ricavare il separatore locale, e fare un replace
PUBLIC FUNCTION DOUBLE2STRING_6DEC(BYVAL VALORE AS DOUBLE) AS STRING
DIM SEP_LOC AS STRING
SEP_LOC=REPLACE$(CSTR(1.1),"1","")
DOUBLE2STRING_6DEC=FORMAT$(VALORE,"0.000000")
DOUBLE2STRING_6DEC=REPLACE$(DOUBLE2STRING_6DEC,SEP_LOC,".")
END FUNCTION
E' una di quelle funzioni personalizzate di cui ti accennavo ("Spesso
occorrerà scrivere parser proprietari."). Anche se non è un parser.
Ciao
Alberto
Una domanda, ma dove infilo questo tipo di funzioni, all'interno di una
classe? In VB.Net il codice di un form è in un solo file e non ho ancora
capito bene come è organizzato :-(

Ciao, Andrea
Albe V°
2005-09-01 08:24:45 UTC
Permalink
Post by Andreavax
Il problema non è avere gli zeri in coda quanto limitare i decimali dei
risultati. Uno dei risultati possibili è: 0.043080000000000001!!!
Dipende se vuoi limitare i decimali nel 'valore' o nella sua
'rappresentazione'.

Se vuoi limitarli nel valore, devi eseguire un arrotondamento. Il
problema, piuttosto, è che sei decimali non stanno in nessun tipo a
virgola fissa, se non nel Decimal (che esiste solo come sottotipo del
Variant, in VB6). Forse in .Net esiste un tipo Decimal (ossia un
virgola fissa a millemila posizioni decimali), sarebbe cosa buona.
Supponendo che i decimali che ti servono siano solo due o tre, in VB6
occorrerebbe in primis convertire il double in Currency, e poi farne un
Round o un Trunc (adesso nel mio cervello si stanno mescolando funzioni
VB6 e Sql, spero di non dire cavolate). Comunque sia, effettuare il
Round di un Double è assurdo, visto che è un virgola mobile.
Se vuoi limitarli nella rappresentazione (stringa), allora va bene
quanto dicevamo.
Post by Andreavax
Una domanda, ma dove infilo questo tipo di funzioni, all'interno di una
classe? In VB.Net il codice di un form è in un solo file e non ho ancora
capito bene come è organizzato :-(
Lo puoi mettere dove vuoi, ma come dicevo, è codice VB6, non .Net.

Ciao

Alberto
--
Ma noi no
Andreavax
2005-09-01 08:49:05 UTC
Permalink
Post by Albe V°
Dipende se vuoi limitare i decimali nel 'valore' o nella sua
'rappresentazione'.
Se vuoi limitarli nel valore, devi eseguire un arrotondamento. Il
problema, piuttosto, è che sei decimali non stanno in nessun tipo a
virgola fissa, se non nel Decimal (che esiste solo come sottotipo del
Variant, in VB6). Forse in .Net esiste un tipo Decimal (ossia un virgola
fissa a millemila posizioni decimali), sarebbe cosa buona. Supponendo
che i decimali che ti servono siano solo due o tre, in VB6 occorrerebbe
in primis convertire il double in Currency, e poi farne un Round o un
Trunc (adesso nel mio cervello si stanno mescolando funzioni VB6 e Sql,
spero di non dire cavolate). Comunque sia, effettuare il Round di un
Double è assurdo, visto che è un virgola mobile.
Se vuoi limitarli nella rappresentazione (stringa), allora va bene
quanto dicevamo.
Lo puoi mettere dove vuoi, ma come dicevo, è codice VB6, non .Net.
Ciao
Alberto
Avrei necessità di limitarne il valore ed eseguire l'arrotondamento.

Presumo quindi che debba utilizzare il tipo Decimal, trovare il modo di
eseguire l'arrotondamento e poi *scrivere* la funzione personalizzata
per evitare la localizzazione.

Ma non potevano inventare qualcosa che evitasse sta menata:
Vuoi che la tua applicazione sia localizzata. SI/NO

:-!

Grazie e ciao, Andrea
Albe V°
2005-09-01 09:19:20 UTC
Permalink
Post by Andreavax
Avrei necessità di limitarne il valore ed eseguire l'arrotondamento.
Presumo quindi che debba utilizzare il tipo Decimal, trovare il modo di
eseguire l'arrotondamento e poi *scrivere* la funzione personalizzata per
evitare la localizzazione.
Giusto.
Post by Andreavax
Vuoi che la tua applicazione sia localizzata. SI/NO
Più o meno è così.
L'ambiente ti mette a disposizione funzioni localizzate e funzioni
delocalizzate. Tu usi quelle che vuoi.
Il 'buco' è nella documentazione, che non esprime chiaramente questa
dicotomia, ma occorre studiarsele tutte e effettuare personalmente il
triage.
La documentazione di Sql-Server, ad esempio, è estremamente più chiara,
perchè a fianco di tutte le funzioni di conversione indica chiaramente
se il funzionamento è deterministico o meno. E le funzioni localizzate
non sono mai deterministiche.

Considera che all'interno di un'applicazione tu potresti avere
necessità di agire in modalità localizzata in qualche caso, e
delocalizzata in altri. Ad esempio, quando si riceve e si deve
interpretare un file di testo scritto secondo un determinato formato
fisso, è tassativo operare con funzioni delocalizzate. Quando si
realizza una stringa Sql da dare ad un dbms, è tassativo operare in
modalità delocalizzata. Ma se si vuole lasciare all'utente la libertà
di digitare gli importi col separatore locale (ad esempio, in Italia,
se gli si vuole consentire di usare la virgola), occorre agire in
maniera localizzata. Poi, una volta che numeri e date sono memorizzati
in variabili numeriche e variabili data, possono essere passati da un
modulo ad un altro senza alcuna preoccupazione, anche se i moduli
operano in modalità diverse riguardo la localizzazione.

Ciao

Alberto
--
Ma noi no
Cteniza
2005-09-01 08:22:27 UTC
Permalink
Post by Albe V°
Come posso formattare un numero (es. 0.00000) *durante* la conversione da
double a string senza cadere in funzioni localizzate? Il tipo di dato è
corretto per questa operazione (effettuo dei calcoli che necessitano la
precisione al 6° decimale)?
Premetto che parlo per VB6, non .Net, ma immagino ci siano concetti
riproducibili.
Esistono solo due funzioni delocalizzate di conversione da Double a
String, e sono Str e Format$ (con precauzioni).
La peggior cosa che si può fare su vb.net è continuare ad usare le vecchie
funzioni indicate dall'amico Albe :))

La conversione di qualsiasi data type in stringa si fa utilizzando il
metodo ToString che prende come argomento molte impostazioni della
funzione format di vb6
--
questo articolo e` stato inviato via web dal servizio gratuito
http://www.newsland.it/news segnala gli abusi ad ***@newsland.it
Albe V°
2005-09-01 08:26:30 UTC
Permalink
Post by Cteniza
La peggior cosa che si può fare su vb.net è continuare ad usare le vecchie
funzioni indicate dall'amico Albe :))
Si, lo immagino. Era accademia concettuale. Sintassi e semantica vanno
adeguate all'ambiente.
Post by Cteniza
La conversione di qualsiasi data type in stringa si fa utilizzando il
metodo ToString che prende come argomento molte impostazioni della
funzione format di vb6
Quindi, come vedi, i concetti restano...

Ciao

Alberto
--
Ma noi no
Loading...