J'ai stocké des numéros de téléphone longs et je voudrais simplement ajouter des traits d'union lors de l'impression du numéro de téléphone sous forme de chaîne.
J'ai essayé d'utiliser DecimalFormat
mais cela n'aime pas le trait d'union. Probablement parce qu'il est destiné à formater des nombres décimaux et non plus long.
long phoneFmt = 123456789L;
DecimalFormat phoneFmt = new DecimalFormat("###-###-####");
System.out.println(phoneFmt.format(phoneNum)); //doesn't work as I had hoped
Idéalement, j'aimerais aussi avoir des parenthèses sur l'indicatif régional.
new DecimalFormat("(###)-###-####");
Quelle est la bonne façon de faire cela?
Voici comment j'ai fini par le faire:
private String printPhone(Long phoneNum) {
StringBuilder sb = new StringBuilder(15);
StringBuilder temp = new StringBuilder(phoneNum.toString());
while (temp.length() < 10)
temp.insert(0, "0");
char[] chars = temp.toString().toCharArray();
sb.append("(");
for (int i = 0; i < chars.length; i++) {
if (i == 3)
sb.append(") ");
else if (i == 6)
sb.append("-");
sb.append(chars[i]);
}
return sb.toString();
}
Je comprends que cela ne prend pas en charge les numéros internationaux, mais je n’écris pas une "vraie" application, je ne suis donc pas préoccupé par cela. Je n'accepte que 10 caractères comme numéro de téléphone. Je voulais juste l'imprimer avec un peu de formatage.
Merci pour les réponses.
Vous pouvez utiliser String.replaceFirst avec une méthode regex comme
long phoneNum = 123456789L;
System.out.println(String.valueOf(phoneNum).replaceFirst("(\\d{3})(\\d{3})(\\d+)", "($1)-$2-$3"));
Pour obtenir le résultat souhaité:
long phoneFmt = 123456789L;
//get a 12 digits String, filling with left '0' (on the prefix)
DecimalFormat phoneDecimalFmt = new DecimalFormat("0000000000");
String phoneRawString= phoneDecimalFmt.format(phoneFmt);
Java.text.MessageFormat phoneMsgFmt=new Java.text.MessageFormat("({0})-{1}-{2}");
//suposing a grouping of 3-3-4
String[] phoneNumArr={phoneRawString.substring(0, 3),
phoneRawString.substring(3,6),
phoneRawString.substring(6)};
System.out.println(phoneMsgFmt.format(phoneNumArr));
Le résultat sur la console ressemble à ceci:
(012) -345-6789
Pour stocker des numéros de téléphone, vous devez envisager en utilisant un type de données autre que des chiffres .
Le moyen le plus simple de procéder consiste à utiliser MaskFormatter intégré à la bibliothèque javax.swing.text .
Vous pouvez faire quelque chose comme ça:
import javax.swing.text.MaskFormatter;
String phoneMask= "###-###-####";
String phoneNumber= "123423452345";
MaskFormatter maskFormatter= new MaskFormatter(phoneMask);
maskFormatter.setValueContainsLiteralCharacters(false);
maskFormatter.valueToString(phoneNumber) ;
Si vous avez vraiment besoin de la bonne manière, vous pouvez utiliser la source ouverte récente de Google libphonenumber
La pire solution possible serait:
StringBuilder sb = new StringBuilder();
long tmp = phoneFmt;
sb.append("(");
sb.append(tmp / 10000000);
tmp = tmp % 10000000;
sb.append(")-");
sb.apppend(tmp / 10000);
tmp = tmp % 10000000;
sb.append("-");
sb.append(tmp);
Vous pouvez implémenter votre propre méthode pour le faire pour vous, je vous recommande d'utiliser quelque chose comme ça. Utiliser DecimalFormat
et MessageFormat
. Avec cette méthode, vous pouvez utiliser à peu près tout ce que vous voulez (String,Integer,Float,Double
) et la sortie sera toujours exacte.
import Java.text.DecimalFormat;
import Java.text.MessageFormat;
/**
* Created by Yamil Garcia Hernandez on 25/4/16.
*/
public class test {
// Constants
public static final DecimalFormat phoneFormatD = new DecimalFormat("0000000000");
public static final MessageFormat phoneFormatM = new MessageFormat("({0}) {1}-{2}");
// Example Method on a Main Class
public static void main(String... args) {
try {
System.out.println(formatPhoneNumber("8091231234"));
} catch (Exception e) {
e.printStackTrace();
}
try {
System.out.println(formatPhoneNumber("18091231234"));
} catch (Exception e) {
e.printStackTrace();
}
try {
System.out.println(formatPhoneNumber("451231234"));
} catch (Exception e) {
e.printStackTrace();
}
try {
System.out.println(formatPhoneNumber("11231234"));
} catch (Exception e) {
e.printStackTrace();
}
try {
System.out.println(formatPhoneNumber("1231234"));
} catch (Exception e) {
e.printStackTrace();
}
try {
System.out.println(formatPhoneNumber("231234"));
} catch (Exception e) {
e.printStackTrace();
}
try {
System.out.println(formatPhoneNumber(""));
} catch (Exception e) {
e.printStackTrace();
}
try {
System.out.println(formatPhoneNumber(0));
} catch (Exception e) {
e.printStackTrace();
}
try {
System.out.println(formatPhoneNumber(8091231234f));
} catch (Exception e) {
e.printStackTrace();
}
}
// Magic
public static String formatPhoneNumber(Object phone) throws Exception {
double p = 0;
if (phone instanceof String)
p = Double.valueOf((String) phone);
if (phone instanceof Integer)
p = (Integer) phone;
if (phone instanceof Float)
p = (Float) phone;
if (phone instanceof Double)
p = (Double) phone;
if (p == 0 || String.valueOf(p) == "" || String.valueOf(p).length() < 7)
throw new Exception("Paramenter is no valid");
String fot = phoneFormatD.format(p);
String extra = fot.length() > 10 ? fot.substring(0, fot.length() - 10) : "";
fot = fot.length() > 10 ? fot.substring(fot.length() - 10, fot.length()) : fot;
String[] arr = {
(fot.charAt(0) != '0') ? fot.substring(0, 3) : (fot.charAt(1) != '0') ? fot.substring(1, 3) : fot.substring(2, 3),
fot.substring(3, 6),
fot.substring(6)
};
String r = phoneFormatM.format(arr);
r = (r.contains("(0)")) ? r.replace("(0) ", "") : r;
r = (extra != "") ? ("+" + extra + " " + r) : r;
return (r);
}
}
Le résultat sera
(809) 123-1234
+1 (809) 123-1234
(45) 123-1234
(1) 123-1234
123-1234
023-1234
Java.lang.NumberFormatException: empty String
at Sun.misc.FloatingDecimal.readJavaFormatString(FloatingDecimal.Java:1842)
at Sun.misc.FloatingDecimal.parseDouble(FloatingDecimal.Java:110)
at Java.lang.Double.parseDouble(Double.Java:538)
at Java.lang.Double.valueOf(Double.Java:502)
at test.formatPhoneNumber(test.Java:66)
at test.main(test.Java:45)
Java.lang.Exception: Paramenter is no valid
at test.formatPhoneNumber(test.Java:78)
at test.main(test.Java:50)
(809) 123-1232
Vous pouvez aussi formater toute chaîne contenant des caractères non numériques au format souhaité, utilisez ma classe util pour formater
public static void main(String[] args){
String num = "ab12345*&67890";
System.out.println(PhoneNumberUtil.formateToPhoneNumber(num,"(XXX)-XXX-XXXX",10));
}
vous pouvez spécifier n’importe quel format tel que XXX-XXX-XXXX et la longueur du numéro de téléphone. Si la longueur saisie est supérieure à la longueur spécifiée, la chaîne sera coupée.
Obtenez mon cours ici: https://github.com/gajeralalji/PhoneNumberUtil/blob/master/PhoneNumberUtil.Java
Vous pouvez également utiliser https://github.com/googlei18n/libphonenumber . Voici un exemple:
import com.google.i18n.phonenumbers.NumberParseException;
import com.google.i18n.phonenumbers.PhoneNumberUtil;
import com.google.i18n.phonenumbers.Phonenumber;
String s = "18005551234";
PhoneNumberUtil phoneUtil = PhoneNumberUtil.getInstance();
Phonenumber.PhoneNumber phoneNumber = phoneUtil.parse(s, Locale.US.getCountry());
String formatted = phoneUtil.format(phoneNumber, PhoneNumberUtil.PhoneNumberFormat.NATIONAL);
Ici vous pouvez obtenir la bibliothèque sur votre chemin de classe: http://mvnrepository.com/artifact/com.googlecode.libphonenumber/libphonenumber
DecimalFormat
n'autorise pas le texte arbitraire entre le nombre à formater, tout comme un préfixe ou un suffixe. Donc, il ne pourra pas vous aider là-bas.
À mon avis, enregistrer un numéro de téléphone sous forme de valeur numérique est totalement faux. Et si je veux stocker un numéro international? De nombreux pays utilisent +
pour indiquer un code de pays (par exemple, +1
pour USA/Canda), d'autres utilisent 00
(par exemple, 001
).
Les deux ne peuvent pas vraiment être représentés dans un type de données numérique ("Est-ce que ce nombre est 1555123 ou 001555123?")
J'aurais pensé que vous deviez utiliser un MessageFormat plutôt que DecimalFormat. Cela devrait être plus flexible.
Vous pouvez également utiliser la sous-chaîne et la concaténation pour faciliter la mise en forme.
telephoneNumber = "("+telephoneNumber.substring(0, 3)+")-"+telephoneNumber.substring(3, 6)+"-"+telephoneNumber.substring(6, 10);
Mais une chose à noter est que vous devez vérifier la longueur du champ du numéro de téléphone pour vous assurer que votre formatage est sécurisé.
String formatterPhone = String.format ("% s-% s-% s", phoneNumber.substring (0, 3), phoneNumber.substring (3, 6), phoneNumber.substring (6, 10));
Utiliser StringBuilder
pour les performances.
long number = 12345678L;
System.out.println(getPhoneFormat(String.valueOf(number)));
public static String getPhoneFormat(String number)
{
if (number == null || number.isEmpty() || number.length() < 6 || number.length() > 15)
{
return number;
}
return new StringBuilder(25).append("(").append(number.substring(0, 3))
.append(") ").append(number.substring(3, 6))
.append("-").append(number.substring(6))
.toString();
}
Pattern phoneNumber = Pattern.compile("(\\d{3})(\\d{3})(\\d{4})");
// ...
Matcher matcher = phoneNumber(numberAsLineOf10Symbols);
if (matcher.matches) {
return "(" + matcher.group(1) + ")-" +matcher.group(2) + "-" + matcher.group(3);
}