Bir dizeyi C # 'da telefon numarası olarak biçimlendirme


163

Ben bir dize var "1112224444 'bir telefon numarası. 111-222-4444 olarak bir dosyada saklamak önce biçimlendirmek istiyorum. Bir veri kaydı üzerinde ve yeni bir atamadan bunu yapabilmek tercih ederim değişken.

Düşünüyordum:

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

ama bu hile gibi görünmüyor.

** GÜNCELLEME **

Tamam. Bu çözümle gittim

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

Şimdi uzantı 4 basamaktan az olduğunda berbat oluyor. Sağdaki sayıları dolduracaktır. yani

1112224444 333  becomes

11-221-244 3334

Herhangi bir fikir?


5
Her yerde 10 haneli telefon numaralarının olmadığını veya 111-222-4444 biçimini kullanmadığını lütfen unutmayın.
Dour Yüksek Kemeri

Bu 0 ile başlayan telefon numaralarıyla başarısız olur
dano

Bunun yalnızca Kuzey Amerika sayıları olup olmadığını belirtmelisiniz.
Armstrongest

UYARI: Tüm mesaj dizisi ABD Kuzey Amerika telefon numaralarını varsayar. Uluslararası numaraları destekleyen bir kütüphane kullanın. nuget.org/packages/libphonenumber-csharp
Sean Anderson

Yanıtlar:


204

Bu yanıtın sayısal veri türleriyle (int, uzun) çalıştığını lütfen unutmayın. Bir dizeyle başlıyorsanız, önce bir sayıya dönüştürmeniz gerekir. Ayrıca, ilk dizenin en az 10 karakter uzunluğunda olduğunu doğrulamanız gerektiğini lütfen unutmayın.

Bir itibaren iyi sayfanın örnekleriyle doludur:

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

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

Normal ifade daha iyi çalışabilse de, eski programlama teklifini unutmayın:

Bazı insanlar bir sorunla karşılaştıklarında “Biliyorum, düzenli ifadeler kullanacağım” diye düşünüyorlar. Şu an iki problemleri var.
-Jamie Zawinski, comp.lang.emacs içinde


Ne olur, telefon numarasında sadece "800555" gibi birkaç basamak eksikse diyelim? orada sadece neyin var olduğunu göstermenin bir yolu var mı?
VoodooChild

11
Alan kodu 0105555555 veya bunun gibi bir şeyle başlıyorsa, bu kötü bir uygulamadır çünkü (010) 555-5555 yerine (01) 555-5555 geri dönersiniz. Bunun nedeni, telefon numarasını bir sayıya dönüştürürseniz, öndeki sıfırın hiçbir şey olmadığı görülüyor ve biçimlendirdiğinizde ilk 0 düşüyor.
Paul Mendoza

3
@Paul Lütfen sorun tanımını okuyun: "Bir dizem var" 1112224444 'bu bir telefon numarası. Bir dosyaya kaydetmeden önce 111-222-4444 olarak biçimlendirmek istiyorum "
Sean

39
Telefon numaranız bir dize ise, soruların belirttiği gibi, önce sayısal bir değere dönüştürmediğiniz sürece bu çalışmaz.
JustinStolle

4
Bunun yukarıdaki yorumu tekrarladığını biliyorum, ancak bu cevap soruya cevap vermedi. Bir dizeyi belirli bir biçimde, bu durumda bir telefon numarası biçiminde nasıl biçimlendirirsiniz.
dyslexicanaboko

168

Düzenli ifadeler kullanmayı tercih ederim:

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

4
Bunun işe yarayacağını düşünüyorum, ancak .ToString () biçiminin okunması daha kolaydır ve daha iyi performans göstermelidir.
Joel Coehoorn

14
Zaten bir dize ile uğraşıyorsam, posterin dediği gibi, onu uzun ve arkaya dökmek aptalca görünüyor.
Ryan Duffield

Belki de sonuçta buna ihtiyacım var. daha iyi işleyebilir
Brian G

5
Numarayı dize olarak tutmak için +1 (otomatik SMS sistemleri için kullanılan telefon numaralarının +44 biçiminde saklanması gerektiği göz önüne alındığında)
Ed James

3
Değişen biçimlerle çalışıyorum (örneğin (111) 222-4444, 111.222.4444, vb.), Ancak bunların (111) 222-4444'e normalize edilmesi gerekiyor. Ayrıca eksik sayılara karşı korumak istedim ve {n, m} gösterimini kullandım. (Ve biçimlendirme için özür dilerim, ancak bazı MD biçimleri benim için çalışmıyor). // 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

Alt dizelere ayırmanız gerekir. Bunu herhangi bir ekstra değişken olmadan yapabilseniz de, özellikle hoş olmazdı. İşte potansiyel bir çözüm:

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, üç alt dizenin string.format kullanmaktan daha iyi olduğundan emin misiniz?
Pradeep

Ben de String.format kullanmak - ama nasıl bir sonuç elde etmek için öneriyorlar olmadan String.format kullanarak?
Jon Skeet

2
Bunu bir if (phone.Length == 10)koşulda tamamladım .
Zack Peterson

Artı Bir - Bir küçük nokta: bu biçim alan kodu etrafında parantez var gibi görünmüyor, belki yanlış okuyorum.
Mark Rogers

1
@MarkRogers: Soru "111-222-4444 olarak biçimlendirmek istiyorum" diyor - orada parantez yok.
Jon Skeet

28

Bunu ABD numaraları için temiz bir çözüm olarak öneriyorum.

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
Bu, telefon değerinin NULL veya Whitespace olmadığından emin olmak için bir kontrol eklemek zorunda kaldım, benim için çalıştı.
Caverman

1
Bu denedim yukarıdaki tüm olanlar sonra benim için çalıştı
Eliotjse

22

Bildiğim kadarıyla bunu string ile yapamazsın. Biçim ... bunu kendin halletmek zorunda kalacaksın. Sayısal olmayan tüm karakterleri çıkarabilir ve sonra aşağıdakileri yapabilirsiniz:

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

Bu, verilerin doğru girildiğini varsayar ve bunu doğrulamak için düzenli ifadeler kullanabilirsiniz.


4
Ve bir kuzey amerikan telefon numarası varsayar
chris

19

Bu çalışmalı:

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

VEYA sizin durumunuzda:

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

3
01213456789 onun yapar (12) 345-6789 ... herhangi bir çözüm kullanıyorsam 1 küçük sorun ...?
Sangram Nandkhile

5
Bu en iyi çözümdür. Baştaki sıfır, sıfır veya bir ile başlayan Amerikan alan kodları olmadığından, Amerikan telefon numaraları açısından tartışmalıdır.
JB

12345678'i denediğimde küçük bir sorun (1) 234-5678 formatlar ... Ama ihtiyacım olan (123) 456-78. Bunun için herhangi bir çözüm var mı? Teşekkürler
Kavitha P.

14

A i["MyPhone"]olarak alabilirsiniz long, long.ToString()biçimlendirmek için yöntemi kullanabilirsiniz :

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

Sayısal Biçim Dizeleri'ndeki MSDN sayfasına bakın .

İnt: int taşabilir. Yerine uzun süre kullanmaya dikkat edin.


1
Bununla ilgili sorun, sayı> 10 karakter uzunluğundaysa (yani bir uzantı içeriyorsa). Bu , 212-555-1212 x1234'ün ortaya çıktığı çok garip bir temsil ile sonuçlanır2125551-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

giriş: 1234567890 çıkış: 123456 78 90 çalışmıyor
MC9000

5

Gerçek zamanlı olarak dönüştürülecek bir (ABD) telefon numarası arıyorsanız. Bu uzantıyı kullanmanızı öneririm. Bu yöntem, sayıları geriye doğru doldurmadan mükemmel çalışır. String.FormatÇözelti çalışma geriye doğru görünmektedir. Bu uzantıyı dizenize uygulamanız yeterlidir.

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

İleri hareket için mükemmel çalışır. Ancak geri döndüğünde, (###) öğesinin ilk biçiminde sıkışır.
Schwagmister

@Schwagmister İyi yakaladın. Bu düzeltildi ve genel kullanım için bir uzantıya kodu refactored var.
James Copeland

4

Bunu da deneyebilirsiniz:

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

Çıktı:

resim açıklamasını buraya girin


1
Farklı ülkelerin farklı biçim ve uzunluklarda telefon numaraları olduğunu ve kişilerin bunları giremeyeceğini unutmayın.
Neme

Html.DisplayFor (model => model.PhoneNumber) ile bunu nasıl kullanırım?
JustJohn

Bunu kullandım ve Razor Page ekranında nasıl kullanacağımı anladım. Sayfanın üst kısmındaki bir @functions {} bloğuna koydum. Sonra @ Html.DisplayFor yardımcısından kurtuldum ve sadece fonksiyona atıfta bulundum: ................. @GetFormattedPhoneNumber (Model.Courses_New.CurrentContactPhone) Günümü yaptı!
JustJohn

4

Kendinizi, alan kodu ile ana sayı bloğu (örn. Boşluklar, tire, nokta, vb.) Arasında her türlü ayırıcıyla telefon numaralarını girmeye çalıştığınız durumda bulabilirsiniz. üzerinde çalıştığınız girdiyi sterilize edebilmeniz için sayı olmayan tüm karakterlerin girişini ayırın. Bunu yapmanın en kolay yolu bir RegEx ifadesidir.

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

Daha sonra listelediğiniz cevap çoğu durumda işe yarayacaktır.

Uzantı sorununuzla ilgili sahip olduğunuz soruları yanıtlamak için, beklenen on uzunluktan (normal bir telefon numarası için) daha uzun olan her şeyi kaldırabilir ve sonuna kadar ekleyebilirsiniz.

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

Bunu yapmadan önce girişinizin uzunluğunun 10'dan büyük olup olmadığını belirlemek için 'if' kontrolü yapmak isteyeceksiniz, eğer yapmazsanız, sadece şunu kullanın:

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

Oy verildi ama ... Bu bir vb.net cevap ve soru c #

giriş: 1234567890 çıkış: (123) 456-789 Çalışmıyor!
MC9000

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

2

Bunu dene

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;

Şerefe.


2

Bölmek için Regex'te Eşleştir'i kullanın, ardından match.groups ile biçimlendirilmiş dize çıktısı alın

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

Aşağıdakiler, düzenli ifadelerin kullanımı ile çalışacaktır

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

Long.Parse kullanmazsak, string.format çalışmaz.


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

Çıktı: 001-568-895623


1

Lütfen C # http://www.beansoftware.com/NET-Tutorials/format-string-phone-number.aspx için aşağıdaki bağlantıyı kullanın

Biçimlendirmenin en kolay yolu Regex kullanmaktır.

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

Telefon numaranızı 2021231234 dize olarak 15 karaktere kadar geçirin.

FormatPhoneNumber(string phoneNum)

Başka bir yaklaşım Substring kullanmak olacaktır.

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

Uzantı sorununuzla ilgilenmek için aşağıdakiler nasıl yapılır:

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

0

Eski bir soruyu diriltmek için değil, bir kurulumdan biraz daha karmaşıksa, en azından biraz daha kolay bir yöntem önerebilirim.

Dolayısıyla, yeni bir özel biçimlendirici oluşturursak string.Format, telefon numaramızı bir biçime dönüştürmek zorunda kalmadan daha basit biçimlendirmeyi kullanabiliriz.long

Öncelikle özel biçimlendiriciyi oluşturalım:

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

O zaman bunu kullanmak istiyorsanız, şu şeyi yaparsınız:

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

Düşünülmesi gereken başka şeyler:

Şu anda biçimlendirmek için bir dize yaptığınızdan daha uzun bir biçimlendirici belirttiyseniz, ek # işaretlerini yoksayar. Örneğin buString.Format(new NumericStringFormatter(),"{0:###-###-####}", "12345"); 123-45 ile sonuçlanacaktır, bu yüzden yapıcıda bir tür olası dolgu karakteri almasını isteyebilirsiniz.

Ayrıca ben bir # işaret kaçmak için bir yol vermedi böylece çıkış dizesine eklemek istiyorsanız şu anda olduğu gibi mümkün olmazdı.

Bu yöntemi Regex'e tercih etmemin nedeni, kullanıcıların formatı kendileri belirtmelerine izin vermek için sıklıkla gereksinimlerim olması ve bu formatın nasıl kullanılacağını açıklamamın bir kullanıcı normal ifadesini öğretmeye çalışmaktan çok daha kolay olmasıdır.

Ayrıca, sınıf adı biraz yanlış adlandırmadır, çünkü aslında herhangi bir dizeyi aynı sırada tutmak ve içine karakterler enjekte etmek istediğiniz sürece biçimlendirmeye çalışır.


0

Hedef numaranız 0 ile başlıyorsa {0: (000) 000 - ####} deneyebilirsiniz.


0

İşte bunu yapmanın başka bir yolu.

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;
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.