HOWTO · Csharp

C#에서 문자열을 전화번호로 형식 지정

이 문서에서는 C#에서 문자열 형식을 전화번호로 지정하는 방법을 설명합니다.

이 페이지의 내용

전화번호를 어떤 방식으로 형식화할지는 입력이 무엇을 나타내는지에 따라 달라집니다. 번호가 하나의 문자열에 들어 있다면 사용자 지정 포맷터로 구분 기호를 제거하고 표시 패턴을 적용할 수 있습니다. 지역 번호와 나머지 번호 부분이 이미 분리되어 있다면 String.Format 또는 문자열 보간으로 이 값들을 조합할 수 있습니다. 이 두 방법은 임의의 전화번호 문자열을 파싱하거나 유효한 번호인지 확인하지 않습니다.

C# 전화번호 형식화 방법 선택

입력이 하나의 문자열이고 표시하기 전에 문장 부호를 정리하려면 사용자 지정 메서드를 사용합니다. 아래 예제는 기본 패턴 (##) ###-####을 사용해 숫자 아홉 자리를 두 자리, 세 자리, 네 자리로 나눕니다. 애플리케이션에 필요한 번호 표기 관례에 맞춰 패턴을 바꾸세요. 이 패턴은 표시 형식일 뿐, 보편적인 전화번호 표준이 아닙니다.

번호가 지역 번호와 두 개의 지역 내 번호 부분으로 이미 나뉘어 있다면 String.Format 또는 문자열 보간으로 값을 문자열에 배치하세요. 이 방법들은 전달된 각 부분을 그대로 사용하며, 값을 어떻게 나누거나 정리할지 판단하지 않습니다. 어느 방법도 국가 번호나 내선 번호, 또는 만들어진 번호로 실제 통화할 수 있는지를 검증하지 않습니다.

사용자 지정 메서드로 C# 문자열을 전화번호 형식으로 변환

formatPhNumber() 메서드는 입력 문자열과 필수 형식 인수를 받습니다. 기본 패턴 (##) ###-####을 사용하려면 string.Empty 또는 null을 전달하고, 다른 표시 패턴을 선택하려면 .NET 사용자 지정 숫자 형식 문자열을 전달합니다. 메서드는 형식을 적용하기 전에 ASCII 숫자가 아닌 문자를 제거합니다. 입력에 ASCII 숫자가 하나도 없으면 빈 문자열을 반환합니다.

전체 구현은 마지막 섹션에 있습니다. 핵심 작업은 Regex.Replace(phoneNum ?? "", @"[^0-9]", string.Empty)와 Convert.ToInt64(digits).ToString(phoneFormat)입니다. 형식 인수를 전달하면 정리 단계는 그대로 두고 표시 패턴을 바꿀 수 있습니다. 이 메서드는 고정 길이의 번호 표시 관례에는 유용하지만, 국제 전화번호를 일반적으로 파싱하는 용도에는 적합하지 않습니다.

String.Format으로 전화번호 부분 조합

String.Format("({0}) {1}-{2}", areaCode, firstPart, secondPart)는 이미 존재하는 세 문자열을 지정된 위치에 배치합니다. 예를 들어 첫 번째 인수는 {0}, 두 번째 인수는 {1}, 세 번째 인수는 {2}를 채웁니다. 애플리케이션의 다른 부분에서 이 구성 요소를 이미 파싱했거나 수집한 경우에 적합합니다.

자리 표시자는 텍스트를 배열할 뿐, 문장 부호를 제거하거나 구성 요소의 경계를 추론하거나 길이를 검증하지 않습니다. 애플리케이션에서 특정 형식이 필요하다면 각 부분을 별도로 검증하세요. 여기서 사용하는 API 이름은 String.Format입니다. 이 API는 System.String을 통해 사용할 수 있으며 C# 코드에서는 흔히 string.Format으로 호출합니다.

문자열 보간으로 전화번호 부분 조합

문자열 보간을 사용하면 같은 조합을 바로 표현할 수 있습니다. $"({areaCode}) {firstPart}-{secondPart}"처럼 작성하면 중괄호 안의 식이 주변 문자열에 삽입됩니다. 각 부분이 이미 이름이 있는 변수라면 간결하게 쓸 수 있으며, 적용 범위는 String.Format와 같습니다. 즉, 값을 조합할 뿐 완성된 전화번호 문자열을 파싱하거나 검증하지는 않습니다.

주변 코드에서 더 읽기 쉬운 쪽을 기준으로 문자열 보간과 String.Format 중에서 선택하세요. 어느 방법도 입력 값을 바꾸거나 전화번호 규칙을 자동으로 적용하지 않습니다.

사용자 지정 포맷터의 한계

사용자 지정 포맷터는 입력을 표시할 숫자로 취급합니다. 정리한 숫자를 long으로 변환해 숫자로 파싱하므로 앞에 오는 0은 변환 전에 사라져 보존되지 않습니다. Int64가 담을 수 있는 자릿수보다 숫자가 많으면 Convert.ToInt64가 OverflowException을 발생시킵니다. 또한 요청한 형식이 숫자 형식화에 유효하다고 가정하므로, 적합하지 않은 형식은 예상 밖의 결과를 내거나 실패할 수 있습니다.

앞자리 0이 중요하거나 번호 길이가 다를 수 있거나 숫자가 Int64 범위를 넘을 수 있는 전화번호라면 숫자를 정수로 변환하지 마세요. 숫자를 텍스트로 유지하고 명시적으로 선택한 길이와 번호 규칙에 따라 구분 기호를 넣거나, 여러 지역의 번호를 파싱하고 검증해야 한다면 전화번호 라이브러리를 사용하세요. 변환 오류를 처리하면 애플리케이션의 충돌을 막을 수는 있지만, 인식되지 않는 번호가 유효해지는 것은 아닙니다.

C# 전체 예제와 출력

일반적인 아홉 자리 입력으로 이 예제를 실행합니다. 입력에서 숫자가 아닌 구분 기호를 제거한 뒤 기본 표시 패턴을 적용합니다.

이 섹션의 코드와 표시되는 레이블 또는 출력은 영어로 유지됩니다.

using System;
using System.Text.RegularExpressions;

class PhoneFormatter
{
    public static string formatPhNumber(string phoneNum, string phoneFormat)
    {
        if (phoneFormat == null || phoneFormat.Length == 0)
        {
            phoneFormat = "(##) ###-####";
        }

        string digits = Regex.Replace(phoneNum ?? "", @"[^0-9]", "");
        if (digits.Length == 0)
        {
            return "";
        }

        return Convert.ToInt64(digits).ToString(phoneFormat);
    }

    static void Main()
    {
        string phoneNumber = "123456789";
        Console.WriteLine(formatPhNumber(phoneNumber, null));
    }
}
(12) 345-6789