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.