BestPractice-문자열의 첫 문자를 소문자로 변환


136

문자열의 첫 문자를 소문자로 변환하는 방법을 원합니다.

내 접근 방식 :

1.

public static string ReplaceFirstCharacterToLowerVariant(string name)
{
    return String.Format("{0}{1}", name.First().ToString().ToLowerInvariant(), name.Substring(1));
}

2.

public static IEnumerable<char> FirstLetterToLowerCase(string value)
{
    var firstChar = (byte)value.First();
    return string.Format("{0}{1}", (char)(firstChar + 32), value.Substring(1));
}

당신의 접근 방식은 무엇입니까?

답변:


239

간단한 연결을 사용합니다.

Char.ToLowerInvariant(name[0]) + name.Substring(1)

첫 번째 솔루션은 string.Format속도가 느리기 때문에 최적화 되지 않았으며 절대로 변경되지 않는 형식이 있으면 필요하지 않습니다. 또한 문자를 소문자로 은닉하기 위해 추가 문자열을 생성하므로 필요하지 않습니다.

"+ 32"를 사용하는 방법은 ASCII 문자 값 오프셋에 대한 지식이 필요하기 때문에 추악하고 유지 관리 할 수 ​​없습니다. 또한 유니 코드 데이터 및 ASCII 기호 문자로 잘못된 출력을 생성합니다.


4
나는 그것을 할 것이다 :char.ToLower(name[0]).ToString() + name.Substring(1)
Andrey

7
@Rookian : +많은 문자열을 연결하면 연산자가 느려집니다. 이 경우 a StringBuilder가 훨씬 더 잘 수행됩니다. 그러나 +보다 훨씬 빠릅니다 string.Format. 정수, 복식 또는 날짜 표시와 같이 실제로 형식을 지정해야 할 경우 후자를 사용하십시오.
Dirk Vollmar

6
@ 0x03 : 많은 문자열을 반복적으로 연결하는 경우에만 느립니다. 단일 작업으로 이들을 모두 연결 +하면 컴파일러가 컴파일러를로 변환하기 때문에 연산자가 전혀 느리지 않습니다 String.Concat(그러나 어리석은 이유로 String.Join보다 빠릅니다 String.Concat).
Thorarin

2
더 빠른 방법은 다음과 같습니다. public static string ToFirstLetterLower (string text) {var charArray = text.ToCharArray (); charArray [0] = char.ToLower (charArray [0]); 새 문자열을 반환 (charArray); }
Matteo Migliore 10

2
public static string ToLowerFirst(this string source) { if (string.IsNullOrWhiteSpace(source)) return source; var charArray = source.ToCharArray(); charArray[0] = char.ToLower(charArray[0]); return new string(charArray); } @MatteoMigliore의 의견에 따라 확장 프로그램을 사용했습니다 .
KregHEk

64

상황에 따라 약간의 방어 프로그래밍이 바람직 할 수 있습니다.

public static string FirstCharacterToLower(string str)
{
    if (String.IsNullOrEmpty(str) || Char.IsLower(str, 0))
        return str;

    return Char.ToLowerInvariant(str[0]) + str.Substring(1);
}

또한이 if명령문은 새 문자열이 변경되지 않을 경우 빌드되지 않도록합니다. 대신 null 입력에서 메소드가 실패하도록하고을 던질 수 ArgumentNullException있습니다.

사람들이 언급했듯이 String.Format이것을 사용 하는 것은 과잉입니다.


내가 틀렸다면 정정하십시오. str.Substring (1)은이 메소드의 카운트가 표시되지 않으므로 위치 1에서 기호를 리턴합니다. 그래서 당신은 소문자로 char [0] + 위치 1에서 숯을 가질 것입니다. 그래서 나는 문자열의 첫 번째 문자부터 시작하여 하나의 문자를 제거하는 것을 선호했습니다. 결과는 첫 글자가없는 문자열입니다. 그런 다음이 문자열을 소문자로 변환 된 첫 번째 문자에 추가합니다
페도 토브

3
@ B-Rain : 수정 된 것으로 간주 : msdn.microsoft.com/en-us/library/hxthx5h6%28VS.90%29.aspx
Thorarin

7

이 답변을 우연히 발견하는 사람에게 도움이되는 경우를 대비하여.

나는 이것이 확장 방법으로 가장 좋을 것이라고 생각한 다음 yourString.FirstCharacterToLower ();

public static class StringExtensions
{
    public static string FirstCharacterToLower(this string str)
    {
        if (String.IsNullOrEmpty(str) || Char.IsLower(str, 0))
        {
            return str;
        }

        return Char.ToLowerInvariant(str[0]) + str.Substring(1);
    }
}

3

광산은

if (!string.IsNullOrEmpty (val) && val.Length > 0)
{
    return val[0].ToString().ToLowerInvariant() + val.Remove (0,1);   
}

3
궁금해서 왜 val.Remove? 나에게는 약간의 직관이 아닌 것 같습니다.
Thorarin

@Thorarin은 분명히 첫 번째 문자를 제거하고 싶기 때문에 (소문자를 앞에 넣기 때문에)
Riki

2

나는 대답을 좋아하지만 검사 외에 약어를 다루는 경우 string.IsNullOrEmpty도 확인합니다 Char.IsLower(name[1]). 예를 들어 "AIDS"가 "aIDS"가되는 것을 원하지 않을 것입니다.


8
IMO 이것은 발신자의 책임입니다
11

1

C #을 남용하지 않고 내가 알고있는 가장 빠른 솔루션 :

public static string LowerCaseFirstLetter(string value)
{
    if (value?.Length > 0)
    {
        var letters = value.ToCharArray();
        letters[0] = char.ToLowerInvariant(letters[0]);
        return new string(letters);
    }
    return value;
}

0

몇 가지를 결합하여 연결 가능한 확장으로 만들었습니다. 공백 및 문자 이외의 단락이 추가되었습니다.

public static string FirstLower(this string input) => 
    (!string.IsNullOrWhiteSpace(input) && input.Length > 0 
        && char.IsLetter(input[0]) && !char.IsLower(input[0]))
    ? input[0].ToString().ToLowerInvariant() + input.Remove(0, 1) : input;

0

이것은 최신 구문과 올바른 유효성 검사를 사용하는 작은 확장 방법입니다.

public static class StringExtensions
{
    public static string FirstCharToLower(this string input)
    {
        switch (input)
        {
            case null: throw new ArgumentNullException(nameof(input));
            case "": throw new ArgumentException($"{nameof(input)} cannot be empty", nameof(input));
            default: return input.First().ToString().ToLower() + input.Substring(1);
        }
    }
}

1
예외를 던지는 것이 최선의 해결책인지 확실하지 않습니다. 문자열이 null이거나 비어있는 경우 null 또는 비어있는 문자열 만 반환하십시오.
R. de Veen

String이 null이거나 비어 있으면 소문자로 변경할 첫 번째 문자가 없으므로 작업이 의미가 없습니다.
Carlos Muñoz

0

이것을 사용하십시오 :

string newName= name[0].ToString().ToLower() + name.Substring(1);

-3

형식이 데이터를 변경하지 않으며 연결 만 원하는 경우 String.Concat보다 사용하는 것이 좋습니다 String.Format.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.