Was ist der richtige Weg, um Telefonnummern darzustellen?

Ich habe Probleme, eine Handynummer in einer meiner Anwendungen darzustellen.

Ich habe mich gefragt, ob es eine Integer-class gibt, die es erlaubt, eine solche Nummer zu speichern, beginnend mit 0417254482. Vielleicht ist es besser, eine Zeichenfolge zu verwenden? Derzeit, wenn ich versuche, eine Telefonnummer mit Ints zu verwenden, doubles longs scheint ich Zufallszahlen zu speichern und nicht die Zahlen, die ich speichern wollte.

Verwenden Sie String . Abgesehen von allem anderen können Sie führende Nullen nicht speichern, wenn Sie Ganzzahlen verwenden. Sie sollten auf keinen Fall int (zu klein) float oder double (zu großes Risiko von Datenverlust – siehe unten); long oder BigInteger könnte angemessen sein (abgesehen von der führenden Nullen Problem), aber ehrlich gesagt würde ich mit String gehen. Auf diese Weise können Sie auch beliebige Striche oder Leerzeichen speichern, die der Benutzer eingegeben hat, um die Nummer leichter merken zu können, wenn Sie möchten.

In Bezug auf den oben erwähnten “Datenverlust” für float und double float definitiv keine ausreichende Genauigkeit vorhanden; double könnte funktionieren, wenn Sie froh sind, dass Sie nie mehr als 16 Ziffern benötigen (ein paar weniger als Sie mit long ), aber Sie müssten sehr, sehr vorsichtig sein, dass Sie den Wert von double in string konvertieren. Du hast den genauen Wert. Bei vielen Formatierungskonvertierungen erhalten Sie eine Approximation, die beispielsweise auf 10 gültige Ziffern genau sein kann – Sie möchten jedoch eine exakte Ganzzahl. Grundsätzlich ist die Verwendung von Gleitkommazahlen für Telefonnummern eine grundsätzlich schlechte Idee. Wenn Sie einen numerischen Typ mit fester Breite verwenden müssen, verwenden Sie einen long Wert, vermeiden Sie ihn idealerweise jedoch vollständig.

Denken Sie darüber nach: Ist eine Telefonnummer wirklich eine Nummer? Macht es Sinn, Telefonnummern hinzuzufügen (oder eine andere arithmetische Operation durchzuführen)? Telefonnummern sind Codes, sie werden normalerweise mit Zahlen dargestellt, aber das ist nur eine Konvention und vielleicht auch in einem anderen Land die Verwendung von Buchstaben (ich habe gerade festgestellt, was ist mit internationalen Telefonnummern? Sie haben ein + am Anfang. Sie müssen über die Natur der Dinge nachdenken, die Sie darstellen möchten, und dann die am besten geeignete Darstellung finden.

Erstellen Sie Ihre eigene PhoneNumber-class mit einem privaten Feld vom Typ String, um es darzustellen.

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

Sie können die Nummer auch mit Long oder BigInteger darstellen, wenn alle Telefonnummern die gleiche Länge haben, aber seien Sie vorsichtig mit führenden Nullen.

Eine Telefonnummer ist nicht wirklich eine Ganzzahl (oder eine Zeichenfolge). Es ist etwas anderes, das eine eigene class haben könnte.

EDIT: noch eine Sache: Ich würde keinen Setter für diese class implementieren, weil ein Telefonnummer-Objekt besser unveränderlich wäre

Obwohl Telefonnummern benannte Nummern sind, sind sie normalerweise keine Nummern (z. B. führende Nullen, Länderpräfix + XX, …).

Es gibt also zwei Möglichkeiten, eine Telefonnummer in einem Programm korrekt darzustellen:

  1. Verwenden Sie String , um die ganze Zahl wie eingegeben beizubehalten.
  2. Verwenden eines benutzerdefinierten Datentyps, der zusätzliche Unterstützung für Telefonnummernfunktionen bietet

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

    }

Es ist wirklich interessant, sich all die verschiedenen Konventionen anzuschauen , die international verwendet werden

Sie sollten eine Zeichenfolge oder eine speziellere Datenstruktur verwenden.

Der Hauptgrund ist, dass die Operationen, die Sie für Telefonnummern ausführen können, lexikographisch und nicht arithmetisch sind. zB Sie können sagen, dass Telefonnummern für Frankreich mit +33 , aber Sie können nicht davon ausgehen, dass sie in einem numerischen Bereich liegen.

Diese anderen Argumente sind meiner Meinung nach nicht gültig

  • Eine Telefonnummer kann * oder # . Diese Symbole können zwar über Telefonleitungen übertragen werden, sind aber nicht Teil der Telefonnummer und ich halte sie für nicht zutreffend.
  • Eine Telefonnummer kann mit führenden Nullen beginnen . Lokale Telefonnummern können, aber sie sind in erster Linie eine begrenzte Darstellung. Internationale Telefonnummern beginnen mit einem Ländercode und keiner von ihnen hat eine führende Null. Daher hat keine internationale Telefonnummer führende Nullen.
  • Eine Telefonnummer beginnt mit + . Eine Zahl kann dies perfekt darstellen, indem sie einfach positiv ist. Auch beginnend mit + ist nur eine Darstellung von E164-Nummern, so dass sie von lokalen Nummern unterschieden werden können. Sie müssen es wirklich nicht, wenn Sie nur E164-Nummern manipulieren.
  • Eine Telefonnummer kann Leerzeichen oder Klammern enthalten . Das ist absurd, weil es nur eine textuelle Darstellung der Nummer ist. Sie sollten dies nicht speichern, da Personen unterschiedliche persönliche Präferenzen haben können, um Zifferngruppen zu trennen ( . , - , , etc.).

Sie sollten die Zeichenfolge verwenden, um Zahlen mit führenden Nullen zu unterstützen. Der von Ihnen angegebene Code war:

 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 } 

Im Konstruktor ist die Zahl eine Zeichenfolge, aber wenn Sie den Konstruktor aufrufen, haben Sie einen Int für die Telefonnummer verwendet. Es muss einen Kompilierungserrors hier in Java gegeben haben, denke ich. Ist das derselbe Code, den du kompiliert hast?

Jede Zahl hat unendlich viele Nullen auf der linken und rechten Seite,

Um es darzustellen, sollten Sie eine String-Formatierung verwenden

 class PhoneNumber implements Comparable { 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()); } } 

Verwendet% 010d Mittelwert% [Argument_index $] [Flags] [Breite] [. Präzision] Umwandlung

Flag 0 – Padding Nullen 10 – Anzahl der Padding-Nullen d – Dezimalzahl

Die Implementierung der Schnittstelle Vergleichbar gibt Ihnen die Möglichkeit, Liste zu sortieren.

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

Die Ausgabe ist

  0000000000 0000000123 0000000124 0000000125 0000000126 0000123777 

Vergleichbarer String-Formatierer

Wenn Sie eine validation und Normalisierung durchführen möchten, sollten Sie sich wahrscheinlich auf eine Bibliothek verlassen, die dies für Sie durchführt. https://github.com/googlei18n/libphonenumber ist eine der häufigsten Optionen.