.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

답변:


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가 스택 오버 플로우를 떠난 것처럼 보입니다.
Oliver

9
초록색 수표와 최고 투표율을 찾는다면 어떻게해야할지 모르겠습니다.)
Dave Jellison

2
@DaveJellison 누군가가 그것을 수정하기 위해 플러그인을 작성 해야하는 것처럼 보입니다. 그렇지 않으면 구성 가능한 사용자 환경 설정으로 만들어야합니다.
Walter Stabosz

1
@WalterStabosz 님이 더 동의 할 수 없습니다.
Dave Jellison

2
왜 다른 모든 형식의 사용 사례와 달리 ,대신 이 작업을 수행 :합니까?
LuckyLikey

65

첫 번째와 마지막은 다음 구문을 사용하여 가능합니다.

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

49

Visual Studio 2015부터 Interpolated Strings를 사용 하여이 작업을 수행 할 수도 있습니다 (컴파일러 트릭이므로 대상으로하는 .net 프레임 워크의 버전은 중요하지 않습니다).

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

9
AC # 6 기능입니다.
LuckyLikey

나는 C # 6을 수년간 사용해 왔으며 그 것을 몰랐습니다! :) Upvoted
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-서지


Joel, 좋은 발췌 문장-나는 그것을 사용하려고 노력하고 있으며 그것이 중심에 있지는 않습니다. 리턴 라인은 다음과 같아야합니다 (편집 할 충분한 담당자가 없습니다 ...) : return s.PadLeft ((padding / 2) + s.Length, c) .PadRight (width, c);
shaunmartin

11

이 시도:

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

가운데는 줄의 길이를 얻고 필요한 문자로 왼쪽 및 오른쪽을 수행하십시오.

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

String.Format () 호출이 불필요한 것처럼 보입니다.
Joel Coehoorn

포맷 옵션은 길이가 상수 여야하기 때문에 패드 방법이 좋습니다 ( String.Format("{0,-length}", something)컴파일되지 않음)
Roberto

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. s 길이가 deisredLength 보다 크거나 같으면 함수는 원래 문자열을 반환합니다.
  3. 길이 때 의이 보다 작은 desiredLength , 그것은 양쪽 끝을 패딩됩니다.
  4. 문자 간격이 정수이고 반 공백이 없기 때문에 공백이 고르지 않을 수 있습니다. 이 구현에서, 더 큰 분할은 선단으로 간다.
  5. 이 함수에는 PadLeft ()PadRight () 로 인해 .NET Framework가 필요합니다 .
  6. 함수의 마지막 줄에서 바인딩은 왼쪽에서 오른쪽으로 이루어 지므로 firstpad 다음에 원하는 길이 패드 가 적용됩니다 .

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
치에 오신 것을 환영합니다. 이것은 훌륭한 첫 번째 게시물 및 답변의 또 다른 예입니다. +1
Brian

감사합니다. Brian,이 게시물의 맨 처음에 나오는 원래 질문은 훌륭한 출발점입니다. 나는 내 앞의 모든 게시물과 답변에서 영감을 얻었습니다.
chi

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

이것은 공용 모듈 (C #과 약간 다른 VB.NET에서 확장을 수행하는 방식) 내에서 문자열 확장으로 설정됩니다. 약간의 변화는 null 문자열을 빈 문자열로 취급하고 너비 값으로 빈 문자열을 채 웁니다 (특정 요구 사항을 충족 함). 잘하면 이것이 필요한 사람을 위해 쉽게 C #으로 변환되기를 바랍니다. 위에서 언급 한 답변, 수정 사항 및 의견을 참조 할 수있는 더 좋은 방법이 있다면 내 게시물에 영감을 주었고 알려주세요 의견을 남겨주세요 (아직 충분한 담당자가 없을 수도 있음).


0

원하는 것일 수있는 CodeProject 기사를 게시했습니다.

간접 너비 및 스타일 서식에 대해서는 AC # 방식을 참조하십시오 .

기본적으로 중앙 정렬 조정자를 허용한다는 점을 제외하면 String.Format과 같은 역할을하는 FormatEx 메서드입니다.

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

10 자 너비의 필드에서 varArgs [0]의 값을 중앙에 배치하고 여분의 패딩 공간이 필요한 경우 오른쪽으로 기울입니다.

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

10 자 너비의 필드에서 varArgs [0] 값의 중심을 의미하며 추가 패딩 공간이 필요한 경우 왼쪽으로 기울입니다.

편집 : 내부적으로 Joel의 PadCenter와 구문 분석을 통해 형식을 재구성하고 문자열을 호출하기 위해 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
holy .. 이것을 루프 내부에서 사용한다고 상상해보십시오.
LuckyLikey
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.