.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.


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

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

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

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, 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,' ');

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.


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)


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


-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


-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
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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.