2009-06-24 2 views
8

Czy ktoś wie, jak skonstruować ciąg formatu w .NET, aby wynikowy ciąg zawierał dwukropek?Emitowanie dwukropka za pomocą łańcucha formatu w .NET

Mówiąc dokładniej, mam wartość, powiedzmy 200, którą muszę sformatować jako stosunek, tj. "1: 200". Dlatego tworzę ciąg formatujący taki jak "1: {0: N0}", który działa dobrze. Problem polega na tym, że chcę, aby zero wyświetlało się jako "0", a nie "1: 0", więc mój ciąg znaków powinien wyglądać jak "{0: 1: N0 ;; N0}", ale oczywiście to nie działa.

Wszelkie pomysły? Dzięki!

+0

Dzięki za odpowiedzi do tej pory. Powinienem zauważyć, że wiem, że mógłbym zastosować formatowanie warunkowe zgodnie z sugestią, ale w rzeczywistości potrzebuję jednego ciągu formatu - na przykład do zastosowania w całej kolumnie danych. – user7239

Odpowiedz

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)); 
     } 
    } 
} 

daje

1:4 
0 
-1:200 

; separator w ciągi formatu znaczy „zrobić pozytywne numery jak ten; takie liczby ujemne; i zero w ten sposób ". \ wymyka się z dwukropka. Trzeci numer \ nie jest konieczny, ponieważ konieczne jest, aby literalne zero było takie samo jak standardowe wyjście formatu liczbowego na zero :)

+1

Nice. Nie widziałem ";" składnia przed. –

+2

Ah, perfect - to literał, którego nam brakowało - faktycznie próbowaliśmy esacaping w okrężnicy, ale oczywiście to nie kompiluje się bez @ -inga. Pozdrawiam AakashM. – user7239

+0

Doskonała odpowiedź! –

1

Jak o tym:

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

Cóż, jednym ze sposobów jest umieszczenie go w instrukcji if i sformatować go inaczej, jeśli jest zero.

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

Możesz użyć rozwiązania AakashM. Jeśli chcesz coś nieco bardziej czytelny, można stworzyć swój własny 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 
} 

Z tego dostawcę, można stworzyć bardzo czytelne formatu ciągi:

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); 

Jeśli kontrolujesz klasa formatowania (raczej niż prymitywny jak Int32), możesz sprawić, żeby wyglądało to ładniej. Aby uzyskać więcej informacji, patrz this article.

+0

Nie mam teraz kompilatora, więc nie mogę go przetestować, ale przypuszczam, że można go również zapisać jako metodę rozszerzenia? Coś jak "String.FormatRatio (..)"? –

+0

Z pewnością można to zrobić w ten sposób. Jemmery właśnie zaznaczył, że chce zastosować łańcuch znaków. –