วิธีการจัดรูปแบบสตริงเป็นหมายเลขโทรศัพท์ใน C #


163

ฉันมีสตริง "1112224444" เป็นหมายเลขโทรศัพท์ฉันต้องการจัดรูปแบบเป็น 111-222-4444 ก่อนที่ฉันจะเก็บไว้ในไฟล์มันอยู่ใน datarecord และฉันต้องการทำสิ่งนี้โดยไม่ต้องกำหนดหมายเลขใหม่ ตัวแปร.

ผมคิดว่า:

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

คุณควรระบุว่านี่เป็นตัวเลขในอเมริกาเหนือเท่านั้นหรือไม่
อาร์มสตรอง

คำเตือน: เธรดทั้งหมดถือว่าหมายเลขโทรศัพท์ของสหรัฐอเมริกาในอเมริกาเหนือ ใช้ห้องสมุดที่รองรับหมายเลขระหว่างประเทศ nuget.org/packages/libphonenumber-csharp
Sean Anderson

คำตอบ:


204

โปรดทราบว่าคำตอบนี้ใช้ได้กับประเภทข้อมูลตัวเลข (int, long) หากคุณเริ่มต้นด้วยสตริงคุณจะต้องแปลงเป็นตัวเลขก่อน นอกจากนี้โปรดคำนึงถึงว่าคุณจะต้องตรวจสอบว่าสตริงเริ่มต้นมีความยาวอย่างน้อย 10 ตัวอักษร

จากหน้าดีที่เต็มไปด้วยตัวอย่าง:

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

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

แม้ว่า regex อาจทำงานได้ดีขึ้นโปรดระลึกถึงการเขียนโปรแกรมเก่า:

บางคนเมื่อต้องเผชิญกับปัญหาคิดว่า“ ฉันรู้ว่าฉันจะใช้การแสดงออกปกติ” ตอนนี้พวกเขามีสองปัญหา
--Jamie Zawinski ใน comp.lang.emacs


จะเกิดอะไรขึ้นสมมติว่าหมายเลขโทรศัพท์ไม่มีตัวเลขสองสามหลักเช่น "800555" เท่านั้น มีวิธีแสดงเฉพาะสิ่งที่มีอยู่หรือไม่
VoodooChild

11
นี่เป็นการใช้งานที่ไม่ดีเพราะถ้ารหัสพื้นที่เริ่มต้นด้วย 0105555555 หรืออะไรทำนองนั้นคุณก็จะได้รับกลับมา (01) 555-5555 แทน (010) 555-5555 เหตุผลก็คือว่าถ้าคุณแปลงหมายเลขโทรศัพท์เป็นตัวเลขดังนั้นศูนย์ที่ด้านหน้าจะเห็นว่าไม่ได้เป็นอะไรและเมื่อคุณจัดรูปแบบเลข 0 ตัวแรกจะลดลง
Paul Mendoza

3
@Paul โปรดอ่านคำจำกัดความปัญหา: "ฉันมีสตริง" 1112224444 'เป็นหมายเลขโทรศัพท์ ฉันต้องการจัดรูปแบบเป็น 111-222-4444 ก่อนที่จะจัดเก็บในไฟล์ ".
Sean

39
สิ่งนี้จะไม่ทำงานหากหมายเลขโทรศัพท์ของคุณเป็นสตริงตามสถานะคำถามเว้นแต่ว่าคุณจะแปลงเป็นค่าตัวเลขก่อน
JustinStolle

4
ฉันรู้ว่านี่เป็นเพียงการทำซ้ำความคิดเห็นข้างต้น แต่คำตอบนี้ไม่ได้ตอบคำถาม คุณจัดรูปแบบสตริงในรูปแบบเฉพาะได้อย่างไรในกรณีนี้รูปแบบหมายเลขโทรศัพท์
dyslexicanaboko

168

ฉันชอบที่จะใช้การแสดงออกปกติ:

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

4
ฉันคิดว่ามันจะใช้งานได้ แต่รูปแบบ. ToString () ง่ายต่อการอ่านและควรทำงานได้ดีขึ้น
Joel Coehoorn

14
ถ้าฉันจัดการกับสายอักขระแล้วตามที่ผู้โพสต์ได้กล่าวไว้การส่ายไปนานแล้วดูเหมือนว่าจะงี่เง่าอีกครั้ง
Ryan Duffield

บางทีนี่อาจเป็นสิ่งที่ฉันต้องการ อาจจัดการส่วนขยายที่ดีกว่า
ไบรอัน G

5
+1 สำหรับการรักษาหมายเลขเป็นสตริง (เนื่องจากหมายเลขโทรศัพท์ที่ใช้สำหรับระบบ SMS อัตโนมัติจะต้องถูกจัดเก็บในรูปแบบ +44)
35799 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);

คุณแน่ใจหรือไม่ว่าการทำสตริงย่อยสามรายการนั้นดีกว่าการใช้ string.format?
Pradeep

ฉันใช้ String.Format เช่นกัน - แต่คุณจะแนะนำอย่างไรเพื่อให้ได้ผลลัพธ์โดยไม่ต้องใช้ String.Format
Jon Skeet

2
ฉันห่อมันไว้ในif (phone.Length == 10)สภาพ
Zack Peterson

Plus One - จุดเล็ก ๆ จุดหนึ่ง: รูปแบบนั้นดูไม่เหมือนมันมีวงเล็บอยู่รอบ ๆ รหัสพื้นที่บางทีฉันอาจจะอ่านผิด
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
สิ่งนี้ใช้ได้กับฉันหลังจากสิ่งที่กล่าวมาทั้งหมดที่ฉันได้ลอง
เลียตเจส

22

เท่าที่ฉันรู้ว่าคุณไม่สามารถทำได้ด้วยสตริงรูปแบบ ... คุณจะต้องจัดการกับตัวเอง คุณสามารถลบอักขระที่ไม่ใช่ตัวเลขทั้งหมดแล้วทำสิ่งที่ชอบ:

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

สิ่งนี้ถือว่าข้อมูลถูกป้อนอย่างถูกต้องซึ่งคุณสามารถใช้นิพจน์ทั่วไปเพื่อตรวจสอบความถูกต้องได้


4
และจะถือว่าเป็นหมายเลขโทรศัพท์
อเมริกาเหนือ

19

สิ่งนี้น่าจะใช้ได้:

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

หรือในกรณีของคุณ:

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

3
1 ปัญหาเล็กน้อยหากฉันใช้ 01213456789 ทำให้ (12) 345-6789 ... วิธีแก้ปัญหาใด ...
Sangram Nandkhile

5
นี่คือทางออกที่ดีที่สุด เลขศูนย์นำหน้าเป็นสิ่งที่คำนึงถึงหมายเลขโทรศัพท์ของอเมริกาเนื่องจากไม่มีรหัสพื้นที่ของอเมริกาที่ขึ้นต้นด้วยศูนย์
JB

ปัญหาเล็กน้อยหากฉันลอง 12345678 เป็นรูปแบบ (1) 234-5678 ... แต่สิ่งที่ฉันต้องการคือ (123) 456-78 มีวิธีแก้ไขปัญหานี้หรือไม่? ขอบคุณ
Kavitha P.

14

หากคุณได้รับi["MyPhone"]เป็นlongคุณสามารถใช้long.ToString()วิธีการจัดรูปแบบ:

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

ดูที่หน้า MSDN ในตัวเลขสตริงรูปแบบ

ระวังการใช้งานนานมากกว่า int: 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: 123 456 78 90 ไม่ทำงาน
MC9000

5

หากคุณกำลังมองหาหมายเลขโทรศัพท์ (US) ที่จะทำการแปลงแบบเรียลไทม์ ฉันแนะนำให้ใช้ส่วนขยายนี้ วิธีนี้ใช้งานได้อย่างสมบูรณ์แบบโดยไม่ต้องกรอกตัวเลขย้อนหลัง 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 ดีมาก สิ่งนี้ได้รับการแก้ไขแล้วและฉันมีรหัส refactored เป็นส่วนขยายสำหรับการใช้งานทั่วไป
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

ฉันใช้อันนี้และหาวิธีใช้ในการแสดงผลมีดโกนหน้า ฉันใส่มันลงในบล็อค @functions {} ที่ด้านบนของหน้า จากนั้นฉันก็กำจัด @ Html.DisplayFor ผู้ช่วยและเพิ่งอ้างอิงฟังก์ชั่น: ................. @GetFormattedPhoneNumber (รุ่น.Courses_New.CurrentContactPhone) ทำให้วันของฉัน!
JustJohn

4

คุณอาจพบว่าตัวเองอยู่ในสถานการณ์ที่คุณมีผู้ใช้พยายามป้อนหมายเลขโทรศัพท์ด้วยตัวคั่นทุกประเภทระหว่างรหัสพื้นที่และบล็อกหมายเลขหลัก (เช่นช่องว่างขีดกลางระยะเวลา ฯลฯ ) ดังนั้นคุณจะต้องการ ตัดอินพุตของอักขระทั้งหมดที่ไม่ใช่ตัวเลขเพื่อให้คุณสามารถฆ่าเชื้ออินพุตที่คุณทำงานด้วย วิธีที่ง่ายที่สุดในการทำเช่นนี้คือด้วยนิพจน์ RegEx

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

คำตอบที่คุณระบุไว้ควรใช้งานได้ในกรณีส่วนใหญ่

เพื่อตอบสิ่งที่คุณมีเกี่ยวกับปัญหาส่วนขยายของคุณคุณสามารถตัดสิ่งที่ยาวกว่าความยาวสิบที่คาดไว้ (สำหรับหมายเลขโทรศัพท์ปกติ) และเพิ่มลงในส่วนท้ายโดยใช้

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

คุณจะต้องทำเครื่องหมาย 'ถ้า' เพื่อตรวจสอบว่าความยาวของข้อมูลของคุณมากกว่า 10 ก่อนที่จะทำสิ่งนี้ถ้าไม่เพียงใช้:

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



2

ใช้การจับคู่ใน Regex เพื่อแยกแล้วส่งออกสตริงที่จัดรูปแบบด้วยการจับคู่กลุ่ม

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 สตริงรูปแบบจะไม่ทำงาน


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

ส่งหมายเลขโทรศัพท์ของคุณเป็นสตริง 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โดยไม่ต้องแปลงหมายเลขโทรศัพท์ของเราเป็นlong

ดังนั้นก่อนอื่นให้สร้าง formatter ที่กำหนดเอง:

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- ดังนั้นคุณอาจต้องการที่จะใช้ตัวละครที่เป็นไปได้บรรจุในตัวสร้าง

นอกจากนี้ฉันไม่ได้ให้วิธีการยกเว้นเครื่องหมาย # ดังนั้นหากคุณต้องการรวมไว้ในสตริงเอาต์พุตของคุณคุณจะไม่สามารถทำได้เหมือนตอนนี้

เหตุผลที่ฉันชอบวิธีนี้มากกว่า Regex คือฉันมักจะมีข้อกำหนดให้ผู้ใช้สามารถระบุรูปแบบได้และมันง่ายกว่ามากสำหรับฉันที่จะอธิบายวิธีการใช้รูปแบบนี้มากกว่าการพยายามสอนผู้ใช้ regex

ชื่อคลาสเป็นบิตของการเรียกชื่อผิดเนื่องจากมันใช้งานได้จริงในการจัดรูปแบบสตริงใด ๆ ตราบใดที่คุณต้องการเก็บไว้ในลำดับเดียวกันและเพียงแค่ใส่อักขระที่อยู่ภายใน



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.