.NET Sabit dizeleri olan bir dizeyi biçimlendirme


200

.NET String.Format yöntemi, bir dizenin sabit uzunluklu bir dize içinde sabit bir konuma yerleştirilmesine izin verir mi?

"String Buraya Gidiyor"
"String Buraya Gidiyor"
"String Buraya Gidiyor"

Bu .NET kullanılarak nasıl yapılır?

Edit - Format / PadLeft / PadRight ölümüne çalıştı. Çalışmıyorlar. Nedenini bilmiyorum. Bunu yapmak için kendi fonksiyonumu yazdım.

Düzenle - Bir hata yaptım ve biçim belirleyicide virgül yerine iki nokta üst üste kullandım. "{0,20}" olmalıdır.

Tüm mükemmel ve doğru cevaplar için teşekkürler.


48
Bu sayfaya giderek cevaplayamadığım bir dize biçimlendirme sorusu hiç olmadı: blog.stevex.net/index.php/string-formatting-in-csharp
jcollum

@jcollum: Cevabınızı yükseltmek isterdim ama yorum yapamazsınız
Dinah

PadLeft benim için çalışıyor PadLeft (20, 'BURADA BİR MEKAN GELİYOR') alanı terk olup olmadığını kontrol edin
Jedi Master Spooky

Ne demek "boşluk bırakmak". Eğer demek - ben "dize" diyorum, o zaman hayır. Hala çalışmıyor.
user72491

Yanıtlar:


474

Bu size tam olarak istediğiniz dizeleri verecektir:

string s = "String goes here";
string lineAlignedRight  = String.Format("{0,27}", s);
string lineAlignedCenter = String.Format("{0,-27}",
    String.Format("{0," + ((27 + s.Length) / 2).ToString() +  "}", s));
string lineAlignedLeft   = String.Format("{0,-27}", s);

64
Bu, sorunun doğru cevabı olarak işaretlenmelidir, ancak OP'nin yığın akışı bıraktığı görülüyor.
Oliver

9
Yeşil çek ile en yüksek oyu aradığınızda, nasıl SO yapılacağını bilmiyorsunuz;)
Dave Jellison

2
@DaveJellison Birisinin bunu düzeltmek için bir eklenti yazması gerekiyor gibi görünüyor, ya da SO sadece yapılandırılabilir bir kullanıcı tercihi yapmalıdır.
Walter Stabosz

1
@WalterStabosz daha fazla anlaşamadı.
Dave Jellison

2
bu neden diğer tüm biçimlendirme kullanımlarında ,olduğu :gibi yapılır ?
LuckyLikey

65

İlk ve sonuncusu, en azından aşağıdaki sözdizimi kullanılarak mümkündür:

String.Format("{0,20}", "String goes here");
String.Format("{0,-20}", "String goes here");

50

Visual Studio 2015'ten itibaren bunu Interpolated Strings ile de yapabilirsiniz (bir derleyici hilesi, bu nedenle .net çerçevesinin hangi sürümünü hedeflediğiniz önemli değildir).

string value = "String goes here";
string txt1 = $"{value,20}";
string txt2 = $"{value,-20}";

9
ac # 6 özelliği.
LuckyLikey

Yıllardır C # 6 kullanıyorum ve bunu bilmiyordum! Yukarıdakiler :)
Avrohom Yisroel

17

Size gösterildi PadLeftve PadRight. Bu eksikleri dolduracaktır PadCenter.

public static class StringUtils
{
    public static string PadCenter(this string s, int width, char c)
    {
        if (s == null || width <= s.Length) return s;

        int padding = width - s.Length;
        return s.PadLeft(s.Length + padding / 2, c).PadRight(width, c);
    }
}

Kendine not: kendi CV'sini güncellemeyi unutma: "Bir gün, Joel Coehoorn'un kodunu bile düzelttim!" ;-D -Serge


Joel, iyi snippet - Kullanmaya çalışıyorum ve tam olarak ortalamıyor, olduğu gibi. Dönüş hattı gibi bir şey olmalıdır gibi görünüyor (düzenlemek için yeterli temsilcisi yok ...): dönüş s.PadLeft ((dolgu / 2) + s. Uzunluk, c) .PadRight (genişlik, c);
shaunmartin

11

bunu dene:

"String goes here".PadLeft(20,' ');
"String goes here".PadRight(20,' ');

merkez için ipin uzunluğunu alın ve gerekli karakterlerle padleft ve padright yapın

int len = "String goes here".Length;
int whites = len /2;
"String goes here".PadRight(len + whites,' ').PadLeft(len + whites,' ');

String.Format () çağrıları gereksiz gibi görünüyor.
Joel Coehoorn

Biçimlendirme seçenekleri uzunlukların sabit olmasını gerektirdiğinden (yani String.Format("{0,-length}", something)derlenmeyeceğinden
Roberto

6

Tartışma için teşekkürler, bu yöntem de çalışır (VB):

Public Function StringCentering(ByVal s As String, ByVal desiredLength As Integer) As String
    If s.Length >= desiredLength Then Return s
    Dim firstpad As Integer = (s.Length + desiredLength) / 2
    Return s.PadLeft(firstpad).PadRight(desiredLength)
End Function
  1. StringCentering () iki giriş değeri alır ve biçimlendirilmiş bir dize döndürür.
  2. Uzunluğu ne s daha büyük ya da buna eşittir deisredLength , işlevi özgün dize döndürür.
  3. Uzunluğu ne s küçüktür desiredLength , her iki ucu doldurulur.
  4. Karakter aralığı tamsayı olduğundan ve yarım boşluk olmadığından, eşit olmayan bir alan bölünmesine sahip olabiliriz. Bu uygulamada, daha büyük bölünme önde gidiyor.
  5. İşlev, PadLeft () ve PadRight () nedeniyle .NET Framework gerektirir .
  6. İşlevin son satırında ciltleme soldan sağa doğrudur, bu nedenle firstpad uygulanır ve ardından arzu edilen Uzunluk pedi uygulanır .

İşte C # sürümü:

public string StringCentering(string s, int desiredLength)
{
    if (s.Length >= desiredLength) return s;
    int firstpad = (s.Length + desiredLength) / 2;
    return s.PadLeft(firstpad).PadRight(desiredLength);
}

Anlamaya yardımcı olmak için, tamsayı değişken firstpad kullanılır. s.PadLeft (firstpad ) önde gelen beyaz boşlukları (doğru sayıda ) uygular. En sağdaki PadRight (desiredLength) , arkadaki boşluklar uygulanarak daha düşük bir ciltleme bitişine sahiptir.


1
SO'ya hoş geldiniz, chi. Bu, BÜYÜK ilk gönderi ve cevabın başka bir örneğidir. +1
Brian

Teşekkürler Brian, bu yazının üstündeki orijinal soru mükemmel bir başlangıç ​​noktasıdır. Kendimden önceki tüm mesaj ve cevaplardan ilham alıyorum.
chi

1

Joel Coehoorn'un cevabı, Oliver'ın düzenlemesi ve shaunmartin'in yorumundan esinlenerek oluşturduğum bir VB.NET sürümü:

    <Extension()>
Public Function PadCenter(ByVal [string] As String, ByVal width As Integer, ByVal c As Char) As String

    If [string] Is Nothing Then [string] = String.Empty
    If (width <= [string].Length) Then Return [string]

    Dim padding = width - [string].Length
    Return [string].PadLeft([string].Length + (padding \ 2), c).PadRight(width, c)

End Function

<Extension()>
Public Function PadCenter(ByVal [string] As String, ByVal width As Integer) As String

    If [string] Is Nothing Then [string] = String.Empty
    If (width <= [string].Length) Then Return [string]

    Dim padding = width - [string].Length
    Return [string].PadLeft([string].Length + (padding \ 2)).PadRight(width)

End Function

Bu, Genel Modül içinde bir dize uzantısı olarak ayarlanır (VB.NET'te Uzantıları yapma şekliniz, C # 'dan biraz farklıdır). Benim küçük değişiklik, boş bir dize boş bir dize olarak işlemek ve genişlik değeri ile boş bir dize pedler (benim özel ihtiyaçlarını karşılar) olmasıdır. Umarım bu kolayca ihtiyacı olan herkes için C # dönüştürecektir. Yukarıda bahsettiğim, yazıma ilham veren cevaplara, düzenlemelere ve yorumlara başvurmanın daha iyi bir yolu varsa, lütfen bana bildirin, ben de yapacağım - Gönderim konusunda nispeten yeniyim ve anlayamadım bir yorum bırakın (henüz yeterli destek olmayabilir).


0

Ben ne olabilir bir CodeProject makale yayınladı.

Görmek: Dolaylı genişlik ve stil biçimlendirmesi için AC # yolu.

Temelde, ortalanmış bir hizalama değiştiricisine izin vermesi dışında, String.Format gibi davranan FormatEx yöntemidir.

FormatEx("{0,c10}", value);

VarArgs [0] değerini 10 karakter genişliğinde ortalar, fazladan bir dolgu alanı gerekiyorsa sağa yaslan anlamına gelir.

FormatEx("{0,c-10}", value);

VarArgs [0] değerini 10 karakter genişliğinde ortalar, fazladan bir dolgu alanı gerekirse sola yaslanın anlamına gelir.

Düzenleme: Dahili olarak, Joel's PadCenter'ın bazı ayrıştırma ile birleşimidir.

-Jesse


-1

dizeyi sabit uzunlukta bir sabit dize yerleştirecek böyle bir şey istediğiniz gibi görünüyor:

Dim totallength As Integer = 100
Dim leftbuffer as Integer = 5
Dim mystring As String = "string goes here"
Dim Formatted_String as String = mystring.PadLeft(leftbuffer + mystring.Length, "-") + String.Empty.PadRight(totallength - (mystring.Length + leftbuffer), "-")

mystring.length + leftbuffer toplam uzunluğu aşıyorsa bunun sorun yaşayacağını unutmayın


-7
/// <summary>
/// Returns a string With count chars Left or Right value
/// </summary>
/// <param name="val"></param>
/// <param name="count"></param>
/// <param name="space"></param>
/// <param name="right"></param>
/// <returns></returns>
 public static string Formating(object val, int count, char space = ' ', bool right = false)
{
    var value = val.ToString();
    for (int i = 0; i < count - value.Length; i++) value = right ? value + space : space + value;
    return value;
}

3
Bu kodu kullanmayın - çok sayıda gereksiz dize ayırması oluşturur. Bunun yerine yerleşik biçim belirteçlerini ve dolgu yöntemlerini kullanın.
Oskar Berggren

1
holy .. bunu bir döngü içinde kullanmayı hayal edin :)
LuckyLikey
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.