Qual é o caminho certo para representar números de telefone?

Estou com problemas para representar um número de celular em um dos meus aplicativos.

Eu queria saber se existe uma class Integer que permitirá que você armazene esse número começando com 0417254482. Talvez usando uma seqüência de caracteres seja mais apropriado? No momento, quando estou tentando usar representar um número de telefone com ints, doubles longs, pareço armazenar números randoms e não os números que eu pretendia armazenar.

Use String . Além de qualquer outra coisa, você não poderá armazenar zeros à esquerda se usar números inteiros. Você definitivamente não deve usar int (muito pequeno) float ou double (muito risco de perda de dados – veja abaixo); long ou BigInteger poderia ser apropriado (além do principal problema dos zeros), mas francamente eu iria com String . Dessa forma, você também pode armazenar os traços ou espaços que o usuário inseriu para facilitar a memorização do número, se você quiser.

Em termos da “perda de dados” mencionada acima para float e doublefloat definitivamente não tem precisão suficiente; double poderia funcionar se você está feliz que você nunca precisará de mais de 16 dígitos (um par a menos do que você ganha com long ), mas você precisaria ser muito, muito cuidadoso em qualquer lugar que você converta o valor de double para string , você tem o valor exato. Muitas conversões de formatação fornecem uma aproximação que pode ter precisão de, digamos, 10 dígitos significativos, mas você deseja um número inteiro exato. Basicamente, usar ponto flutuante para números de telefone é uma ideia fundamentalmente ruim. Se você tiver que usar um tipo numérico de largura fixa, use um long , mas idealmente, evite-o completamente.

Pense nisso: um número de telefone é realmente um número? Faz sentido adicionar (ou fazer outra operação aritmética) com números de telefone? Números de telefone são códigos, eles geralmente são representados com números, mas isso é apenas uma convenção e, talvez, em outro país, as letras de uso também (eu acabei de perceber, que números de telefone internacionais? Eles têm um + no começo. Você precisa pensar sobre a natureza das coisas que deseja representar e depois encontrar a representação mais adequada.

Crie sua própria class PhoneNumber com um campo particular do tipo String para representá-la.

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

Você também pode representar o número com long ou BigInteger se todos os números de telefone tiverem o mesmo tamanho, mas tenha cuidado com os zeros iniciais.

Um número de telefone não é realmente um inteiro (ou uma string). É outra coisa que deve ter uma class própria.

EDIT: mais uma coisa: eu não iria implementar um setter para esta class porque um object de número de telefone seria melhor imutável

Embora os números de telefone sejam números nomeados, eles normalmente não são números (por exemplo, zeros à esquerda, prefixo do país + XX, …).

Portanto, há duas possibilidades para representar um número de telefone corretamente dentro de um programa:

  1. Usando String para manter o número inteiro como inserido.
  2. Usando um tipo de dados personalizado que oferece suporte adicional para resources de números de telefone

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

    }

É realmente interessante observar todas as diferentes convenções usadas internacionalmente

Você deve usar uma string ou uma estrutura de dados mais especializada.

A principal razão é que as operações que você pode fazer em números de telefone são lexicográficas e não aritméticas. Por exemplo, você pode dizer que os números de telefone da França começam com +33 , mas você não pode presumir que eles estejam em um intervalo numérico.

Esses outros argumentos não são válidos na minha opinião

  • um número de telefone pode include * ou # . Esses símbolos podem ser transportados em linhas telefônicas, mas não fazem parte do próprio número de telefone, e considero que está fora do escopo.
  • um número de telefone pode começar com zeros à esquerda . Números de telefone locais podem, mas eles são uma representação limitada em primeiro lugar. Números de telefone internacionais começam com um código de país e nenhum deles tem um zero à esquerda. Portanto, nenhum número de telefone internacional tem zeros à esquerda.
  • um número de telefone começa com + . Um número pode perfeitamente representar isso simplesmente sendo positivo. Também começando com + é apenas uma representação dos números E164, para que eles possam ser distinguidos dos números locais. Eles realmente não precisam, se você manipular apenas números E164.
  • um número de telefone pode conter espaços ou parênteses . Isso é absurdo, porque é apenas uma representação textual do número. Você não deve armazenar isso, pois as pessoas podem ter diferentes preferências pessoais para separar grupos de dígitos ( . , - , , etc.).

Você deve usar string para suportar números com zeros à esquerda. O código que você forneceu foi:

 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 } 

No construtor, o número é string, mas quando você chama o construtor, você usou um int para o número de telefone. Deve ter havido um erro de compilation aqui em java, eu acho. Este é o mesmo código que você compilou?

Cada número tem uma quantidade infinita de zeros no lado esquerdo e direito,

Para representá-lo, você deve usar um formato de string

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

Usado% 010d significa% [argument_index $] [flags] [largura] [. Precisão] conversão

flag 0 – zeros de preenchimento 10 – quantidade de zeros de preenchimento d – inteiro decimal

A implementação da interface Comparable oferece a possibilidade de ordenar a Lista.

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

A saída é

  0000000000 0000000123 0000000124 0000000125 0000000126 0000123777 

Formatador de String Comparável

Se você quer fazer validação e normalização, você provavelmente vai querer contar com uma biblioteca que o faça proerly para você. https://github.com/googlei18n/libphonenumber é uma das opções mais comuns.

Intereting Posts