2009-06-24 6 views
8

Qualcuno sa come costruire una stringa di formato in .NET in modo che la stringa risultante contenga i due punti?Emettere i due punti tramite la stringa di formato in .NET

In dettaglio, ho un valore, diciamo 200, che ho bisogno di formattare come un rapporto, cioè "1: 200". Quindi sto costruendo una stringa di formato come questa "1: {0: N0}" che funziona bene. Il problema è che voglio che zero sia visualizzato come "0", non "1: 0", quindi la mia stringa di formato dovrebbe essere qualcosa come "{0: 1: N0 ;; N0}", ma ovviamente questo non funziona.

Qualche idea? Grazie!

+0

Grazie per le risposte fino ad ora. Vorrei sottolineare che so che potrei fare alcune formattazioni condizionali come suggerito, ma in realtà ho bisogno di una stringa di singolo formato - ad esempio per applicare a un'intera colonna di dati. – user7239

risposta

15
using System; 

namespace ConsoleApplication67 
{ 
    class Program 
    { 
     static void Main() 
     { 
      WriteRatio(4); 
      WriteRatio(0); 
      WriteRatio(-200); 

      Console.ReadLine(); 
     } 

     private static void WriteRatio(int i) 
     { 
      Console.WriteLine(string.Format(@"{0:1\:0;-1\:0;\0}", i)); 
     } 
    } 
} 

1:4 
0 
-1:200 

Il ; separatore in stringhe di formato significa 'fare i numeri positivi come questo; numeri negativi come questo; e zero come questo '. Lo \ sfugge ai due punti. Il terzo \ non è rigorosamente necessario poiché lo zero letterale è uguale all'output di formato numerico standard per zero :)

+1

Nizza. Non avevo visto il ';' sintassi prima. –

+2

Ah, perfetto - è la stringa letterale che ci mancava - in realtà abbiamo provato ad esaciare il colon ma ovviamente non si compila senza @ -ing la stringa. Saluti AakashM. – user7239

+0

Ottima risposta! –

1

ne dite di questo:

String display = (yourValue == 0) ? "0" : String.Format("1:{0:N0}", yourValue); 
0

Beh, un modo è quello di metterlo in un'istruzione if e formattare in modo diverso se è pari a zero.

1
String.Format(n==0 ? "{0:NO}" : "1:{0:NO}",n); 
3

È possibile utilizzare la soluzione di AakashM. Se volete qualcosa di un po 'più leggibile, è possibile creare il proprio provider:

internal class RatioFormatProvider : IFormatProvider, ICustomFormatter 
{ 
    public static readonly RatioFormatProvider Instance = new RatioFormatProvider(); 
    private RatioFormatProvider() 
    { 

    } 
    #region IFormatProvider Members 

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

     return null; 
    } 

    #endregion 

    #region ICustomFormatter Members 

    public string Format(string format, object arg, IFormatProvider formatProvider) 
    { 
     string result = arg.ToString(); 

     switch(format.ToUpperInvariant()) 
     { 
      case "RATIO": 
       return (result == "0") ? result : "1:" + result; 
      default: 
       return result; 
     } 
    } 

    #endregion 
} 

Con questo fornitore, è possibile creare stringhe di formato molto leggibili:

int ratio1 = 0; 
int ratio2 = 200; 
string result = String.Format(RatioFormatProvider.Instance, "The first value is: {0:ratio} and the second is {1:ratio}", ratio1, ratio2); 

Se controlli la classe in fase di formattazione (piuttosto di uno primitivo come Int32), puoi renderlo più bello. Vedi this article per maggiori dettagli.

+0

Al momento non ho un compilatore quindi non posso testarlo, ma suppongo che potresti anche scriverlo come metodo di estensione? Qualcosa come "String.FormatRatio (..)"? –

+0

Si potrebbe certamente fare anche in questo modo. jemnery ha appena indicato di volere un approccio al formato string. –

Problemi correlati