C# Language
String.Format
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 argumentynull
bezString.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
- 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
- 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
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);
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"