2010-08-14 22 views
33

मुझे अपने किसी एक एप्लिकेशन में मोबाइल नंबर का प्रतिनिधित्व करने में परेशानी हो रही है।फोन नंबरों का प्रतिनिधित्व करने का सही तरीका क्या है?

अगर वहाँ एक पूर्णांक वर्ग है कि आप इस तरह के एक नंबर 0417254482. के साथ शुरू शायद का उपयोग कर एक स्ट्रिंग एक अधिक उपयुक्त हो स्टोर करने के लिए अनुमति देगा मैं सोच रहा था? वर्तमान जब मैं ints के साथ एक फोन नंबर का प्रतिनिधित्व उपयोग करने के लिए कोशिश कर रहा हूँ पर, देशांतर मैं यादृच्छिक संख्या और नहीं संख्या मैं दुकान के लिए होती स्टोर करने के लिए लग रहे दोगुना हो जाता है।

+9

@ Raze2dust: इस मामले में किसी भी कोड की आवश्यकता नहीं है। –

+0

@ जोन मेरा मतलब है कि यह एक यादृच्छिक संख्या प्रदर्शित करता है .. यह समझ में आता है कि यह अग्रणी शून्यों के साथ संख्या प्रदर्शित कर रहा है, लेकिन एक यादृच्छिक संख्या? मुझे हल करने के लिए कोड देखने की आवश्यकता होगी .. –

+1

@ Raze2dust: ठीक है, "यादृच्छिक" नहीं - लेकिन इसे 'डबल' में संग्रहीत करना निश्चित रूप से डेटा खो सकता है। –

उत्तर

94

उपयोग String। किसी और चीज के अलावा, यदि आप पूर्णांक का उपयोग करते हैं तो आप प्रमुख शून्यों को स्टोर करने में सक्षम नहीं होंगे। आप निश्चित रूप सेint (बहुत छोटा) float या double (डेटा हानि का बहुत अधिक जोखिम - नीचे देखें) उपयोग नहीं करना चाहिए ; long या BigInteger (अग्रणी शून्य समस्या को छोड़ कर) उपयुक्त हो सकता है, लेकिन स्पष्ट रूप से मैं String साथ जाना चाहते हैं। इस तरह आप भी दुकान जो कुछ डैश या रिक्त स्थान उपयोगकर्ता में प्रवेश किया है यह आसान नंबर याद रखने के लिए, आप करना चाहते हैं बनाने के लिए कर सकते हैं।

float और double - float के लिए ऊपर वर्णित "डेटा हानि" के संदर्भ में निश्चित रूप से पर्याप्त सटीकता नहीं है; double काम कर सकता है यदि आप खुश हैं कि आपको कभी भी 16 अंकों से अधिक की आवश्यकता नहीं होगी (long के साथ आपको कुछ कम से कम) की आवश्यकता होगी, लेकिन आपको बहुत सावधान रहना होगा कि कहीं भी आप मूल्य को double से वापस कनवर्ट करें string, आपको सही मूल्य मिला। कई स्वरूपण रूपांतरण आपको अनुमानित करेंगे जो 10 महत्वपूर्ण अंक कहने के लिए सटीक हो सकता है - लेकिन आप एक सटीक पूर्णांक चाहते हैं। असल में, फ़ोन नंबरों के लिए फ़्लोटिंग पॉइंट का उपयोग करना मूल रूप से खराब विचार है। यदि आप में हैं, तो निश्चित-चौड़ाई संख्यात्मक प्रकार का उपयोग करने के लिए, long का उपयोग करें, लेकिन आदर्श रूप से, इसे पूरी तरह से टालें।

+0

मेरी अज्ञानता को क्षमा करें, लेकिन क्या कोई फोन नंबर वास्तव में अग्रणी शून्य से शुरू होता है? –

+3

@WesleyMurch: * सभी * यूके फोन नंबर 0 से शुरू होते हैं। उदाहरण के लिए, पढ़ने के लिए क्षेत्र कोड 0118 है। –

+1

यह @ कोल जोहानसन की गलती नहीं है जिसे उन्होंने गलत तरीके से सी # कोड में संपादित किया है। किसी ने इस प्रश्न के [सी # संस्करण] (http://stackoverflow.com/questions/17386794) को बंद कर दिया है और कहा है कि यह इस प्रश्न का डुप्लिकेट है। प्रोग्रामिंग भाषाओं के बीच अंतर करना महत्वपूर्ण है, आईएमएचओ। – HappyNomad

0

हर संख्या, बाएँ और दाएँ पक्ष पर शून्य की अनंत राशि

यह प्रतिनिधित्व करने के लिए आप एक स्ट्रिंग

class PhoneNumber implements Comparable<PhoneNumber> { 

    private Long number; 

    public PhoneNumber(Long number) { 
     this.number = number; 
    } 

    public Long getNumber() { 
     return this.number; 
    } 

    public boolean equals(Object object) { 

     if (getNumber() == null && object == null) { 
      return true; //or false its depend 
     } 

     return getNumber().equals(object); 
    } 

    public int compareTo(PhoneNumber that) { 

      if(that == null) { 
      return -1; 
      } 

     Long thisNumber = getNumber(); 
      Long thatNumber = that.getNumber(); 

     if (thisNumber == null && thatNumber == null) { 
      return 0; //or -1 
     } 

     if (thisNumber == null && thatNumber != null) { 
      return -1; 
     } 

     return thisNumber.compareTo(thatNumber); 

    } 

    @Override 
    public String toString() { 
     return String.format("%010d", getNumber()); 
    } 
} 

प्रयुक्त% 010d formating का उपयोग करना चाहिए मतलब % [argument_index $] [झंडे ] [चौड़ाई] [सटीक] रूपांतरण

झंडा 0 -। गद्दी शून्य 10 - गद्दी शून्य की राशि घ - दशमलव पूर्णांक

इंटरफ़ेस तुलनात्मक कार्यान्वयन आपको सूची को क्रमबद्ध करने की सकारात्मकता देता है।

List<PhoneNumber> phoneNumbers = new ArrayList(); 
phoneNumbers.add(new PhoneNumber (123L); 
phoneNumbers.add(new PhoneNumber (123777L); 
phoneNumbers.add(new PhoneNumber (125L); 
phoneNumbers.add(new PhoneNumber (124L); 
phoneNumbers.add(new PhoneNumber (126L); 

Collections.sort(phoneNumbers); 

    for(PhoneNumber phoneNumber : phoneNumbers) { 
    System.Console.Out.WriteLine(phoneNumber); 
    } 

उत्पादन

0000000000 
000000
0000000124 
0000000125 
0000000126 
000

Comparable String Formatter

+0

से शुरू होते हैं। कोड में कुछ गलतियां होती हैं (गायब अर्ध कोलन) लेकिन इसके अलावा इसे हल करने का यह सही तरीका है। – matto1990

+0

@ matto1990 केवल एक ;-) लेकिन सभी को सही किया। thx –

+0

-1 किसी संख्या के उपयोग की अनुशंसा करते हैं। क्षमा करें @ वाश 9,100 प्रतिनिधि को 9,0 9 8 में बदलने के लिए। साथ ही, 'struct' के बजाय 'वर्ग' का उपयोग क्यों करें? यदि संरचना में डेटा शामिल है, तो इस तरह, 'struct' का उपयोग करें। यदि इसमें "ऑब्जेक्ट्स" शामिल है और चीजें (जैसे 'स्ट्रीम') करती हैं, तो' कक्षा' का उपयोग करें। अगर 'int'' वर्ग int32' के रूप में परिभाषित किया गया तो क्या यह समझ में आता है? –

3

प्रकार स्ट्रिंग के एक निजी क्षेत्र में यह प्रतिनिधित्व करने के लिए के साथ अपने स्वयं PhoneNumber कक्षा बनाएं है।

public class PhoneNumber { 
    private String number; 
    public PhoneNumber(String number) { 
     //check validity of number 
     this.number = number; 
    } 
    //getter, comparator, etc... 
} 

तुम भी लंबे समय तक या BigInteger साथ नंबर represnt सकता है अगर सभी फ़ोन नंबर एक ही लंबाई है, लेकिन अग्रणी शून्य के साथ सावधान रहना।

एक फोन नंबर वास्तव में एक पूर्णांक (या एक स्ट्रिंग) नहीं है। यह कुछ और है जो शूल के पास अपनी कक्षा है।

संपादित करें: एक और बात: मैं इस वर्ग के लिए एक सेटर को लागू नहीं करेंगे, क्योंकि एक फोन नंबर वस्तु बेहतर अपरिवर्तनीय

+0

तुलना जोड़ने और विधि के बराबर करने से सॉर्टिंग कार्य इस मामले में पूछे जाने वाले प्रश्नकर्ता के रूप में काम करेगा। – matto1990

+0

@matto: आपका अधिकार है। उसे तुलना करने और बराबर करने के लिए लागू करना चाहिए। धन्यवाद। – snakile

+1

यदि आप केवल परमाणु स्ट्रिंग में नंबर को संग्रहीत कर रहे हैं तो हैशकोड जैसी सभी विधियों के बाद इसे नए वर्ग में लपेटने की कोई आवश्यकता नहीं है ... ... अनिवार्य रूप से स्ट्रिंग द्वारा प्रदान किए गए कार्यान्वयन के लिए प्रतिनिधि होगा। –

0

आप पहले शून्य संख्या का समर्थन करने के लिए स्ट्रिंग का उपयोग करना चाहिए होगा। कोड आपके द्वारा दी गई थी:

Order order1 = new PickUpOrder(orderTime, 0473519954); 
//The pickup order requires an orderTime (String) and a contact number(Int). Heres  
//the constructor for PickUpOrder. 

public PickUpOrder(Date orderTime, String number) 
{ 
    discount = .2; 
    phoneNumber = number; 
    super.setOrderTime(orderTime); 
    //Test print 
    System.out.println(phoneNumber) 
    //reads int as 74049273 instead of 0473519954 
} 

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

28

इस बारे में सोचें: क्या फ़ोन नंबर वास्तव में एक संख्या है? क्या यह फ़ोन नंबरों के साथ जोड़ने (या एक और अंकगणितीय ऑपरेशन) समझ में आता है? फोन नंबर कोड होते हैं, उन्हें आम तौर पर संख्याओं के साथ दर्शाया जाता है, लेकिन यह सिर्फ एक सम्मेलन है और शायद, किसी अन्य देश में भी अक्षरों का उपयोग करें (मुझे अभी पता चला है, अंतरराष्ट्रीय फोन नंबरों के बारे में क्या? शुरुआत में उनके पास + है। आपको उन चीज़ों की प्रकृति के बारे में सोचना होगा जिन्हें आप प्रस्तुत करना चाहते हैं, और फिर, सबसे उपयुक्त प्रतिनिधित्व प्राप्त करें।

+0

+1 मुझे लगता है कि आप 00 से 00 को प्रतिस्थापित कर सकते हैं, इसलिए डेनमार्क (जहां मैं हूं) 0045 XXXX XXXX है। –

+0

हां। यह सच है + 00 के बजाय और इसके विपरीत इस्तेमाल किया जा सकता है। –

+4

मैं आईडी पर कोई अंकगणितीय परिचालन नहीं कर रहा हूं, और फिर भी मैं उन्हें लंबे समय तक स्टोर करता हूं। – rds

2

हालांकि फोन नंबरों का नाम संख्या है, लेकिन वे आम तौर पर संख्या नहीं हैं (उदाहरण के लिए अग्रणी शून्य, देश उपसर्ग + एक्सएक्स , ...)

तो वहाँ एक कार्यक्रम के अंदर सही ढंग से एक फोन नंबर का प्रतिनिधित्व करने के दो संभावनाएं हैं:।

  1. दर्ज की गई पूरी संख्या को रखने के लिए String का उपयोग करना।
  2. कि फोन नंबर के लिए अतिरिक्त सहायता प्रदान करता है एक कस्टम डेटा प्रकार का उपयोग की सुविधा है

    public class PhoneNumber implements Comparable<PhoneNumber>{ 
    
        private String countryCode; 
    
        private String areaCode; 
    
        private String subscriberNumber; 
    
        // Constructor(s) 
    
        // Getter 
    
        // HashCode + Equals 
    
        // compareTo 
    
        @Override 
        public String toString(){ 
         return countrycode + " " + areaCode + " " + subscriberNumber; 
        } 
    

    }

यह बिल्कुल अलग conventions that are used internationally

+0

इसके अतिरिक्त यह भी निर्भर करता है कि आपके एप्लिकेशन कितने जटिल हैं। एक सामान्य अनुप्रयोग को केवल स्ट्रिंग प्रतिनिधित्व की आवश्यकता होती है और कुछ और नहीं, जबकि पते पर रखने के लिए जटिल अनुप्रयोगों और उन पर निष्पादित प्रश्नों को अधिक परिष्कृत हैंडलिंग की आवश्यकता होगी। –

+0

आप इस सम्मेलन को ले सकते हैं कि एक फोन नंबर में देश उपसर्ग शामिल होना चाहिए, इस मामले में कोई अग्रणी शून्य नहीं है। – rds

1

आप का उपयोग करना चाहिए एक देखने के लिए वास्तव में दिलचस्प है स्ट्रिंग या एक और विशेष डेटा संरचना।

मुख्य कारण यह है कि आप फोन नंबरों पर जो ऑपरेशन कर सकते हैं वह लेक्सिकोग्राफिक हैं, और अंकगणित नहीं हैं। उदा। आप कह सकते हैं कि फ्रांस के लिए फोन नंबर +33 से शुरू होते हैं, लेकिन आप यह नहीं मान सकते कि वे संख्यात्मक सीमा में हैं।

ये अन्य तर्कों मेरी राय

  • में मान्य नहीं हैं एक फोन नंबर * या # शामिल कर सकते हैं। यह प्रतीक फोन लाइनों पर पहुंचा जा सकता है, लेकिन वे फोन नंबर का हिस्सा नहीं हैं, और मुझे लगता है कि यह दायरे से बाहर है।
  • एक फोन नंबर अग्रणी शून्य से शुरू हो सकता है। स्थानीय फोन नंबर, लेकिन वे पहले स्थान पर सीमित प्रतिनिधित्व कर सकते हैं। अंतरराष्ट्रीय फोन नंबर देश कोड के साथ शुरू होते हैं, और उनमें से कोई भी अग्रणी शून्य नहीं है। इसलिए कोई अंतरराष्ट्रीय फोन नंबर शून्य नहीं है।
  • एक फोन नंबर + के साथ शुरू होता है। एक संख्या पूरी तरह से सकारात्मक होने के द्वारा इसका प्रतिनिधित्व कर सकती है। + से शुरू होने से भी E164 संख्याओं का प्रतिनिधित्व होता है, ताकि उन्हें स्थानीय नंबरों से अलग किया जा सके। यदि आप केवल ई 164 नंबरों में हेरफेर करते हैं, तो उन्हें वास्तव में नहीं करना पड़ता है।
  • एक फ़ोन नंबर में रिक्त स्थान या कोष्ठक हो सकते हैं। यह बेतुका है, क्योंकि यह संख्या का केवल पाठ्य प्रतिनिधित्व है। आपको इसे स्टोर नहीं करना चाहिए क्योंकि अंकों के समूहों को अलग करने के लिए लोगों की अलग-अलग व्यक्तिगत प्राथमिकताएं हो सकती हैं (., -, , आदि)।
संबंधित मुद्दे