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 प्रारूप का उपयोग करता है।
डोर हाई आर्क

यह फोन नंबर 0
dano

आपको यह निर्दिष्ट करना चाहिए कि यह उत्तर अमेरिकी संख्याएं हैं या नहीं।
आर्मस्ट्रांगेस्ट

चेतावनी: संपूर्ण धागा यूएस उत्तर अमेरिकी फोन नंबरों को मानता है। एक पुस्तकालय का उपयोग करें जो अंतर्राष्ट्रीय संख्याओं का समर्थन करता है। nuget.org/packages/libphonenumber-csharp
शॉन एंडरसन

जवाबों:


204

कृपया ध्यान दें, यह उत्तर संख्यात्मक डेटा प्रकारों (int, long) के साथ काम करता है। यदि आप एक स्ट्रिंग के साथ शुरू कर रहे हैं, तो आपको इसे पहले एक नंबर में बदलना होगा। इसके अलावा, कृपया ध्यान रखें कि आपको यह पुष्टि करने की आवश्यकता होगी कि प्रारंभिक स्ट्रिंग की लंबाई कम से कम 10 वर्ण है।

उदाहरणों से भरे एक अच्छे पृष्ठ से :

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

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

यद्यपि एक रेगेक्स और भी बेहतर काम कर सकता है, पुरानी प्रोग्रामिंग बोली को ध्यान में रखें:

कुछ लोग, जब किसी समस्या का सामना करते हैं, तो सोचते हैं "मुझे पता है, मैं नियमित अभिव्यक्ति का उपयोग करूंगा।" अब उन्हें दो समस्याएं हैं।
- जामी ज़्विन्स्की, कॉम्प.लंग.मेक्स में


क्या होता है, अगर फोन नंबर कुछ अंकों को याद कर रहा है - "800555" जैसे? क्या केवल वही मौजूद है जो वहां मौजूद है?
VoodooChild

11
यह एक बुरा कार्यान्वयन है क्योंकि यदि क्षेत्र कोड 0105555555 या कुछ इस तरह से शुरू होता है, तो आप अंत में (010) 555-5555 के बजाय (01) 555-5555 प्राप्त कर रहे हैं। इसका कारण यह है कि यदि आप फोन नंबर को एक नंबर में बदलते हैं तो सामने वाले शून्य को कुछ भी नहीं के रूप में देखा जाता है और जब आप इसे प्रारूपित करते हैं तो पहले 0 को गिरा दिया जाता है।
पॉल मेंडोज़ा

3
@Paul कृपया समस्या की परिभाषा पढ़ें: "मेरे पास एक तार है" 1112224444 'यह एक टेलीफोन नंबर है। इससे पहले कि मैं इसे एक फ़ाइल में संग्रहीत करूँ, 111-222-4444 के रूप में प्रारूपित करना चाहता हूँ।
शॉन

39
यदि आपका फोन नंबर एक स्ट्रिंग है, तो यह काम नहीं करेगा, जैसा कि सवाल बताता है, जब तक कि आप इसे पहले संख्यात्मक मान में नहीं बदलते।
जस्टिन स्टॉल

4
मुझे पता है कि यह सिर्फ ऊपर की टिप्पणी दोहरा रहा है, लेकिन इस सवाल का जवाब नहीं दिया। आप किसी विशिष्ट प्रारूप में एक स्ट्रिंग को कैसे प्रारूपित करते हैं, इस मामले में एक टेलीफोन नंबर प्रारूप है।
डिस्लेक्सिकनकोको

168

मैं नियमित अभिव्यक्ति का उपयोग करना पसंद करता हूं:

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

4
मुझे लगता है कि यह काम करेगा, लेकिन .Toring () प्रारूप को पढ़ना आसान है और इसे बेहतर प्रदर्शन करना चाहिए।
जोएल कोएहॉर्न

14
अगर मैं पहले से ही एक तार के साथ काम कर रहा हूं, जैसा कि पोस्टर ने कहा है, इसे एक लंबी और पीठ पर फिर से डालना मूर्खतापूर्ण लगता है।
रेयान डफ़िल्ड

शायद यह वही है जो मुझे आखिर चाहिए। एक्सटेंशन को बेहतर तरीके से संभाल सकते हैं
ब्रायन जी

5
नंबर को एक स्ट्रिंग के रूप में रखने के लिए (यह देखते हुए कि अक्सर स्वचालित एसएमएस सिस्टम के लिए उपयोग किए जाने वाले फोन नंबर +44 प्रारूप में संग्रहीत किए जाते हैं)
एड जेम्स

3
मैं अलग-अलग स्वरूपों के साथ काम कर रहा हूं (उदाहरण के लिए (111) 222-4444, 111.222.4444, आदि), लेकिन उन्हें (111) 222-4444 के लिए सामान्यीकृत करने की आवश्यकता है। मैं अधूरे नंबरों से भी बचना चाहता था और {n, m} नोटेशन का इस्तेमाल करता था। (और प्रारूपण के लिए क्षमा याचना, लेकिन कुछ एमडी प्रारूप मेरे लिए काम नहीं कर रहे हैं)। // 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");
क्रेग बोलैंड

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 का उपयोग करने से बेहतर है?
प्रदीप

मैं String.Format का उपयोग करता हूं - लेकिन आप String.Format का उपयोग किए बिना परिणाम प्राप्त करने का सुझाव कैसे दे रहे हैं ?
जॉन स्कीट

2
मैंने उसे एक if (phone.Length == 10)हालत में लपेट लिया ।
जेक पीटरसन

प्लस वन - एक छोटा बिंदु: यह प्रारूप नहीं दिखता है क्योंकि इसमें क्षेत्र कोड के आसपास कोष्ठक है, शायद मैं इसे गलत पढ़ रहा हूं।
मार्क रोजर्स

1
@MarkRogers: सवाल कहता है "मैं 111-222-4444 के रूप में प्रारूपित करना चाहता हूं" - वहां कोई भी कोष्ठक नहीं हैं।
जॉन स्कीट

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 या व्हॉट्सएप नहीं था।
कावरमैन 20

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 ... कोई समाधान ...?
संग्राम नंदखिले

5
यह सबसे अच्छा उपाय है। अमेरिकी फोन नंबरों के संबंध में अग्रणी शून्य शून्य है क्योंकि कोई अमेरिकी क्षेत्र कोड नहीं हैं जो शून्य या एक से शुरू होते हैं।
जेबी

छोटा मुद्दा अगर मैंने 12345678 की कोशिश की तो यह प्रारूप (1) 234-5678 ... लेकिन मुझे क्या चाहिए (123) 456-78। क्या इसका कोई समाधान है? धन्यवाद
कविता पी

14

यदि आप i["MyPhone"]एक के रूप में प्राप्त कर सकते हैं long, तो आप long.ToString()इसे प्रारूपित करने के लिए विधि का उपयोग कर सकते हैं :

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

न्यूमेरिक फॉर्मेट स्ट्रिंग्स पर MSDN पेज देखें ।

Int के बजाय लंबे समय तक उपयोग करने के लिए सावधान रहें: int अतिप्रवाह कर सकता है।


1
इसके साथ समस्या यह है कि संख्या> 10 वर्ण लंबी है (अर्थात इसमें एक एक्सटेंशन शामिल है)। इसका परिणाम बहुत ही अजीब है, जहां 212-555-1212 x1234 निकलता है2125551-212-1234.
माइकल ब्लैकबर्न

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

यदि आपकी (यूएस) फोन नंबर की तलाश वास्तविक समय में परिवर्तित की जाए। मैं इस एक्सटेंशन का उपयोग करने का सुझाव देता हूं। यह विधि पीछे की संख्याओं को भरे बिना पूरी तरह से काम करती है। 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 अच्छा कैच। इसे ठीक कर दिया गया है और मेरे पास सामान्य उपयोग के लिए एक कोड को रिफलेक्ट किया गया है।
जेम्स कोपलैंड

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
ज्ञात रहे कि विभिन्न देशों में फोन नंबरों के अलग-अलग प्रारूप और लंबाई होती है और लोग उनमें प्रवेश नहीं कर पाएंगे।
नेमे

मैं इसे Html.DisplayFor (मॉडल => model.PhoneNumber) के साथ कैसे उपयोग करूंगा?
जस्टजोन

मैंने इसका उपयोग किया और यह पता लगाया कि रेजर पेज डिस्प्ले में इसका उपयोग कैसे किया जाए। मैंने इसे पृष्ठ के शीर्ष पर एक @functions {} ब्लॉक में रखा है। फिर मैंने @ Html.DisplayFor हेल्पर से छुटकारा पा लिया और सिर्फ फ़ंक्शन को संदर्भित किया: ................. @GetFormattedPhoneNumber (Model.Courses_New.CurrentContactPhone) ने मेरा दिन बना दिया!
JustJohn

4

आप अपने आप को उस स्थिति में पा सकते हैं जहाँ आपके पास उपयोगकर्ता हैं जो फ़ोन कोड को क्षेत्र कोड और मुख्य संख्या ब्लॉक (जैसे, रिक्त स्थान, डैश, अवधि, ect ...) के बीच सभी प्रकार के विभाजक के साथ दर्ज करने की कोशिश कर रहे हैं। सभी वर्णों के इनपुट को स्ट्रिप करें जो संख्याएँ नहीं हैं ताकि आप जिस इनपुट के साथ काम कर रहे हैं उसे निष्फल कर सकें। ऐसा करने का सबसे आसान तरीका एक 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

इसे इस्तेमाल करे

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 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)) : "";

अगर हम लंबे समय का उपयोग नहीं करते हैं। मोटे तौर पर, 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

कृपया सी # के लिए निम्न लिंक का उपयोग करें 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

तो पहले कस्टम फॉर्मेटर बनाने की सुविधा देता है:

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;
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.