.NET固定スペースで文字列をフォーマットする


199

.NET String.Formatメソッドでは、固定長の文字列内の固定位置に文字列を配置できますか。

「文字列がここに行く」
「文字列はここに行く」
「文字列がここに行く」

これは.NETを使用してどのように行われますか?

編集 -Format / PadLeft / PadRightを試してみました。彼らは動作しません。理由はわかりません。これを行うための独自の関数を作成することになりました。

編集 -間違いを犯し、フォーマット指定子でコンマの代わりにコロンを使用しました。「{0,20}」である必要があります。

優れた正解のすべてに感謝します。


48
私はこのページに行くことによって答えることができなかった文字列フォーマットの質問を持ったことがありません:blog.stevex.net/index.php/string-formatting-in-csharp
jcollum

@jcollum:私はあなたの答えに賛成投票したいのですが、コメントにはできません
Dinah

PadLeftは私のために機能し、PadLeft(20、 'HERE GOES A SPACE')のスペースを離れることを確認します
Jedi Master Spooky

「スペースを残す」とはどういう意味ですか。もしあなたが意味するなら-私は文字列を「トリミング」していますか?それでも動作しません。
user72491 2009年

回答:


473

これにより、要求した文字列が正確に得られます。

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
これは質問に対する正解としてマークする必要がありますが、OPがスタックオーバーフローを残したようです。
オリバー

9
緑の小切手と最高の賛成票を探している場合、SOの方法がわかりません;)
Dave Jellison

2
@DaveJellison誰かがそれを修正するためにプラグインを書く必要があるようです、またはSOは単にそれを構成可能なユーザー設定にする必要があります。
Walter Stabosz 2017年

1
@WalterStaboszはこれ以上同意できませんでした。
Dave Jellison 2017年

2
これはなぜで行われる,代わりに、:他のすべての書式設定ユースケースのように?
LuckyLikey 2017

65

少なくとも最初と最後は、次の構文を使用して可能です。

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

49

Visual Studio 2015以降では、補間文字列を使用してこれを実行することもできます(コンパイラーのトリックなので、ターゲットとする.netフレームワークのバージョンは関係ありません)。

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

9
そのac#6機能。
LuckyLikey

私は何年もC#6を使用していて、そのことを知りませんでした!賛成:)
Avrohom Yisroel

17

あなたは示されPadLeftていPadRightます。これは欠けているを埋め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);
    }
}

自分へのメモ:自分のCVを更新することを忘れないでください:「ある日、私はJoel Coehoornのコードを修正さえしました!」;-D -Serge


ジョエル、いいスニペット-私はそれを使おうとしているのですが、それが中心ではありません。戻り行は次のようになるはずです(編集するのに十分な担当者がいない...):return s.PadLeft((padding / 2)+ s.Length、c).PadRight(width、c);
shaunmartin 2010年

11

これを試して:

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

中央の場合は文字列の長さを取得し、必要な文字でpadleftおよびpadrightを実行します

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

String.Format()呼び出しは不必要なようです。
Joel Coehoorn 2009年

フォーマットのオプションがあること(定数する長さを必要とするので、パッドの方法が優れている、String.Format("{0,-length}", something)コンパイルされません。
ロベルト

6

議論のおかげで、この方法も機能します(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()は2つの入力値を取り、フォーマットされた文字列を返します。
  2. sの長さがdeisredLength以上の場合、関数は元の文字列を返します。
  3. sの長さがdesiredLengthより小さい場合、両端が埋め込まれます。
  4. 文字間隔は整数であり、ハーフスペースがないため、スペースの分割が不均一になる可能性があります。この実装では、より大きなスプリットはリーディングエンドに行きます。
  5. PadLeft()およびPadRight()により、関数には.NET Frameworkが必要です。
  6. 関数の最後の行では、バインディングは左から右に行われるため、firstpadが適用され、次にdesiredLengthパッドが適用されます。

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

理解を助けるために、整数変数firstpadが使用されます。s.PadLeft(firstpad)は、(正しい数の)先頭の空白を適用します。右端のPadRight(desiredLength)は、末尾の空白を適用することにより、最後のバインディングが終了します。


1
SOへようこそ。これは、すばらしい最初の投稿と回答のもう1つの例です。+1
ブライアン

ありがとう、ブライアン。この投稿の上部にある元の質問は、優れた出発点です。私は私の前のすべての投稿と回答に刺激を受けています。
カイ

1

これは、Joel Coehoornの回答、Oliverの編集、およびshaunmartinのコメントに触発されて作成したVB.NETバージョンです。

    <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

これは、Public Module内の文字列拡張として設定されます(VB.NETで拡張を行う方法で、C#とは少し異なります)。私のわずかな変更は、null文字列を空の文字列として扱い、空の文字列に幅の値を埋め込む(私の特定のニーズに対応する)ことです。うまくいけば、これはそれを必要とする誰にとっても簡単にC#に変換されるでしょう。上記の回答、編集、コメントを参照するより良い方法があり、それが私の投稿に影響を与えた場合は、私に知らせてください。私はそれを行います-私は投稿に比較的慣れていないので、コメントを残してください(まだ十分な担当者がいない可能性があります)。


0

私はあなたが望むかもしれないCodeProjectの記事を投稿しました。

参照:間接的な幅とスタイルの書式設定については、C#の方法。

基本的には、中央揃えの修飾子を許可することを除いて、String.Formatと同様に機能するメソッドFormatExです。

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

varArgs [0]の値を10文字幅のフィールドの中央に配置することを意味し、追加のパディングスペースが必要な場合は右に傾けます。

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

varArgs [0]の値を10文字の幅のフィールドの中央に配置することを意味し、追加のパディングスペースが必要な場合は左に傾けます。

編集:内部的には、JoelのPadCenterと、形式を再構築するための解析と、必要な処理を行うString.Formatの呼び出しのためのvarArgsを組み合わせたものです。

-ジェシー


-1

あなたはこのようなものを望んでいるようです、それはあなたを一定の長さの文字列の固定点に置くでしょう:

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が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
このコードは使用しないでください。不要な文字列の割り当てが大量に発生します。代わりに、組み込みの書式指定子とパディングメソッドを使用してください。
Oskar Berggren

1
聖なる..これをループ内で使用することを想像してください:)
LuckyLikey
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.