videos varias ubicar representan recta punto numérica numeros numericos numerica normalizada metodos mantisa los fracciones flotante ejemplos computadora como java integer phone-number

java - varias - punto flotante metodos numericos



¿Cuál es la forma correcta de representar los números de teléfono? (8)

Aunque los números de teléfono son números con nombre, normalmente no son números (por ejemplo, ceros a la izquierda, prefijo del país + XX, ...).

Entonces, hay dos posibilidades para representar correctamente un número de teléfono dentro de un programa:

  1. Usando String para mantener el número completo como se ingresó.
  2. Uso de un tipo de datos personalizado que ofrece soporte adicional para las características del número de teléfono

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

    }

Es realmente interesante ver todas las convenciones diferentes que se usan internacionalmente

Tengo problemas para representar un número de teléfono móvil en una de mis aplicaciones.

Me preguntaba si existe una clase Integer que te permita almacenar ese número comenzando con 0417254482. ¿Quizás usar una cadena sea más apropiado? En la actualidad, cuando trato de usarlo, represento un número de teléfono con enteros, dobles largos, parece que almaceno números aleatorios y no los números que pretendo almacenar.


Cada número tiene una cantidad infinita de ceros en el lado izquierdo y derecho,

Para representarlo debes usar un formato de cuerda

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

Usado% 010d mean% [argument_index $] [flags] [width] [. Precision] conversion

flag 0 - ceros de relleno 10 - cantidad de ceros de relleno d - entero decimal

La implementación de la interfaz Comparable le brinda la posibilidad de ordenar la Lista.

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

El resultado es

0000000000 0000000123 0000000124 0000000125 0000000126 0000123777

Formateador de cadena Comparable


Cree su propia clase PhoneNumber con un campo privado de tipo String para representarlo.

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

También puede representar el número con Long o BigInteger si todos los números de teléfono tienen la misma longitud, pero tenga cuidado con los ceros a la izquierda.

Un número de teléfono no es realmente un número entero (o una cadena). Es algo más que debería tener una clase propia.

EDIT: una cosa más: no implementaría un setter para esta clase porque un objeto de número de teléfono sería mejor inmutable


Debe usar una cadena o una estructura de datos más especializada.

La razón principal es que las operaciones que puede hacer en los números de teléfono son lexicográficas, y no aritméticas. Por ejemplo, puede decir que los números de teléfono de Francia comienzan con +33 , pero no puede suponer que están en un rango numérico.

Estos otros argumentos no son válidos en mi opinión

  • un número de teléfono puede incluir * o # . Estos símbolos se pueden transportar en líneas telefónicas, pero no son parte del número de teléfono en sí, y considero que están fuera del alcance.
  • un número de teléfono puede comenzar con ceros a la izquierda . Los números de teléfono locales pueden, pero son una representación limitada en primer lugar. Los números de teléfono internacionales comienzan con un código de país, y ninguno de ellos tiene un cero inicial. Por lo tanto, ningún número de teléfono internacional tiene ceros a la izquierda.
  • un número de teléfono comienza con + . Un número puede representar esto perfectamente, simplemente siendo positivo. Además, comenzar con + es solo una representación de los números E164, de modo que se puedan distinguir de los números locales. Realmente no tienen que hacerlo, si solo manipulas números E164.
  • un número de teléfono puede contener espacios o paréntesis . Esto es absurdo, porque es solo una representación textual del número. No debe almacenar esto ya que las personas pueden tener diferentes preferencias personales para separar grupos de dígitos ( . , - , , etc.)

Debe usar una cadena para admitir números con ceros a la izquierda. El código que proporcionó fue:

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 }

En el constructor, el número es una cadena, pero cuando llamas al constructor utilizas un int para el número de teléfono. Debe haber habido un error de compilación aquí en Java, creo. ¿Es este el mismo código que compiló?


Piense en esto: ¿un número de teléfono es realmente un número? ¿Tiene sentido agregar (o hacer otra operación aritmética) con números de teléfono? Los números de teléfono son códigos, por lo general se representan con números, pero eso es solo una convención y, tal vez, en otro país el uso de las letras también (me acabo de dar cuenta, ¿qué pasa con los números de teléfono internacionales? Tienen un + al principio. Debes pensar en la naturaleza de las cosas que quieres representar y, a continuación, buscar la representación más adecuada.


Si desea hacer la validación y la normalización, es probable que desee confiar en una biblioteca que lo haga de forma adecuada para usted. https://github.com/googlei18n/libphonenumber es una de las opciones más comunes.


Use String . Aparte de cualquier otra cosa, no podrás almacenar ceros a la izquierda si usas números enteros. Definitivamente no debería usar float int (demasiado pequeño) o double (demasiado riesgo de pérdida de datos - vea abajo); long o BigInteger podría ser apropiado (aparte del problema de ceros a la izquierda), pero francamente iría con String . De esta forma, también puede almacenar los guiones o espacios que el usuario ingresó para que sea más fácil recordar el número, si así lo desea.

En términos de la "pérdida de datos" mencionada anteriormente para float y double float definitivamente no tiene suficiente precisión; double podría funcionar si estás contento de que nunca necesitarás más de 16 dígitos (un par menos de lo que obtienes con el long ) pero necesitarías ser muy, muy cuidadoso de que en cualquier lugar que conviertas el valor de double a string , tienes el valor exacto Muchas conversiones de formato le proporcionarán una aproximación que puede ser exacta, digamos, 10 dígitos significativos, pero querría un número entero exacto. Básicamente, usar el punto flotante para números telefónicos es una idea fundamentalmente mala. Si tiene que usar un tipo numérico de ancho fijo, use un long , pero idealmente, evítelo por completo.