2012-07-27 16 views
8

Ho cercato questo ma non riesco a trovare la risposta. Ho le seguenti decimali con l'uscita corrispondente che voglio da String.FormatFormato decimale C# - Mantieni ultimo zero

100.00 -> 100
100.50 -> 100.50
100.51 -> 100.51

mio problema è che io non riesco a trovare un formato che manterrà lo 0 alla fine di 100.50 e rimuoverà i 2 zeri da 100.

Qualsiasi aiuto è molto apprezzato.

MODIFICA Per maggiore chiarezza. Ho variabili di tipo decimal, saranno sempre e solo 2 cifre decimali. Fondamentalmente voglio visualizzare 2 decimali se esistono o nessuno, non voglio visualizzare una cifra decimale nel caso di 100.50 diventare 100.5

+0

vuoi "100.50" a diventare "1.50"? –

+2

Esempio per favore! –

risposta

14

È possibile utilizzare questo:

string s = number.ToString("0.00"); 
if (s.EndsWith("00")) 
{ 
    s = number.ToString("0"); 
} 
+2

Come con la risposta di tobias86, questo non funziona su tutte le macchine, in quanto alcuni usano una virgola per il separatore decimale. –

+0

+1, bello ... – Heinzi

+0

Grazie Marco. Scusa avrei dovuto essere più chiaro riguardo alla cultura, posso ignorarlo in questo caso. Questo funziona perfettamente. – Peuge

16

Per quanto riguarda Lo so, non esiste un tale formato. Si dovrà implementare questo manualmente, ad es .:

String formatString = Math.Round(myNumber) == myNumber ? 
         "0" :  // no decimal places 
         "0.00"; // two decimal places 
+2

'100.001' userebbe il formato '" 0.00 "'. –

+1

@MarkusJarderot: Infatti. Solo l'OP può rispondere se questo è il comportamento desiderato o meno. Non include un esempio con più cifre. – Heinzi

+0

La migliore soluzione finora. Grazie per questo –

2

Ok, questo fa male agli occhi, ma dovrebbe dare ciò che vuoi:

string output = string.Format("{0:N2}", amount).Replace(".00", ""); 

UPDATE: mi piace la risposta di Heinzi di più.

+1

Questo non funziona sul mio computer, in cui una virgola è l'impostazione predefinita per il decimale. :) –

+0

@ AndersHolmström Vero ... Non pensavo alla localizzazione. – tobias86

+5

Nessuno lo fa mai ... (Lavoro in una compagnia di traduzioni :)) –

5

prova se il vostro numero è un numero intero, e l'uso formato secondo:

string.Format((number % 1) == 0 ? "{0}": "{0:0.00}", number) 
1

Questo approccio permetterà di conseguire il risultato desiderato durante l'applicazione della cultura specificato:

decimal a = 100.05m; 
decimal b = 100.50m; 
decimal c = 100.00m; 

CultureInfo ci = CultureInfo.GetCultureInfo("de-DE"); 

string sa = String.Format(new CustomFormatter(ci), "{0}", a); // Will output 100,05 
string sb = String.Format(new CustomFormatter(ci), "{0}", b); // Will output 100,50 
string sc = String.Format(new CustomFormatter(ci), "{0}", c); // Will output 100 

È possibile sostituire la cultura con CultureInfo.CurrentCulture o qualsiasi altra cultura per soddisfare le tue esigenze.

La classe CustomFormatter è:

public class CustomFormatter : IFormatProvider, ICustomFormatter 
{ 
    public CultureInfo Culture { get; private set; } 

    public CustomFormatter() 
     : this(CultureInfo.CurrentCulture) 
    { } 

    public CustomFormatter(CultureInfo culture)    
    { 
     this.Culture = culture; 
    } 

    public object GetFormat(Type formatType) 
    { 
     if (formatType == typeof(ICustomFormatter)) 
      return this; 

     return null; 
    } 

    public string Format(string format, object arg, IFormatProvider formatProvider) 
    { 
     if (formatProvider.GetType() == this.GetType()) 
     { 
      return string.Format(this.Culture, "{0:0.00}", arg).Replace(this.Culture.NumberFormat.NumberDecimalSeparator + "00", ""); 
     } 
     else 
     { 
      if (arg is IFormattable) 
       return ((IFormattable)arg).ToString(format, this.Culture); 
      else if (arg != null) 
       return arg.ToString(); 
      else 
       return String.Empty; 
     } 
    } 
} 
Problemi correlati