[.net] .NET 고정 된 공백으로 문자열 형식화

.NET String.Format 메서드를 사용하면 고정 길이 문자열 내에서 고정 위치에 문자열을 배치 할 수 있습니다.

"문자열은 여기에 간다"
"문자열이 여기에 간다"
"문자열은 여기에 간다"

이것은 .NET을 사용하여 어떻게 수행됩니까?

편집 -Format / PadLeft / PadRight를 죽이려고했습니다. 그들은 일하지 않는다. 이유를 모르겠습니다. 나는 이것을하기 위해 내 자신의 기능을 작성했다.

편집 -실수로 형식 지정자에서 쉼표 대신 콜론을 사용했습니다. “{0,20}”이어야합니다.

모든 우수하고 정답에 감사드립니다.



답변

이렇게하면 요청한 문자열이 정확하게 제공됩니다.

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


답변

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

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


답변

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

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


답변

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-서지


답변

이 시도:

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


답변

토론 해 주셔서 감사합니다.이 방법도 작동합니다 (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) 는 후행 공백을 적용하여 바인딩 마감이 낮습니다.


답변

다음은 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 #으로 변환되기를 바랍니다. 위에서 언급 한 답변, 수정 사항 및 의견을 참조 할 수있는 더 좋은 방법이 있다면 내 게시물에 영감을 주었고 알려주세요 의견을 남겨주세요 (아직 충분한 담당자가 없을 수도 있음).