Sök…


Introduktion

Format är en uppsättning överbelastningar i klassen System.String används för att skapa strängar som kombinerar objekt i specifika strängrepresentationer. Denna information kan tillämpas på String.Format , olika WriteLine metoder samt andra metoder i .NET-ramverket.

Syntax

  • string.Format (strängformat, paramsobjekt [] args)
  • string.Format (IFormatProvider-leverantör, strängformat, params-objekt [] args)
  • $ "string {text} blablabla" // Sedan C # 6

parametrar

Parameter detaljer
formatera En sammansatt formatsträng som definierar hur args ska kombineras till en sträng.
args En sekvens av objekt som ska kombineras till en sträng. Eftersom detta använder ett params argument kan du antingen använda en kommaseparerad lista med argument eller ett faktiskt objektuppsättning.
leverantör En samling sätt att formatera objekt till strängar. Typiska värden inkluderar CultureInfo.InvariantCulture och CultureInfo.CurrentCulture .

Anmärkningar

Anmärkningar:

  • String.Format() hanterar null utan att göra ett undantag.
  • Det finns överbelastningar som ersätter args parametern med en, två eller tre objektparametrar.

Platser där String.Format är "inbäddat" i ramen

Det finns flera platser där du kan använda String.Format indirekt : Hemligheten är att leta efter överbelastningen med signatursträngformatet string format, params object[] args , t.ex.:

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

Kan ersättas med kortare version:

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

Det finns andra metoder som också använder String.Format t.ex.:

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

Med hjälp av anpassat nummerformat

NumberFormatInfo kan användas för att formatera både heltal och floatnummer.

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

Skapa en anpassad leverantör av format

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

Användande:

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

Produktion:

-> dlroW olleH <-

Rikta in vänster / höger, dyna med mellanslag

Det andra värdet i de lockiga hängslen dikterar längden på ersättningssträngen. Genom att justera det andra värdet för att vara positivt eller negativt kan strängen justeras.

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

Produktion:

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

Numeriska format

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

Produktion:

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%

Valutaformatering

Specifikatorn "c" (eller valuta) omvandlar ett nummer till en sträng som representerar ett valutabelopp.

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

Precision

Standard är 2. Använd c1, c2, c3 och så vidare för att kontrollera precisionen.

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

Valutasymbol

  1. Passera CultureInfo instansen för att använda anpassad kultursymbol.
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. Använd vilken sträng som valutasymbol. Använd NumberFormatInfo att anpassa valutasymbolen.
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

Valutasymbolets placering

Använd CurrencyPositivePattern för positiva värden och CurrencyNegativePattern för negativa värden.

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 $

Negativ mönsteranvändning är densamma som positivt mönster. Mycket mer användningsfall hänvisas till originallänken.

Anpassad decimal separator

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

Sedan C # 6.0

6,0

Sedan C # 6.0 är det möjligt att använda stränginterpolering istället för String.Format .

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

Hej John Doe!

Fler exempel på detta under ämnet C # 6.0-funktioner: Stränginterpolering .

Rymmer lockiga parenteser i ett String.Format () -uttryck

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"

Datumformatering

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

utgång:

06
Лхагва
06
Specifier Menande Prov Resultat
d Datum {0:d} 2016/07/06
dd Dag, noll vadderad {0:dd} 06
ddd Kort dag namn {0:ddd} ons
dddd Hel dag namn {0:dddd} onsdag
D Långt datum {0:D} Onsdag 6 juli 2016
f Fullständigt datum och tid, kort {0:f} Onsdag 6 juli 2016 18:30
ff Andra fraktioner, 2 siffror {0:ff} 20
fff Andra fraktioner, 3 siffror {0:fff} 201
F F F F Andra fraktioner, 4 siffror {0:ffff} 2016
F Fullt datum och tid, länge {0:F} Onsdag 6 juli 2016 18:30:14
g Standarddatum och tid {0:g} 7/6/2016 18:30
gg Epok {0:gg} AD
hh Hour (2 siffror, 12H) {0:hh} 06
HH Timme (2 siffror, 24 timmar) {0:HH} 18
M Månad och dag {0:M} 6 juli
mm Protokoll, noll vadderade {0:mm} 30
MM Månad, noll vadderad {0:MM} 07
MMM 3-månaders månadens namn {0:MMM} juli
MMMM Hel månad namn {0:MMMM} juli
ss sekunder {0:ss} 14
r RFC1123 datum {0:r} Ons, 06 jul 2016 18:30:14 GMT
s Sorterbar datumsträng {0:s} 2016-07-06T18: 30: 14
t Kort tid {0:t} 18:30
T Länge sedan {0:T} 18:30:14
tt AM PM {0:tt} PM
u Universell sorterbar lokal tid {0:u} 2016-07-06 18: 30: 14Z
U Universal GMT {0:U} Onsdag 6 juli 2016 09:30:14
Y Månad och år {0:Y} Juli 2016
yy 2-siffrigt år {0:yy} 16
yyyy 4-siffrigt år {0:yyyy} 2016
zz Tvåsiffrig tidszonförskjutning {0:zz} 09
zzz offset för heltidszon {0:zzz} 09: 00

Att stränga()

Metoden ToString () finns på alla referensobjekttyper. Detta beror på att alla referenstyper härrör från Object som har metoden ToString (). Metoden ToString () i objektbasklassen returnerar typnamnet. Fragmentet nedan skriver ut "Användare" till konsolen.

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

Klassen Användare kan dock åsidosätta ToString () för att ändra strängen som den returnerar. Kodfragmentet nedan skriver ut "Id: 5, Namn: Användare1" på konsolen.

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

Förhållande till ToString ()

Medan String.Format() -metoden verkligen är användbar vid formatering av data som strängar, kan det ofta vara lite överdrivet, särskilt när man hanterar ett enda objekt som ses nedan:

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

En enklare metod kan vara att helt enkelt använda ToString() -metoden som är tillgänglig på alla objekt inom C #. Det stöder alla samma standard- och anpassade formateringssträngar , men kräver inte den nödvändiga parameterkartläggningen eftersom det bara kommer att finnas ett enda argument:

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

Varningar och begränsningar för formatering

Även om detta tillvägagångssätt kan vara enklare i vissa scenarier är ToString() -metoden begränsad när det gäller att lägga till vänster eller höger polstring som du kan göra inom String.Format() -metoden:

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

För att uppnå samma beteende med ToString() , måste du använda en annan metod som PadLeft() respektive PadRight() :

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


Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow