फोन नंबर से कोड देश निकालें [libphonenumber]


82

मेरे पास एक स्ट्रिंग है जैसे: +33123456789 (फ्रेंच फोन नंबर)। मैं देश को जाने बिना देश का कोड (+33) निकालना चाहता हूं। उदाहरण के लिए, यह काम करना चाहिए अगर मेरे पास दूसरे देश का कोई दूसरा फोन है। मैं Google लाइब्रेरी https://code.google.com/p/libphonenumber/ का उपयोग करता हूं ।

अगर मैं देश को जानता हूं, तो यह अच्छा है कि मैं देश कोड पा सकता हूं:

PhoneNumberUtil phoneUtil = PhoneNumberUtil.getInstance();
int countryCode = phoneUtil.getCountryCodeForRegion(locale.getCountry());

लेकिन मुझे देश को जाने बिना एक स्ट्रिंग को पार्स करने का तरीका नहीं मिला।




1
पहला लिंक टेलीफोन कंट्री कोड पर आधारित है। लेकिन मेरे मामले में, मेरे पास एक स्ट्रिंग हो सकती है जो एक अंग्रेजी फोन के साथ एक फ्रेंच फोन नंबर है। इसलिए यदि मैं वर्तमान स्थान को पुनः प्राप्त करता हूं, तो मेरे पास "EN" होगा, लेकिन मेरा स्ट्रिंग एक फ्रेंच कंट्री कोड होगा
mrroboaat

जवाबों:


128

ठीक है, इसलिए मैंने libphonenumber ( https://groups.google.com/forum/?hl=en&fromgroups#=forum/libphonenumber-discuss ) के Google समूह में शामिल हो गया हूं और मैंने एक प्रश्न पूछा है।

यदि मेरा फोन नंबर "+" से शुरू होता है, तो मुझे देश को पैरामीटर में सेट करने की आवश्यकता नहीं है। यहाँ एक उदाहरण है :

PhoneNumberUtil phoneUtil = PhoneNumberUtil.getInstance();
try {
    // phone must begin with '+'
    PhoneNumber numberProto = phoneUtil.parse(phone, "");
    int countryCode = numberProto.getCountryCode();
} catch (NumberParseException e) {
    System.err.println("NumberParseException was thrown: " + e.toString());
}

6
इस wackadoo पागल पुस्तकालय अद्भुत है और sAndroid में शामिल PhoneNumberUtil पुस्तकालय से एक अरब गुना बेहतर है
Aphex

@ आप मुझे बताएंगे कि यह कैसे काम करेगा (बिना फोन यूटिलाइजेशन के उपयोग के बिना कैसे काम करेगा (phoneUtil.parse (फोन, "");) आपका जवाब, कृपया जवाब दें
ऐश

1
@ श्वेता यदि आपका कोई प्रश्न है, तो कृपया इसे SO
mrroboaat

1
@ ठीक है, लेकिन आपका जवाब सही नहीं है, किसी भी देश को दिए बिना इस कोड को निष्पादित नहीं किया जाएगा
ऐश

3
@Swweta defaultRegion पैरामीटर शून्य होना चाहिए: defaultRegion - ISO 3166-1 दो-अक्षर क्षेत्र कोड जो उस क्षेत्र को दर्शाता है जिससे हम उम्मीद कर रहे हैं कि संख्या इससे होने वाली है। इसका उपयोग केवल तभी किया जाता है जब पार्स की गई संख्या को अंतर्राष्ट्रीय प्रारूप में नहीं लिखा जाता है। इस मामले में संख्या के लिए country_code आपूर्ति की गई डिफ़ॉल्ट क्षेत्र के रूप में संग्रहीत किया जाएगा। अगर देश को '+' के साथ शुरू करने की गारंटी दी जाती है, जिसके बाद देश कॉलिंग कोड होता है, तो "ZZ" या नल की आपूर्ति की जा सकती है।
xnagyg

3

यहां आप फोन नंबर को अंतरराष्ट्रीय स्वरूपित फोन नंबर के रूप में सहेज सकते हैं

internationalFormatPhoneNumber = phoneUtil.format(givenPhoneNumber, PhoneNumberFormat.INTERNATIONAL);

यह अंतर्राष्ट्रीय प्रारूप +94 71 560 4888 के रूप में फोन नंबर लौटाता है

इसलिए अब मुझे इसके रूप में देश कोड मिल गया है

String countryCode = internationalFormatPhoneNumber.substring(0,internationalFormatPhoneNumber.indexOf('')).replace('+', ' ').trim();

आशा है कि यह आपकी मदद करेगा


1
क्या है internationalFormatPhoneNumberDataType और phoneUtil
Kartheek s

1
दिए गए फोननंबर पैरामीटर एक स्ट्रिंग नहीं है, यह चुड़ैल में पहले से ही पार्स किया गया फोन नंबर होना चाहिए जो आपको उत्पन्न करने के लिए डिफ़ॉल्ट क्षेत्र की आवश्यकता है
Gil SH

@ गिल्श हां दियाफोनफोन नहीं स्ट्रिंग, यह फोननंबर ऑब्जेक्ट है।
थिलिना रूबसिंघ

1
यह जवाब मेरे लिए मदद करता है
luttu android

क्या दिया है फ़ोनफोनम्बर ??
थरकनरीमन

3

मैंने ऊपर पोस्ट किए गए एक उत्तर के आधार पर इसकी देखभाल करने के लिए एक आसान सहायक विधि रखी है:

आयात:

import com.google.i18n.phonenumbers.NumberParseException
import com.google.i18n.phonenumbers.PhoneNumberUtil

समारोह:

    fun parseCountryCode( phoneNumberStr: String?): String {
        val phoneUtil = PhoneNumberUtil.getInstance()
        return try {
            // phone must begin with '+'
            val numberProto = phoneUtil.parse(phoneNumberStr, "")
            numberProto.countryCode.toString()
        } catch (e: NumberParseException) {
            ""
        }
    }

0

नीचे की तरह एक कोशिश पकड़ने ब्लॉक का उपयोग करें:

try { 

const phoneNumber = this.phoneUtil.parseAndKeepRawInput(value, this.countryCode);

}catch(e){}

0

यहां Google लाइब्रेरी का उपयोग किए बिना अंतर्राष्ट्रीय फोन नंबर के आधार पर देश को प्राप्त करने के लिए एक समाधान है।

मुझे पहले यह बताएं कि देश का पता लगाना इतना मुश्किल क्यों है। कुछ देशों का देश कोड 1 अंक, 2, 3 या 4 अंक है। यह काफी सरल होगा। लेकिन देश कोड 1 का उपयोग न केवल अमेरिका के लिए किया जाता है, बल्कि कनाडा और कुछ छोटे स्थानों के लिए भी किया जाता है:

1339 यूएसए
1340 वर्जिन आइलैंड्स (कैरेबियन आइलैंड्स)
1341 यूएसए
1342
1343 कनाडा का इस्तेमाल नहीं किया गया

अंक 2..4 तय करते हैं, अगर यह यूएस या कनाडा है या ... देश का पता लगाने का कोई आसान तरीका नहीं है, जैसे पहले xxx कनाडा हैं, बाकी यूएस।

मेरे कोड के लिए, मैंने एक वर्ग को परिभाषित किया जो हमेशा अंकों के लिए जानकारी रखता है:

public class DigitInfo {
  public char Digit;
  public Country? Country;
  public DigitInfo?[]? Digits;
}

संख्या में पहले अंक के लिए एक पहला सरणी DigitInfos रखता है। दूसरे अंक का उपयोग IndexInfo.Digits में एक सूचकांक के रूप में किया जाता है। जब तक अंक खाली न हो, तब तक कोई भी उस अंक श्रृंखला को नीचे नहीं ले जाता है। यदि देश को परिभाषित किया गया है (अर्थात शून्य नहीं है) तो वह मूल्य वापस मिल जाता है, अन्यथा कोई भी देश जो पहले परिभाषित किया गया है:

country code 1: byPhone[1].Country is US  
country code 1236: byPhone[1].Digits[2].Digits[3].Digits[6].Country is Canada  
country code 1235: byPhone[1].Digits[2].Digits[3].Digits[5].Country is null. Since   
                   byPhone[1].Country is US, also 1235 is US, because no other   
                   country was found in the later digits

यहाँ वह विधि है जो देश को फोन नंबर के आधार पर लौटाती है:

/// <summary>
/// Returns the Country based on an international dialing code.
/// </summary>
public static Country? GetCountry(ReadOnlySpan<char> phoneNumber) {
  if (phoneNumber.Length==0) return null;

  var isFirstDigit = true;
  DigitInfo? digitInfo = null;
  Country? country = null;
  foreach (var digitChar in phoneNumber) {
    var digitIndex = digitChar - '0';
    if (isFirstDigit) {
      isFirstDigit = false;
      digitInfo = ByPhone[digitIndex];
    } else {
      if (digitInfo!.Digits is null) return country;

      digitInfo = digitInfo.Digits[digitIndex];
    }
    if (digitInfo is null) return country;

    country = digitInfo.Country??country;
  }
  return country;
}

बाकी कोड (दुनिया के हर देश के लिए digitInfos, टेस्ट कोड, ...) यहां पोस्ट किए जाने के लिए बहुत बड़ा है, लेकिन यह Github पर पाया जा सकता है: https://github.com/PeterHuberSg/WpfhindowsLib/blob /मास्टर / WWFWindowsLib/CountryCode.cs

कोड एक WPF TextBox का हिस्सा है और लाइब्रेरी में ईमेल पतों आदि के लिए अन्य नियंत्रण भी शामिल हैं। एक अधिक विस्तृत विवरण कोडप्रोजेक्ट पर है: अंतर्राष्ट्रीय फोन नंबर सत्यापन विस्तार से बताया गया


-5

यदि फोन नंबर वाली स्ट्रिंग हमेशा इस तरह से शुरू हो जाएगी (+33 या किसी अन्य देश कोड) तो आपको regex का उपयोग पार्स करने के लिए और देश कोड प्राप्त करने के लिए करना चाहिए और फिर देश से संबंधित नंबर प्राप्त करने के लिए लाइब्रेरी का उपयोग करना चाहिए।


यह विभिन्न देश कोड का एक बहुत मौजूद है: http://en.wikipedia.org/wiki/List_of_country_calling_codes
mrroboaat

-24

यहां एक उत्तर दिया गया है कि तीसरे पक्ष के पुस्तकालयों का उपयोग किए बिना देश कॉलिंग कोड कैसे खोजें (जैसा कि वास्तविक डेवलपर करता है):

सभी उपलब्ध देश कोड की सूची प्राप्त करें, विकिपीडिया यहाँ मदद कर सकता है: https://en.wikipedia.org/wiki/List_of_country_calling_codes

एक पेड़ की संरचना में डेटा पार्स करें जहां प्रत्येक अंक एक शाखा है।

जब तक आप अंतिम शाखा में नहीं होते हैं, तब तक अपने पेड़ के अंक को पार कर लें - यही आपका देश कोड है।


26
मैं इस टिप्पणी के कारण इसे डाउन-वोट कर रहा हूं: "यहां एक उत्तर दिया गया है कि तीसरे पक्ष के पुस्तकालयों (जैसा कि वास्तविक डेवलपर करता है) का उपयोग किए बिना देश कॉलिंग कोड कैसे ढूंढें?" आपको क्यों लगता है कि सॉफ्टवेयर प्रगति करता है? ऐसा इसलिए है क्योंकि लोगों को हर बार पहिया का फिर से आविष्कार नहीं करना पड़ता है। एक असली डेवलपर तीसरे पक्ष के पुस्तकालयों का उपयोग करता है क्योंकि वह स्मार्ट है।
कार्ल बी

2
आपकी व्यक्तिगत राय मेरे उत्तर को गलत नहीं बनाती है, क्या यह? वास्तव में, यह अब तक का एकमात्र सही और बुलेट-प्रूफ उत्तर है ... और हाँ, इसे काम करने के लिए किसी तीसरे पक्ष के सॉफ़्टवेयर की आवश्यकता नहीं है। यदि आप तृतीय पक्ष पुस्तकालयों का उपयोग करने पर जोर देते हैं तो मेरा समाधान खरीदने के लिए आपका स्वागत है।
अनबोन

2
लाइब्रेरी को अपडेट करना लगातार देखने के लिए विकिपीडिया पृष्ठ पर जाने से आसान है, यह देखने के लिए कि क्या देश कॉलिंग कोड की सूची बदल गई है।
फ्लिम्ड

@ अननोन क्षमा करें यार। Stackoverflow पर व्यक्तिगत राय के कारण उन्हें वोट नहीं देना चाहिए। मैं खोजते समय आपके उत्तर की बिल्कुल तलाश कर रहा था। इसलिए मेरी तरफ से धन्यवाद। मेरा उत्थान कम से कम हो।
Ybrin
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.