277 messaggi dal 03 ottobre 2006
Non trovo soluzione a questo problema:
Ho una variabile decimal a cui devo assegnare l'input di un textbox riempito dall'utente.
Con quale istruzione posso forzare la mia variabile decimal ad avere 2 decimali ?
Non sono interessato a convertire la varibile (come trovo ovunque) con tostring() perchè la variabile deve restare decimal e l'istruzione Math.Round(valoredecimale,2) è perfetta ma non funziona se l'utente digita un valore intero perchè se digita 120 io vorrei 120.00 e non 120 e basta.
Grazie
11.886 messaggi dal 09 febbraio 2002
Contributi
Ciao,


Non sono interessato a convertire la varibile (come trovo ovunque) con tostring()

Lo trovi ovunque perché, in generale, il numero di decimali da rappresentare è importante solo quando presenti il numero all'utente nell'interfaccia grafica. E credo anch'io che questa sia la soluzione per te.

numeroDecimal.ToString("0.00");


Detto questo, il tipo decimal è un tipo di dato che serve a rappresentare precisamente un ampio range di numeri e perciò è indicato in ambito di calcoli finanziari. Può rappresentare sia numeri molto grandi che numeri molto piccoli per massimo 28 o 29 cifre che puoi scegliere tu come distribuire alla sinistra o alla destra del separatore dei decimali.

Ad esempio, creando un decimal in questo modo decido che deve avere due cifre decimali.
decimal numero = 0.00m;


Se sommo questo numero ad un'altro che ha 0 cifre decimali, il framework cercherà di non perdere la scala del primo numero e quindi produrrà un altro decimal con due cifre decimali.

decimal numero = 0.00m;
decimal altroNumero = 0m;

//Il decimal somma viene creato con scala 2 (cioè due cifre decimali)
decimal somma = numero + altroNumero;


Quindi un'altra soluzione al tuo problema potrebbe essere questa:
decimal numero = 0.00m + decimal.Parse(valoreDigitatoDallUtente);


Comunque: perché hai bisogno che il decimal abbia scala 2?
Approfondisci qui: https://docs.microsoft.com/it-it/dotnet/api/system.decimal?view=netframework-4.7.2

ciao,
Moreno

Enjoy learning and just keep making
277 messaggi dal 03 ottobre 2006
Grazie Moreno, il cambio verso una stringa per presentare i dati in modo diverso è il suggerimento più frequente che si trova nel web ma io sto usando una classe ché struttura i dati per le fatture elettroniche e puoi trasformo quella classe in xml.
Questa classe ha tutti gli importi come decimal e se l'utente digita 120 io devo convertirlo in qualche modo in 120.00 altrimenti l'agenzia delle entrate scarta la fattura.
Certo posso cambiare nella classe il tipo di dato in string ma mi piace di più la tua idea di valorizzarle con 0.00m e poi tutte le operazioni che faro' dovrebbe mantenerle a due cifre decimali
11.886 messaggi dal 09 febbraio 2002
Contributi

sto usando una classe ché struttura i dati per le fatture elettroniche

Beh, diciamo che è responsabilità di chi produce l'XML fare in modo che venga scritto l'importo con due decimali, a prescindere da quale fosse la scala della variabile decimal.

Se vedi il sorgente del pacchetto FatturaElettronica, noti appunto che gli importi sono proprietà di tipo decimal, come questa:
https://github.com/FatturaElettronica/FatturaElettronica.NET/blob/master/FatturaElettronicaBody/DatiPagamento/DettaglioPagamento.cs#L51

E quindi tu gli puoi assegnare dei decimal con una scala qualsiasi (anche senza cifre decimali).
Poi però è responsabilità del componente che produce l'XML assicurarsi che l'importo venga scritto con almeno due decimali (perché se ne possono indicare anche di più). Ecco infatti la riga di codice che impone il formato "0.00###" (cioè almeno due cifre decimali, con ulteriori 3 opzionali) che dietro le quinte viene passato come argomento a un ToString().
https://github.com/FatturaElettronica/FatturaElettronica.Core/blob/master/BaseClassSerializable.cs#L29

In sintesi: devi intervenire nel punto in cui viene scritto l'XML. Se non puoi intervenire perché la classe che scrive l'XML è stata fatta da altri, segnala il problema.

ciao,
Moreno

Enjoy learning and just keep making
277 messaggi dal 03 ottobre 2006
Ho seguito il tuo consiglio iniziale dato che non uso quel progetto su GitHub perchè purtroppo l'ho scoperto tardi però avrei potuto in effetti dare un occhio a come era fatto.

Ho messo 0.00m + lamiavaribile nell'ultima istruzione di calcolo che assegna i valori a tutti i decimal della classe. In questo modo in effetti mette sempre due decimali anche se il numero è intero.
Poi uso XmlSerializer per convertire in Xml
Grazie
11.886 messaggi dal 09 febbraio 2002
Contributi

Ho messo 0.00m + lamiavaribile nell'ultima istruzione di calcolo che assegna i valori a tutti i decimal della classe. In questo modo in effetti mette sempre due decimali anche se il numero è intero.

Ok, funziona, ma tieni presente che la soluzione più corretta è quella che è stata implementata dal pacchetto FatturaElettronica con la classe BaseClassSerializable, che regola la serializzazione in XML.
https://github.com/FatturaElettronica/FatturaElettronica.Core/blob/master/BaseClassSerializable.cs#L335

Lo stesso problema di formattazione penso che l'avrai anche con le date, che devono seguire il formato yyyy-MM-dd.

ciao,
Moreno

Enjoy learning and just keep making

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.