2010-01-21 11 views

risposta

20
string.Format("{0:0.#####}", 0.0030) 

o

var money=1.3000m; 
money.ToString("0.#####"); 

Per riferimento futuro vi consiglio il .NET Format String Quick Reference da John Sheehan.

+2

Sì, ma cosa succede se si dispone di 6 posizioni decimali o 7? Finisci con una grande e brutta faccina speculativa di # personaggi. –

+2

Questo arrotonderà i numeri al centesimo più vicino. Questo potrebbe essere o non essere ciò che l'OP voleva ... –

+3

@ andrew-m Sì, il # è un segnaposto numerico. Nella maggior parte dei casi sai qual è la precisione desiderata. Se non lo fai e vuoi essere assolutamente sicuro di poter utilizzare la precisione completa del tipo di dati che stai utilizzando al momento. 'decimale' può contenere 28-29 cifre significative. Soluzione di Hacky: '.ToString (" 0. ". PadRight (29, '#'))' –

3

Hmm, questo è un problema di formattazione dello schermo (gli zeri vengono aggiunti quando si converte il decimale in una stringa).

Hai bisogno di vedere dove nel codice stai vedendo gli zeri finali. È dopo una chiamata a .ToString()? Prova a giocare con le diverse stringhe di formattazione:

.ToString("#"); 
.ToString("0.00"); 
.ToString("#.##"); 

E così via. Il modo migliore per farlo è solo sperimentare i diversi valori possibili.

2
decimal m = 0.030000m; 
Console.Write(m.ToString("0.##########")); 

Basta fare in modo di avere abbastanza # s per il numero di cifre decimali che si desidera visualizzare

9
decimal value = 0.0030m; 
value.ToString(“G29″); 

Modifica: Il formattatore G funziona, l'unico problema è che si passa alla notazione scientifica se ci sono troppe cifre significative nel decimale originale. Non così ideale.

Vedere il "The General (" G ") di formato" documentazione qui: http://msdn.microsoft.com/en-us/library/dwhawy9k.aspx#GFormatString

Sono sul pranzo, così ho fatto un piccolo test:

decimal d1 = 0.000100m; 
decimal d2 = 0.001000000000000000000000m; 
decimal d3 = 0.000000000000001000000000m; 

Console.WriteLine(Environment.NewLine + "input decimal: 0.000100m"); 
Console.WriteLine("G   " + d1.ToString("G")); 
Console.WriteLine("G29  " + d1.ToString("G29")); 
Console.WriteLine("0.####### " + d1.ToString("0.#######")); 

Console.WriteLine(Environment.NewLine + "input decimal: 0.001000000000000000000000m"); 
Console.WriteLine("G   " + d2.ToString("G")); 
Console.WriteLine("G29  " + d2.ToString("G29")); 
Console.WriteLine("0.####### " + d2.ToString("0.#######")); 

Console.WriteLine(Environment.NewLine + "input decimal: 0.000000000000001000000000m"); 
Console.WriteLine("G   " + d3.ToString("G")); 
Console.WriteLine("G29  " + d3.ToString("G29")); 
Console.WriteLine("0.####### " + d3.ToString("0.#######")); 

uscita:

input decimal: 0.000100m 
G   0.000100 
G29  0.0001 
0.####### 0.0001 

input decimal: 0.001000000000000000000000m 
G   0.001000000000000000000000 
G29  0.001 
0.####### 0.001 

input decimal: 0.000000000000001000000000m 
G   0.000000000000001000000000 
G29  1E-15 
0.####### 0 
0

Io uso quanto segue. Assicura che qualsiasi decimale (per il quale la precisione massima è di 29 cifre decimali) mostrerà tutte le cifre disponibili di precisione senza zeri finali, e senza che il codice abbia bisogno di avere una lunga stringa brutta di segni di hash.

if (value is Decimal) 
    value = ((Decimal)value).ToString("0.".PadRight(29, '#'), culture); 
25

È inoltre possibile modificare il decimale stessa in modo che qualsiasi ToString() vi darà quello che vuoi (per ulteriori dettagli la mia risposta here):

public static decimal Normalize(decimal value) 
{ 
    return value/1.000000000000000000000000000000000m; 
} 
+8

Questa risposta è di proprietà perché a differenza di ogni altra risposta su questa domanda (e persino dell'intero soggetto) è in realtà WORKS e fa quello che l'OP sta chiedendo. È vergognoso vedere tutti questi utenti di alto livello che si affrettano a rispondere senza leggere/comprendere la domanda e ottenere tutti gli upvotes da qualcosa che non funziona nemmeno. – Coxy

-1
public static string GentlyRemoveEndZeros(string input) 
     { 
      // if (input == null) return null; 
      // if (input == "") return ""; 
      if (input.Contains(".")) return input.TrimEnd('0').TrimEnd('.'); 
      return input; 
     } 
+1

Che dire di altre impostazioni locali che non utilizzano un '.'? –

+0

@MartinMulder allo stesso modo: if (input.Contains (",")) restituisce input.TrimEnd ('0'). TrimEnd (','); – VovaM

+1

@VovaN: Vero, ma la tua risposta non dovrebbe essere a prova di cultura incrociata? –

-2

Tronca zeri finali è molto facile, risolvi con un cast duplex:

decimal mydecimal = decimal.Parse("1,45000000"); //(I) 
    decimal truncate = (decimal)(double)mydecimal; //(II) 

(I) -> Valore decimale di analisi da qualsiasi fonte di stringa.

(II) -> Primo: Cast per raddoppiare rimuovere gli zeri finali.Secondo: altro cast al decimale perché non esiste una conversione implicita da decimale a doppio e viceversa)

+0

Si presuppone che tutti i valori che si adattano a un decimale rientrino in un doppio. Ciò potrebbe causare una OverflowExeception. Inoltre potresti perdere la precisione. –

+0

Ti presumi male e il tuo commento non aggiunge nulla a questa discussione. Ovviamente tutto qui presuppone che il valore possa adattarsi ai valori double e decimal. QUI, l'overflow non è il problema. Saluti !! – amedriveroperez

+0

Chi lo assume? Ho cercato "double" ... nessuno lo suppone. –

Problemi correlati