2010-02-01 11 views
7

C'è un modo (NET) di rimozione zeri finali da un numero quando utilizza .ToString("..."), ma per visualizzare a 2 decimali se il numero non è un numero intero:Visualizzazione zeri tranne quando un numero intero

  1. (12345,00) .ToString (...) dovrebbe essere visualizzato come dovrebbe visualizzare 12345
  2. (12345,10) .ToString (...) come 12345,10
  3. (12345,12) .ToString (...) dovrebbe visualizzare come 12345.12

È c'è una stringa di formato numero che funzionerà in tutti questi scenari?

.ToString("#.##") opere quasi, ma non mostra il finale 0 per lo scenario 2 ...

Inoltre, altre culture non sono un problema, voglio solo un punto decimale (non una virgola, ecc)

+0

Provare '0. # 0'?Non ho provato questo e non sono sicuro di come reagirà nella situazione numero intero. –

+0

Non esiste un unico formato per questo. Inoltre, cosa vuoi visualizzare come 12345.001? 12345,00 (arrotondato a 2 decimali perché non è un numero intero) o 12345 (il numero arrotondato a 2 decimali è un numero intero, quindi rimuovere gli zero finali)? – Joe

+0

Per numeri interi questo viene visualizzato come 12345.00 –

risposta

7

Qualcosa in questo senso?

  if (number % 1 == 0) 
       Console.WriteLine(string.Format("{0:0}", number)); 
      else 
       Console.WriteLine(string.Format("{0:0.00}", number)); 

EDIT

C'è un piccolo bug in questo codice però :) 1.001 verranno stampati come "1,00" ... questo potrebbe non essere ciò che si vuole, se è necessario stampare 1.001 come " 1 "è necessario modificare il test if (...) per verificare una tolleranza finita. Poiché questa domanda riguarda maggiormente la formattazione, lascerò invariata la risposta, ma nel codice di produzione potresti considerare questo tipo di problema.

+0

Per un codice leggermente più leggibile, preferirei 'Stringa formato = (numero% 1) == 0? "{0: 0}": "{0: 0.00}"; ' –

+0

Sì, sono andato con quell'iniziale, ma ho pensato che la" lunga strada "fosse più chiara nel contesto della risposta alla domanda. Probabilmente userò il tuo stile in codice reale. –

+0

Non è proprio quello che stavo cercando, perché volevo collegarmi direttamente al numero su una pagina asp.net, e usare la stringa di formato per determinare come viene visualizzata. Tuttavia, ho usato questo approccio per aggiungere un'altra variabile ai miei binding, e legarlo a quello (come una stringa). –

0

Non posso dire di essermi imbattuto in una singola maschera che lo farà. Vorrei usare

string output = (value % 1 > 0) ? String.Format("{0:0.00}", value) : String.Format("{0:0.##}", value); 
1

Non in un formato ma si adatta in una sola riga:

double a = 1.0; 
string format = string.Format((a == (int)a) ? "{0:0}" : "{0:0.00}", a); 
0

Credo che si potrebbe fare il vostro molto proprio metodo per la produzione di quel display, dal momento che è condizionale per se o non è un numero intero

public static class Extensions 
{ 
    public static string ToCustomString(this decimal d) 
    { 
     int i = (int)d; 
     if (i == d) 
      return i.ToString(); 

     return d.ToString("#.00"); 
    } 
} 
0

Se si desidera utilizzarlo per visualizzare valuta, è possibile utilizzare i seguenti

float fVal = 1234.20f; 
String strVal = fVal.Tostring("c"); 
0

Si potrebbe scrivere un metodo di estensione come questa per fare la formattazione per voi:

public static string FormatNumberString(this double input) 
    { 
     int temp; 
     string inputString = input.ToString(); 
     return Int32.TryParse(inputString, out temp) ? inputString : input.ToString("0.00"); 
    } 
0

Se stavi cercando di farlo in ASP MVC Razor, potresti provare questo

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

Questo si comporterà in questo modo:

Valore: 2,5 -> Display: 2,50

Valore: 5 -> Display: 5

Valore: 2.45 -> Display: 2.45

2

Dirty way:

string.Format("{0:0.00}", number).Replace(".00","") 
+0

Questo approccio restituisce 110 per 11.0 – DoIt

Problemi correlati