.NET Memformat string dengan spasi tetap

199

Apakah metode .NET String.Format memungkinkan penempatan string pada posisi tetap dalam string panjang tetap.

"String Goes Here"
"String Goes Here"
"String Goes Here"

Bagaimana ini dilakukan dengan menggunakan .NET?

Sunting - Saya telah mencoba Format / PadLeft / PadRight hingga mati. Mereka tidak bekerja. Saya tidak tahu kenapa. Saya akhirnya menulis fungsi saya sendiri untuk melakukan ini.

Sunting - Saya membuat kesalahan dan menggunakan titik dua alih-alih koma dalam format specifier. Seharusnya "{0,20}".

Terima kasih atas semua jawaban yang sangat bagus dan benar.

pengguna72491
sumber
48
Saya tidak pernah memiliki pertanyaan pemformatan string yang tidak dapat saya jawab dengan membuka halaman ini: blog.stevex.net/index.php/string-formating-in-csharp
jcollum
@jcollum: Saya ingin memilih-up jawaban Anda tetapi tidak bisa melakukan komentar
Dinah
PadLeft bekerja untuk saya memeriksa bahwa Anda meninggalkan ruang di PadLeft (20, 'HERE GOES A SPACE')
Jedi Master Spooky
Apa yang dimaksud dengan "meninggalkan ruang dalam". Jika maksud Anda - apakah saya "memotong" senar, maka tidak. Itu masih tidak berhasil.
user72491

Jawaban:

473

Ini akan memberi Anda persis string yang Anda minta:

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);
Guffa
sumber
64
Ini harus ditandai sebagai jawaban yang benar untuk pertanyaan, tetapi sepertinya OP telah meninggalkan stackoverflow.
Oliver
9
Jika Anda mencari tanda centang hijau vs. suara terbanyak, Anda tidak tahu cara melakukannya;)
Dave Jellison
2
@DaveJellison Sepertinya seseorang perlu menulis sebuah plugin untuk memperbaikinya, atau SO hanya membuatnya menjadi preferensi pengguna yang dapat dikonfigurasi.
Walter Stabosz
1
@WalterStabosz sangat setuju.
Dave Jellison
2
mengapa ini dilakukan ,alih - alih :seperti di semua format penggunaan lainnya?
LuckyLikey
65

Yang pertama dan yang terakhir, setidaknya, dimungkinkan menggunakan sintaks berikut:

String.Format("{0,20}", "String goes here");
String.Format("{0,-20}", "String goes here");
Konrad Rudolph
sumber
49

Pada Visual Studio 2015 Anda juga bisa melakukan ini dengan Interpolated Strings (ini adalah trik kompiler, jadi tidak masalah versi mana dari kerangka .net yang Anda targetkan).

string value = "String goes here";
string txt1 = $"{value,20}";
string txt2 = $"{value,-20}";
Bintik-bintik
sumber
9
fitur ac # 6.
LuckyLikey
Saya telah menggunakan C # 6 selama bertahun-tahun dan tidak tahu itu! Diperbaharui :)
Avrohom Yisroel
17

Anda telah ditunjukkan PadLeftdan PadRight. Ini akan mengisi yang hilang 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);
    }
}

Catatan untuk diri sendiri: jangan lupa untuk memperbarui CV sendiri: "Suatu hari, saya bahkan memperbaiki kode Joel Coehoorn!" ;-D -Muncul

Joel Coehoorn
sumber
Joel, cuplikan yang bagus - Saya mencoba untuk menggunakannya dan itu tidak cukup pusat, seperti itu. Sepertinya baris kembali harus seperti (saya tidak punya cukup rep untuk mengedit ...): return s.PadLeft ((padding / 2) + s.Panjang, c) .PadRight (lebar, c);
shaunmartin
11

coba ini:

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

untuk bagian tengah dapatkan panjang tali dan lakukan padleft dan padright dengan karakter yang diperlukan

int len = "String goes here".Length;
int whites = len /2;
"String goes here".PadRight(len + whites,' ').PadLeft(len + whites,' ');
Jedi Master Spooky
sumber
Sepertinya panggilan String.Format () tidak perlu.
Joel Coehoorn
Metode Pad baik karena opsi Format memerlukan panjang untuk menjadi konstanta (yaitu, String.Format("{0,-length}", something)tidak akan dikompilasi.
Roberto
6

Terima kasih atas diskusi, metode ini juga berfungsi (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 () mengambil dua nilai input dan mengembalikan string yang diformat.
  2. Ketika panjang s lebih besar dari atau sama dengan deisredLength , fungsi mengembalikan string asli.
  3. Ketika panjang s lebih kecil dari panjang yang diinginkan , itu akan diisi kedua ujungnya.
  4. Karena spasi karakter adalah bilangan bulat dan tidak ada setengah ruang, kita dapat memiliki ruang yang tidak rata. Dalam implementasi ini, perpecahan yang lebih besar mengarah ke akhir.
  5. Fungsi ini membutuhkan .NET Framework karena PadLeft () dan PadRight () .
  6. Di baris terakhir dari fungsi, penjilidan dari kiri ke kanan, sehingga bantalan pertama diterapkan diikuti oleh bantalan Panjang yang diinginkan .

Ini adalah versi C #:

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

Untuk membantu pemahaman, firstpad variabel integer digunakan. s.PadLeft (firstpad) menerapkan (jumlah yang benar dari) spasi putih utama. PadRight paling kanan (yang diinginkanLength) memiliki ikatan yang lebih rendah selesai dengan menerapkan spasi putih tambahan.

chi
sumber
1
Selamat datang di SO, chi. Ini adalah contoh lain dari posting dan jawaban pertama HEBAT. +1
Brian
Terima kasih Brian, pertanyaan asli di bagian atas posting ini adalah titik awal yang sangat baik. Saya terinspirasi oleh semua posting dan jawaban sebelum saya.
chi
1

Berikut adalah versi VB.NET yang saya buat, terinspirasi oleh jawaban Joel Coehoorn, suntikan Oliver, dan komentar shaunmartin:

    <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

Ini diatur sebagai ekstensi string, di dalam Modul Publik (cara Anda melakukan Ekstensi di VB.NET, sedikit berbeda dari C #). Perubahan kecil saya adalah bahwa itu memperlakukan string nol sebagai string kosong, dan itu bantalan string kosong dengan nilai lebar (memenuhi kebutuhan khusus saya). Semoga ini akan dikonversi dengan mudah ke C # untuk siapa saja yang membutuhkannya. Jika ada cara yang lebih baik untuk merujuk jawaban, suntingan, dan komentar yang saya sebutkan di atas, yang mengilhami posting saya, tolong beri tahu saya dan saya akan melakukannya - saya relatif baru dalam memposting, dan saya tidak tahu tinggalkan komentar (mungkin belum cukup perwakilan)

Jeff
sumber
0

Saya memposting artikel CodeProject yang mungkin Anda inginkan.

Lihat: AC # way untuk pemformatan lebar dan gaya tidak langsung.

Pada dasarnya ini adalah metode, FormatEx, yang bertindak seperti String.Format, kecuali itu memungkinkan pengubah penyelarasan terpusat.

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

Berarti memusatkan nilai varArgs [0] dalam bidang lebar 10 karakter, miring ke kanan jika diperlukan ruang bantalan tambahan.

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

Berarti memusatkan nilai varArgs [0] dalam bidang 10 karakter lebar, condong ke kiri jika ruang bantalan tambahan diperlukan.

Sunting: Secara internal, ini adalah kombinasi dari Padelenter Joel dengan beberapa penguraian untuk merestrukturisasi format dan varArgs untuk panggilan ke String. Kesesuaian yang melakukan apa yang Anda inginkan.

-Jesse

Jesse Chisholm
sumber
-1

sepertinya Anda menginginkan sesuatu seperti ini, yang akan menempatkan Anda pada titik tetap dalam string dengan panjang konstan:

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), "-")

perhatikan bahwa ini akan memiliki masalah jika mystring.length + leftbuffer melebihi totallength

Atilio Jobson
sumber
-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;
}
Paulos02
sumber
3
Jangan gunakan kode ini - ini menghasilkan banyak alokasi string yang tidak perlu. Gunakan specifier format bawaan dan metode padding sebagai gantinya.
Oskar Berggren
1
suci .. bayangkan menggunakan ini di dalam satu lingkaran :)
LuckyLikey