ho un valore decimale che ha un numero variabile di cifre dopo la .
, ad esempio:Rimuovere 0s dalla fine di un valore decimale
0.0030
0.0310
0.0001
1.1200
Come posso scrivere una funzione dinamica che rimuove 0 nella fine del decimale?
ho un valore decimale che ha un numero variabile di cifre dopo la .
, ad esempio:Rimuovere 0s dalla fine di un valore decimale
0.0030
0.0310
0.0001
1.1200
Come posso scrivere una funzione dinamica che rimuove 0 nella fine del decimale?
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.
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.
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
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
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);
È 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;
}
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
public static string GentlyRemoveEndZeros(string input)
{
// if (input == null) return null;
// if (input == "") return "";
if (input.Contains(".")) return input.TrimEnd('0').TrimEnd('.');
return input;
}
Che dire di altre impostazioni locali che non utilizzano un '.'? –
@MartinMulder allo stesso modo: if (input.Contains (",")) restituisce input.TrimEnd ('0'). TrimEnd (','); – VovaM
@VovaN: Vero, ma la tua risposta non dovrebbe essere a prova di cultura incrociata? –
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)
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. –
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
Chi lo assume? Ho cercato "double" ... nessuno lo suppone. –
Sì, ma cosa succede se si dispone di 6 posizioni decimali o 7? Finisci con una grande e brutta faccina speculativa di # personaggi. –
Questo arrotonderà i numeri al centesimo più vicino. Questo potrebbe essere o non essere ciò che l'OP voleva ... –
@ 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, '#'))' –