C #에서 문자열을 전화 번호로 형식화하는 방법


163

"1112224444"라는 문자열이 있는데 전화 번호입니다. 파일에 저장하기 전에 111-222-4444로 형식을 지정하려고합니다. 데이터 레코드에 있으며 새 것을 할당하지 않고도이 작업을 수행 할 수 있습니다. 변하기 쉬운.

나는 생각하고 있었다 :

String.Format("{0:###-###-####}", i["MyPhone"].ToString() );

그러나 그것은 트릭을하지 않는 것 같습니다.

** 업데이트 **

확인. 이 솔루션과 함께 갔다

Convert.ToInt64(i["Customer Phone"]).ToString("###-###-#### ####")

이제 확장명이 4 자리 미만이면 엉망이됩니다. 오른쪽에서 숫자를 채 웁니다. 그래서

1112224444 333  becomes

11-221-244 3334

어떤 아이디어?


5
전화 번호가 10 자리이거나 111-222-4444 형식을 사용하는 곳은 없습니다.
— Dour High Arch

전화 번호가 0 (으)로 시작하면 실패합니다
— dano

이것이 북미 번호인지 아닌지를 지정해야합니다.
— Armstrongest

경고 : 전체 스레드는 미국 북미 전화 번호를 가정합니다. 국제 전화 번호를 지원하는 라이브러리를 사용하십시오. nuget.org/packages/libphonenumber-csharp
— Sean Anderson

답변:


204

이 답변은 숫자 데이터 유형 (int, long)에서 작동합니다. 문자열로 시작하는 경우 먼저 숫자로 변환해야합니다. 또한 초기 문자열 길이가 10 자 이상인지 확인해야합니다.

예제로 가득 찬 좋은 페이지 에서 :

String.Format("{0:(###) ###-####}", 8005551212);

    This will output "(800) 555-1212".

정규식이 더 잘 작동 할 수 있지만 이전 프로그래밍 인용문을 명심하십시오.

어떤 사람들은 문제에 직면했을 때“정규 표현을 사용할 것입니다.”라고 생각합니다. 이제 두 가지 문제가 있습니다.
comp.lang.emacs의 --Jamie Zawinski


전화 번호에 "800555"와 같이 몇 자리수가없는 경우 어떻게됩니까? 존재하는 것만 표시하는 방법이 있습니까?
— 부두교 어린이

11
지역 코드가 0105555555 또는 이와 유사한 것으로 시작하면 (010) 555-5555 대신 (01) 555-5555로 돌아 가기 때문에 나쁜 구현입니다. 그 이유는 전화 번호를 숫자로 변환하면 앞의 0이 아무것도 아닌 것으로 보이며 서식을 지정할 때 첫 번째 0이 삭제되기 때문입니다.
— Paul Mendoza

3
@Paul 문제 정의를 읽으십시오 : "문자열"1112224444 '가 있습니다. 전화 번호입니다. 파일로 저장하기 전에 111-222-4444로 포맷하고 싶습니다. "
— Sean

39
전화 번호가 문자열 인 경우 질문에 나와 있듯이 먼저 숫자로 변환하지 않으면 작동하지 않습니다.
— JustinStolle

4
나는 이것이 위의 의견을 반복한다는 것을 알고 있지만이 답변은 질문에 대답하지 않았습니다. 문자열을 특정 형식 (이 경우 전화 번호 형식)으로 형식화하는 방법
— dyslexicanaboko 2016 년

168

정규식을 선호합니다.

Regex.Replace("1112224444", @"(\d{3})(\d{3})(\d{4})", "$1-$2-$3");

4
이것이 효과가 있다고 생각하지만 .ToString () 형식이 읽기 쉽고 성능이 좋아야합니다.
— Joel Coehoorn 18

14
포스터가 말했듯이 이미 끈을 다루고 있다면 길게 길게 캐스팅하면 어리석은 것처럼 보입니다.
— Ryan Duffield

어쩌면 이것이 결국 필요한 것입니다. 확장을 더 잘 처리 할 수 ​​있습니다
— Brian G

5
번호를 문자열로 유지하기위한 +1 (자동 SMS 시스템에 사용되는 전화 번호는 +44 형식으로 저장되어야 함)
— Ed James

3
다양한 형식 (예 : (111) 222-4444, 111.222.4444 등)으로 작업하고 있지만 (111) 222-4444로 정규화해야합니다. 또한 불완전한 숫자로부터 보호하고 싶었고 {n, m} 표기법을 사용했습니다. (포맷에 대한 사과하지만 일부 MD 형식은 작동하지 않습니다). // Remove non-digit characters var phoneDigits = Regex.Replace(crewMember.CellPhone, "[^\\d]", string.Empty); // Format the digits var phone = Regex.Replace(phoneDigits, @"(\d{1,3})(\d{0,3})(\d{0,4})", " ($1) $2-$3");
— Craig Boland

47

하위 문자열로 분리해야합니다. 추가 변수없이 그렇게 할 수 는 있지만 특히 좋지는 않습니다. 하나의 가능한 해결책은 다음과 같습니다.

string phone = i["MyPhone"].ToString();
string area = phone.Substring(0, 3);
string major = phone.Substring(3, 3);
string minor = phone.Substring(6);
string formatted = string.Format("{0}-{1}-{2}", area, major, minor);

Jon 세 개의 하위 문자열을 만드는 것이 string.format을 사용하는 것보다 낫습니까?
— Pradeep

String.Format도 사용하지만 String.Format 을 사용 하지 않고 결과를 얻으려면 어떻게 제안 합니까?
— Jon Skeet

2
나는 그것을 if (phone.Length == 10)조건으로 감쌌다 .
— 잭 피터슨

플러스 하나-하나의 작은 점 : 그 형식은 지역 코드 주위에 괄호가있는 것처럼 보이지 않습니다. 아마도 잘못 읽었습니다.
— Mark Rogers

1
@MarkRogers : "111-222-4444로 서식을 지정하고 싶습니다"라는 질문이 있습니다. 괄호가 없습니다.
— Jon Skeet

28

나는 이것을 미국 번호에 대한 깨끗한 해결책으로 제안합니다.

public static string PhoneNumber(string value)
{ 
    if (string.IsNullOrEmpty(value)) return string.Empty;
    value = new System.Text.RegularExpressions.Regex(@"\D")
        .Replace(value, string.Empty);
    value = value.TrimStart('1');
    if (value.Length == 7)
        return Convert.ToInt64(value).ToString("###-####");
    if (value.Length == 10)
        return Convert.ToInt64(value).ToString("###-###-####");
    if (value.Length > 10)
        return Convert.ToInt64(value)
            .ToString("###-###-#### " + new String('#', (value.Length - 10)));
    return value;
}

1
전화 값이 NULL 또는 공백이 아닌지 확인하기 위해 검사를 추가해야한다는 점을 제외하고는 나를 위해 일했습니다.
— Caverman

1
이것은 내가 시도 위의 것들 결국 나를 위해 일한
— Eliotjse

22

내가 아는 한 string.Format 으로이 작업을 수행 할 수는 없습니다.이를 직접 처리해야합니다. 숫자가 아닌 문자를 모두 제거한 다음 다음과 같이 할 수 있습니다.

string.Format("({0}) {1}-{2}",
     phoneNumber.Substring(0, 3),
     phoneNumber.Substring(3, 3),
     phoneNumber.Substring(6));

데이터가 올바르게 입력되었다고 가정하고 정규식을 사용하여 유효성을 검사 할 수 있습니다.


4
그리고 그것은 북미 전화 번호를 가정합니다
— chris

19

이것은 작동해야합니다 :

String.Format("{0:(###)###-####}", Convert.ToInt64("1112224444"));

또는 귀하의 경우 :

String.Format("{0:###-###-####}", Convert.ToInt64("1112224444"));

3
01213456789를 사용하면 작은 문제가 발생합니다 (12) 345-6789 ... 어떤 해결책입니까?
— Sangram Nandkhile

5
이것이 가장 좋은 해결책입니다. 0 또는 1로 시작하는 미국 지역 코드가 없기 때문에 미국 전화 번호와 관련하여 선행 0은 약점입니다.
— JB

12345678을 시도하면 작은 문제입니다. (1) 234-5678 ...하지만 필요한 것은 (123) 456-78입니다. 이에 대한 해결책이 있습니까? 감사합니다
— Kavitha P.

14

당신이 얻을 수있는 경우 i["MyPhone"]A와 long, 당신은 사용할 수있는 long.ToString()포맷하는 방법 :

Convert.ToLong(i["MyPhone"]).ToString("###-###-####");

숫자 형식 문자열 에 대한 MSDN 페이지를 참조하십시오 .

int보다는 long을 사용하도록주의하십시오 : int가 오버플로 될 수 있습니다.


1
이 문제는 숫자가 10자를 초과하는 경우 (즉, 확장명 포함)입니다. 이는 212-555-1212 x1234가 다음과 같이 나오는 매우 이상한 표현입니다.2125551-212-1234.
— Michael Blackburn

5
static string FormatPhoneNumber( string phoneNumber ) {

   if ( String.IsNullOrEmpty(phoneNumber) )
      return phoneNumber;

   Regex phoneParser = null;
   string format     = "";

   switch( phoneNumber.Length ) {

      case 5 :
         phoneParser = new Regex(@"(\d{3})(\d{2})");
         format      = "$1 $2";
       break;

      case 6 :
         phoneParser = new Regex(@"(\d{2})(\d{2})(\d{2})");
         format      = "$1 $2 $3";
       break;

      case 7 :
         phoneParser = new Regex(@"(\d{3})(\d{2})(\d{2})");
         format      = "$1 $2 $3";
       break;

      case 8 :
         phoneParser = new Regex(@"(\d{4})(\d{2})(\d{2})");
         format      = "$1 $2 $3";
       break;

      case 9 :
         phoneParser = new Regex(@"(\d{4})(\d{3})(\d{2})(\d{2})");
         format      = "$1 $2 $3 $4";
       break;

      case 10 :
         phoneParser = new Regex(@"(\d{3})(\d{3})(\d{2})(\d{2})");
         format      = "$1 $2 $3 $4";
       break;

      case 11 :
         phoneParser = new Regex(@"(\d{4})(\d{3})(\d{2})(\d{2})");
         format      = "$1 $2 $3 $4";
       break;

      default:
        return phoneNumber;

   }//switch

   return phoneParser.Replace( phoneNumber, format );

}//FormatPhoneNumber

    enter code here

입력 : 1234567890 출력 : 123456 78 90이 작동하지 않음
— MC9000

5

실시간으로 변환 할 (미국) 전화 번호를 찾고있는 경우 이 확장 프로그램을 사용하는 것이 좋습니다. 이 방법은 숫자를 거꾸로 채우지 않고 완벽하게 작동합니다. String.Format솔루션은 작업 뒤쪽에 나타납니다. 이 확장을 문자열에 적용하십시오.

public static string PhoneNumberFormatter(this string value)
{
    value = new Regex(@"\D").Replace(value, string.Empty);
    value = value.TrimStart('1');

    if (value.Length == 0)
        value = string.Empty;
    else if (value.Length < 3)
        value = string.Format("({0})", value.Substring(0, value.Length));
    else if (value.Length < 7)
        value = string.Format("({0}) {1}", value.Substring(0, 3), value.Substring(3, value.Length - 3));
    else if (value.Length < 11)
        value = string.Format("({0}) {1}-{2}", value.Substring(0, 3), value.Substring(3, 3), value.Substring(6));
    else if (value.Length > 10)
    {
        value = value.Remove(value.Length - 1, 1);
        value = string.Format("({0}) {1}-{2}", value.Substring(0, 3), value.Substring(3, 3), value.Substring(6));
    }
    return value;
}

전진 운동에 적합합니다. 그러나 돌아올 때 (###)의 첫 번째 형식이 고착됩니다.
— Schwagmister

@Schwagmister 잘 잡았습니다. 이것은 수정되었으며 일반적인 용도로 코드를 확장으로 리팩토링했습니다.
— James Copeland

4

당신은 또한 이것을 시도 할 수 있습니다 :

  public string GetFormattedPhoneNumber(string phone)
        {
            if (phone != null && phone.Trim().Length == 10)
                return string.Format("({0}) {1}-{2}", phone.Substring(0, 3), phone.Substring(3, 3), phone.Substring(6, 4));
                return phone;
        }

산출:

여기에 이미지 설명을 입력하십시오


1
국가마다 전화 번호의 형식과 길이가 다르므로 사람들은 전화 번호를 입력 할 수 없습니다.
— Neme

Html.DisplayFor (model => model.PhoneNumber)과 함께 이것을 어떻게 사용합니까?
— JustJohn

나는 이것을 사용하고 Razor Page 디스플레이에서 그것을 사용하는 방법을 알아 냈습니다. 페이지 상단의 @functions {} 블록에 넣었습니다. 그런 다음 @ Html.DisplayFor 도우미를 제거하고 방금 함수를 참조했습니다. ........ @GetFormattedPhoneNumber (Model.Courses_New.CurrentContactPhone)
— JustJohn

4

지역 번호와 기본 번호 블록 (예 : 공백, 대시, 마침표 등) 사이에 모든 종류의 구분 기호가있는 전화 번호를 입력하려고하는 상황에 처할 수 있습니다. 숫자가 아닌 모든 문자의 입력을 제거하여 작업중인 입력을 멸균 할 수 있습니다. 가장 쉬운 방법은 RegEx 표현식을 사용하는 것입니다.

string formattedPhoneNumber = new System.Text.RegularExpressions.Regex(@"\D")
    .Replace(originalPhoneNumber, string.Empty);

그런 다음 나열된 답변이 대부분의 경우 효과가 있습니다.

내선 번호 문제에 대한 답변을 얻으려면, 예상 길이가 10보다 긴 것을 (일반 전화 번호의 경우) 벗겨서 다음을 사용하여 끝에 추가하십시오

formattedPhoneNumber = Convert.ToInt64(formattedPhoneNumber)
     .ToString("###-###-#### " + new String('#', (value.Length - 10)));

이 작업을 수행하기 전에 입력 길이가 10보다 큰지 확인하려면 'if'검사를 수행하고 싶지 않은 경우 다음을 사용하십시오.

formattedPhoneNumber = Convert.ToInt64(value).ToString("###-###-####");

3
Function FormatPhoneNumber(ByVal myNumber As String)
    Dim mynewNumber As String
    mynewNumber = ""
    myNumber = myNumber.Replace("(", "").Replace(")", "").Replace("-", "")
    If myNumber.Length < 10 Then
        mynewNumber = myNumber
    ElseIf myNumber.Length = 10 Then
        mynewNumber = "(" & myNumber.Substring(0, 3) & ") " &
                myNumber.Substring(3, 3) & "-" & myNumber.Substring(6, 3)
    ElseIf myNumber.Length > 10 Then
        mynewNumber = "(" & myNumber.Substring(0, 3) & ") " &
                myNumber.Substring(3, 3) & "-" & myNumber.Substring(6, 3) & " " &
                myNumber.Substring(10)
    End If
    Return mynewNumber
End Function

투표했지만 ... 이것은 vb.net 답변이며 질문은 C #입니다.

입력 : 1234567890 출력 : (123) 456-789 작동하지 않습니다!
— MC9000

3
        string phoneNum;
        string phoneFormat = "0#-###-###-####";
        phoneNum = Convert.ToInt64("011234567891").ToString(phoneFormat);

2

이 시도

string result;
if ( (!string.IsNullOrEmpty(phoneNumber)) && (phoneNumber.Length >= 10 ) )
    result = string.Format("{0:(###)###-"+new string('#',phoneNumber.Length-6)+"}",
    Convert.ToInt64(phoneNumber)
    );
else
    result = phoneNumber;
return result;

건배.


2

정규식에서 일치를 사용하여 분할 한 다음 일치하는 형식의 문자열을 출력하십시오.

Regex regex = new Regex(@"(?<first3chr>\d{3})(?<next3chr>\d{3})(?<next4chr>\d{4})");
Match match = regex.Match(phone);
if (match.Success) return "(" + match.Groups["first3chr"].ToString() + ")" + " " + 
  match.Groups["next3chr"].ToString() + "-" + match.Groups["next4chr"].ToString();

2

다음은 정규 표현식을 사용하지 않고 작동합니다.

string primaryContactNumber = !string.IsNullOrEmpty(formData.Profile.Phone) ? String.Format("{0:###-###-####}", long.Parse(formData.Profile.Phone)) : "";

long.Parse를 사용하지 않으면 string.format이 작동하지 않습니다.


1
public string phoneformat(string phnumber)
{
String phone=phnumber;
string countrycode = phone.Substring(0, 3); 
string Areacode = phone.Substring(3, 3); 
string number = phone.Substring(6,phone.Length); 

phnumber="("+countrycode+")" +Areacode+"-" +number ;

return phnumber;
}

출력은 : 001-568-895623입니다.


1

C # http://www.beansoftware.com/NET-Tutorials/format-string-phone-number.aspx에 다음 링크를 사용 하십시오.

형식을 만드는 가장 쉬운 방법은 Regex를 사용하는 것입니다.

private string FormatPhoneNumber(string phoneNum)
{
  string phoneFormat = "(###) ###-#### x####";

  Regex regexObj = new Regex(@"[^\d]");
  phoneNum = regexObj.Replace(phoneNum, "");
  if (phoneNum.Length > 0)
  {
    phoneNum = Convert.ToInt64(phoneNum).ToString(phoneFormat);
  }
  return phoneNum;
}

phoneNum을 문자열 2021231234로 최대 15 자까지 전달하십시오.

FormatPhoneNumber(string phoneNum)

또 다른 방법은 하위 문자열을 사용하는 것입니다

private string PhoneFormat(string phoneNum)
    {
      int max = 15, min = 10;
      string areaCode = phoneNum.Substring(0, 3);
      string mid = phoneNum.Substring(3, 3);
      string lastFour = phoneNum.Substring(6, 4);
      string extension = phoneNum.Substring(10, phoneNum.Length - min);
      if (phoneNum.Length == min)
      {
        return $"({areaCode}) {mid}-{lastFour}";
      }
      else if (phoneNum.Length > min && phoneNum.Length <= max)
      {
        return $"({areaCode}) {mid}-{lastFour} x{extension}";
      }
      return phoneNum;
    }

0

확장 문제를 해결하려면 다음을 수행하십시오.

string formatString = "###-###-#### ####";
returnValue = Convert.ToInt64(phoneNumber)
                     .ToString(formatString.Substring(0,phoneNumber.Length+3))
                     .Trim();

0

오래된 질문을 부활 시키지는 않지만 설정이 조금 더 복잡하다면 적어도 사용하기 쉬운 방법을 제공 할 수 있다고 생각했습니다.

따라서 새로운 사용자 정의 포맷터를 만들면 string.Format전화 번호를 A로 변환하지 않고도 보다 간단한 형식을 사용할 수 있습니다long

먼저 사용자 정의 포맷터를 만들어 보겠습니다.

using System;
using System.Globalization;
using System.Text;

namespace System
{
    /// <summary>
    ///     A formatter that will apply a format to a string of numeric values.
    /// </summary>
    /// <example>
    ///     The following example converts a string of numbers and inserts dashes between them.
    ///     <code>
    /// public class Example
    /// {
    ///      public static void Main()
    ///      {          
    ///          string stringValue = "123456789";
    ///  
    ///          Console.WriteLine(String.Format(new NumericStringFormatter(),
    ///                                          "{0} (formatted: {0:###-##-####})",stringValue));
    ///      }
    ///  }
    ///  //  The example displays the following output:
    ///  //      123456789 (formatted: 123-45-6789)
    ///  </code>
    /// </example>
    public class NumericStringFormatter : IFormatProvider, ICustomFormatter
    {
        /// <summary>
        ///     Converts the value of a specified object to an equivalent string representation using specified format and
        ///     culture-specific formatting information.
        /// </summary>
        /// <param name="format">A format string containing formatting specifications.</param>
        /// <param name="arg">An object to format.</param>
        /// <param name="formatProvider">An object that supplies format information about the current instance.</param>
        /// <returns>
        ///     The string representation of the value of <paramref name="arg" />, formatted as specified by
        ///     <paramref name="format" /> and <paramref name="formatProvider" />.
        /// </returns>
        /// <exception cref="System.NotImplementedException"></exception>
        public string Format(string format, object arg, IFormatProvider formatProvider)
        {
            var strArg = arg as string;

            //  If the arg is not a string then determine if it can be handled by another formatter
            if (strArg == null)
            {
                try
                {
                    return HandleOtherFormats(format, arg);
                }
                catch (FormatException e)
                {
                    throw new FormatException(string.Format("The format of '{0}' is invalid.", format), e);
                }
            }

            // If the format is not set then determine if it can be handled by another formatter
            if (string.IsNullOrEmpty(format))
            {
                try
                {
                    return HandleOtherFormats(format, arg);
                }
                catch (FormatException e)
                {
                    throw new FormatException(string.Format("The format of '{0}' is invalid.", format), e);
                }
            }
            var sb = new StringBuilder();
            var i = 0;

            foreach (var c in format)
            {
                if (c == '#')
                {
                    if (i < strArg.Length)
                    {
                        sb.Append(strArg[i]);
                    }
                    i++;
                }
                else
                {
                    sb.Append(c);
                }
            }

            return sb.ToString();
        }

        /// <summary>
        ///     Returns an object that provides formatting services for the specified type.
        /// </summary>
        /// <param name="formatType">An object that specifies the type of format object to return.</param>
        /// <returns>
        ///     An instance of the object specified by <paramref name="formatType" />, if the
        ///     <see cref="T:System.IFormatProvider" /> implementation can supply that type of object; otherwise, null.
        /// </returns>
        public object GetFormat(Type formatType)
        {
            // Determine whether custom formatting object is requested. 
            return formatType == typeof(ICustomFormatter) ? this : null;
        }

        private string HandleOtherFormats(string format, object arg)
        {
            if (arg is IFormattable)
                return ((IFormattable)arg).ToString(format, CultureInfo.CurrentCulture);
            else if (arg != null)
                return arg.ToString();
            else
                return string.Empty;
        }
    }
}

따라서 이것을 사용하려면 다음과 같이하십시오.

String.Format(new NumericStringFormatter(),"{0:###-###-####}", i["MyPhone"].ToString());

고려해야 할 다른 것들 :

서식을 지정하기 위해 문자열을 수행하는 것보다 더 긴 포맷터를 지정한 경우 추가 # 기호는 무시됩니다. 예를 들어 String.Format(new NumericStringFormatter(),"{0:###-###-####}", "12345");123-45가 발생하므로 생성자에서 필러 문자를 사용할 수 있습니다.

또한 # 기호를 이스케이프하는 방법을 제공하지 않았으므로 출력 문자열에 포함하려는 경우 현재와 같은 방식으로 사용할 수 없습니다.

내가 정규식 보다이 방법을 선호하는 이유는 종종 사용자가 형식을 직접 지정할 수 있도록 요구하기 때문에 사용자 정규식을 가르치는 것 보다이 형식을 사용하는 방법을 설명하는 것이 훨씬 쉽습니다.

또한 클래스 이름은 문자열을 동일한 순서로 유지하고 그 안에 문자를 삽입하려는 한 실제로 문자열을 형식화하기 때문에 약간의 오해입니다.


0

대상 번호가 0으로 시작하면 {0 : (000) 000-####}을 시도 할 수 있습니다.


0

여기 또 다른 방법이 있습니다.

public string formatPhoneNumber(string _phoneNum)
{
    string phoneNum = _phoneNum;
    if (phoneNum == null)
        phoneNum = "";
    phoneNum = phoneNum.PadRight(10 - phoneNum.Length);
    phoneNum = phoneNum.Insert(0, "(").Insert(4,") ").Insert(9,"-");
    return phoneNum;
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.