Szukaj…


Wprowadzenie

Metody Format to zestaw przeciążeń w klasie System.String służący do tworzenia ciągów, które łączą obiekty w określone reprezentacje ciągów. Informacja ta może być stosowana do String.Format różne WriteLine metody, jak również inne metody w .NET Framework.

Składnia

  • string.Format (format ciągu, parametry params [] argumenty)
  • string.Format (dostawca IFormatProvider, format ciągu, obiekt params [] argumenty)
  • $ "string {text} blablabla" // Od C # 6

Parametry

Parametr Detale
format Łańcuch formatu złożonego , który określa sposób łączenia argumentów w ciąg.
args Sekwencja obiektów do połączenia w ciąg. Ponieważ używa to argumentu params , możesz użyć rozdzielonej przecinkami listy argumentów lub rzeczywistej tablicy obiektów.
dostawca Zbiór sposobów formatowania obiektów na ciągi. Typowe wartości obejmują CultureInfo.InvariantCulture i CultureInfo.CurrentCulture .

Uwagi

Uwagi:

  • String.Format() obsługuje argumenty null bez String.Format() wyjątku.
  • Istnieją przeciążenia, które zastępują parametr args jednym, dwoma lub trzema parametrami obiektu.

Miejsca, w których String.Format jest „osadzony” w ramach

Istnieje kilka miejsc, w których można użyć String.Format pośrednio : Sekret polega na szukaniu przeciążenia string format, params object[] args podpisu string format, params object[] args , np .:

Console.WriteLine(String.Format("{0} - {1}", name, value));

Można zastąpić krótszą wersją:

Console.WriteLine("{0} - {1}", name, value);

Istnieją inne metody, które również wykorzystują String.Format np .:

Debug.WriteLine(); // and Print()
StringBuilder.AppendFormat();

Korzystanie z niestandardowego formatu liczb

NumberFormatInfo może służyć do formatowania liczb całkowitych i liczb zmiennoprzecinkowych.

// invariantResult is "1,234,567.89"
var invarianResult = string.Format(CultureInfo.InvariantCulture, "{0:#,###,##}", 1234567.89);

// NumberFormatInfo is one of classes that implement IFormatProvider
var customProvider = new NumberFormatInfo
{
    NumberDecimalSeparator = "_NS_", // will be used instead of ','
    NumberGroupSeparator = "_GS_", // will be used instead of '.'
};

// customResult is "1_GS_234_GS_567_NS_89"
var customResult = string.Format(customProvider, "{0:#,###.##}", 1234567.89);

Utwórz niestandardowego dostawcę formatu

public class CustomFormat : IFormatProvider, ICustomFormatter
{
    public string Format(string format, object arg, IFormatProvider formatProvider)
    {
        if (!this.Equals(formatProvider))
        {
            return null;
        }

        if (format == "Reverse")
        {
            return String.Join("", arg.ToString().Reverse());
        }

        return arg.ToString();
    }

    public object GetFormat(Type formatType)
    {
        return formatType==typeof(ICustomFormatter) ? this:null;
    }
}

Stosowanie:

String.Format(new CustomFormat(), "-> {0:Reverse} <-", "Hello World");

Wynik:

-> dlroW olleH <-

Wyrównaj do lewej / prawej, pad ze spacjami

Druga wartość w nawiasach klamrowych określa długość łańcucha zastępczego. Dostosowując drugą wartość do dodatniej lub ujemnej, można zmienić wyrównanie ciągu.

string.Format("LEFT:  string: ->{0,-5}<- int: ->{1,-5}<-", "abc", 123);
string.Format("RIGHT: string: ->{0,5}<- int: ->{1,5}<-", "abc", 123);

Wynik:

LEFT:  string: ->abc  <- int: ->123  <-
RIGHT: string: ->  abc<- int: ->  123<-

Formaty numeryczne

// Integral types as hex
string.Format("Hexadecimal: byte2: {0:x2}; byte4: {0:X4}; char: {1:x2}", 123, (int)'A');

// Integers with thousand separators
string.Format("Integer, thousand sep.: {0:#,#}; fixed length: >{0,10:#,#}<", 1234567);

// Integer with leading zeroes
string.Format("Integer, leading zeroes: {0:00}; ", 1);

// Decimals
string.Format("Decimal, fixed precision: {0:0.000}; as percents: {0:0.00%}", 0.12);

Wynik:

Hexadecimal: byte2: 7b; byte4: 007B; char: 41
Integer, thousand sep.: 1,234,567; fixed length: > 1,234,567<
Integer, leading zeroes: 01; 
Decimal, fixed precision: 0.120; as percents: 12.00%

Formatowanie walut

Specyfikator formatu „c” (lub waluta) konwertuje liczbę na ciąg znaków reprezentujący kwotę waluty.

string.Format("{0:c}", 112.236677) // $112.23 - defaults to system

Precyzja

Domyślnie jest to 2. Użyj c1, c2, c3 i tak dalej, aby kontrolować precyzję.

string.Format("{0:C1}", 112.236677) //$112.2
string.Format("{0:C3}", 112.236677) //$112.237
string.Format("{0:C4}", 112.236677) //$112.2367
string.Format("{0:C9}", 112.236677) //$112.236677000

Symbol waluty

  1. Przekaż instancję CultureInfo aby użyć niestandardowego symbolu kultury.
string.Format(new CultureInfo("en-US"), "{0:c}", 112.236677); //$112.24
string.Format(new CultureInfo("de-DE"), "{0:c}", 112.236677); //112,24 €
string.Format(new CultureInfo("hi-IN"), "{0:c}", 112.236677); //₹ 112.24
  1. Użyj dowolnego łańcucha jako symbolu waluty. Użyj NumberFormatInfo jako, aby dostosować symbol waluty.
NumberFormatInfo nfi = new CultureInfo( "en-US", false ).NumberFormat;
nfi = (NumberFormatInfo) nfi.Clone();
nfi.CurrencySymbol = "?";
string.Format(nfi, "{0:C}", 112.236677); //?112.24
nfi.CurrencySymbol = "?%^&";
string.Format(nfi, "{0:C}", 112.236677); //?%^&112.24

Pozycja symbolu waluty

Użyj CurrencyPositivePattern dla wartości dodatnich i CurrencyNegativePattern dla wartości ujemnych.

NumberFormatInfo nfi = new CultureInfo( "en-US", false ).NumberFormat;        
nfi.CurrencyPositivePattern = 0;
string.Format(nfi, "{0:C}", 112.236677); //$112.24 - default
nfi.CurrencyPositivePattern = 1;
string.Format(nfi, "{0:C}", 112.236677); //112.24$
nfi.CurrencyPositivePattern = 2;
string.Format(nfi, "{0:C}", 112.236677); //$ 112.24
nfi.CurrencyPositivePattern = 3; 
string.Format(nfi, "{0:C}", 112.236677); //112.24 $

Użycie wzorca ujemnego jest takie samo jak wzorca dodatniego. O wiele więcej przypadków użycia można znaleźć w oryginalnym linku.

Niestandardowy separator dziesiętny

NumberFormatInfo nfi = new CultureInfo( "en-US", false ).NumberFormat;        
nfi.CurrencyPositivePattern = 0;
nfi.CurrencyDecimalSeparator = "..";
string.Format(nfi, "{0:C}", 112.236677); //$112..24

Od wersji C # 6.0

6.0

Od wersji C # 6.0 można używać interpolacji łańcuchów zamiast String.Format .

string name = "John";
string lastname = "Doe";
Console.WriteLine($"Hello {name} {lastname}!");

Witaj John Doe!

Więcej przykładów tego w temacie Funkcje C # 6.0: Interpolacja ciągów .

Ucieczka nawiasów klamrowych wewnątrz wyrażenia String.Format ()

string outsidetext = "I am outside of bracket";
string.Format("{{I am in brackets!}} {0}", outsidetext);

//Outputs "{I am in brackets!} I am outside of bracket"

Formatowanie daty

DateTime date = new DateTime(2016, 07, 06, 18, 30, 14);
// Format: year, month, day hours, minutes, seconds

Console.Write(String.Format("{0:dd}",date)); 

//Format by Culture info
String.Format(new System.Globalization.CultureInfo("mn-MN"),"{0:dddd}",date);
6.0
Console.Write($"{date:ddd}");

wynik :

06
Лхагва
06
Specyficzny Znaczenie Próba Wynik
re Data {0:d} 7/6/2016
dd Dzień bez wyściełania {0:dd} 06
ddd Nazwa krótkiego dnia {0:ddd} Poślubić
dddd Imię i nazwisko {0:dddd} środa
re Długa randka {0:D} Środa, 6 lipca 2016 r
fa Pełna data i godzina, krótka {0:f} Środa, 6 lipca 2016 18:30
ff Drugie ułamki, 2 cyfry {0:ff} 20
fff Drugie ułamki, 3 cyfry {0:fff} 201
ffff Drugie ułamki, 4 cyfry {0:ffff} 2016 r
fa Pełna data i godzina, długie {0:F} Środa, 6 lipca 2016 18:30:14
sol Domyślna data i godzina {0:g} 7/6/2016 18:30
gg Era {0:gg} OGŁOSZENIE
hh Godzina (2 cyfry, 12 godz.) {0:hh} 06
HH Godzina (2 cyfry, 24 godziny) {0:HH} 18
M. Miesiąc i dzień {0:M} 6 lipca
mm Minuty, wyściełane zerami {0:mm} 30
MM Miesiąc z zerowym wypełnieniem {0:MM} 07
MMM 3-literowa nazwa miesiąca {0:MMM} Jul
MMMM Pełna nazwa miesiąca {0:MMMM} lipiec
ss sekundy {0:ss} 14
r Data RFC1123 {0:r} Śr., 06 lip 2016 18:30:14 GMT
s Sortowalny ciąg daty {0:s} 2016-07-06T18: 30: 14
t Krótki czas {0:t} 18:30
T. Długi czas {0:T} 18:30:14
tt AM / PM {0:tt} PO POŁUDNIU
u Uniwersalny czas lokalny z możliwością sortowania {0:u} 2016-07-06 18: 30: 14Z
U Universal GMT {0:U} Środa, 6 lipca 2016 09:30:14
Y Miesiąc i rok {0:Y} Lipiec 2016 r
tak 2-cyfrowy rok {0:yy} 16
rrrr 4-cyfrowy rok {0:yyyy} 2016 r
zz 2-cyfrowe przesunięcie strefy czasowej {0:zz} +09
zzz pełne przesunięcie strefy czasowej {0:zzz} +09: 00

ToString ()

Metoda ToString () jest obecna na wszystkich typach obiektów referencyjnych. Wynika to z faktu, że wszystkie typy referencji pochodzą z Object, na którym znajduje się metoda ToString (). Metoda ToString () w klasie bazowej obiektu zwraca nazwę typu. Poniższy fragment wydrukuje „User” na konsoli.

public class User
{
    public string Name { get; set; }
    public int Id { get; set; }
}

...

var user = new User {Name = "User1", Id = 5};
Console.WriteLine(user.ToString());

Jednak klasa Użytkownik może również przesłonić ToString () w celu zmiany zwracanego ciągu. Poniższy fragment kodu wypisuje na konsoli „Id: 5, Nazwa: Użytkownik1”.

public class User
{
    public string Name { get; set; }
    public int Id { get; set; }
    public override ToString()
    {
        return string.Format("Id: {0}, Name: {1}", Id, Name);
    }
}

...

var user = new User {Name = "User1", Id = 5};
Console.WriteLine(user.ToString());

Relacja z ToString ()

Chociaż metoda String.Format() jest z pewnością przydatna w formatowaniu danych jako ciągów, często może być nieco przesadna, szczególnie w przypadku pojedynczego obiektu, jak pokazano poniżej:

String.Format("{0:C}", money);  // yields "$42.00"

Łatwiejszym podejściem może być po prostu użycie metody ToString() dostępnej dla wszystkich obiektów w C #. Obsługuje wszystkie te same standardowe i niestandardowe ciągi formatujące , ale nie wymaga koniecznego mapowania parametrów, ponieważ będzie tylko jeden argument:

money.ToString("C");  // yields "$42.00"

Ostrzeżenia i ograniczenia dotyczące formatowania

Podczas gdy takie podejście może być prostsze w niektórych scenariuszach, podejście ToString() jest ograniczone w odniesieniu do dodawania lewego lub prawego dopełnienia, tak jak możesz to zrobić w ramach metody String.Format() :

String.Format("{0,10:C}", money);  // yields "    $42.00"

Aby osiągnąć to samo zachowanie za pomocą metody ToString() , należy użyć innej metody, takiej jak odpowiednio PadLeft() lub PadRight() :

money.ToString("C").PadLeft(10);  // yields "    $42.00"


Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow