Ich habe Telefonnummern als Longs gespeichert und möchte beim Drucken der Telefonnummer einfach Striche als Zeichenfolge hinzufügen.
Ich habe versucht, DecimalFormat
zu verwenden, aber das gefällt dem Bindestrich nicht. Wahrscheinlich, weil es für die Formatierung von Dezimalzahlen und nicht für Longs gedacht ist.
long phoneFmt = 123456789L;
DecimalFormat phoneFmt = new DecimalFormat("###-###-####");
System.out.println(phoneFmt.format(phoneNum)); //doesn't work as I had hoped
Im Idealfall hätte ich auch gerne Klammern über die Vorwahl.
new DecimalFormat("(###)-###-####");
Was ist der richtige Weg, dies zu tun?
So habe ich es gemacht:
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();
}
Ich verstehe, dass dies keine internationalen Nummern unterstützt, aber ich schreibe keine "echte" Anwendung, also bin ich darüber nicht besorgt. Ich akzeptiere nur 10 Zeichen lang als Telefonnummer. Ich wollte es nur mit etwas Formatierung drucken.
Danke für die Antworten.
Sie können String.replaceFirst mit der Regex-Methode verwenden
long phoneNum = 123456789L;
System.out.println(String.valueOf(phoneNum).replaceFirst("(\\d{3})(\\d{3})(\\d+)", "($1)-$2-$3"));
Um Ihre gewünschte Ausgabe zu erhalten:
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));
Das Ergebnis in der Konsole sieht folgendermaßen aus:
(012) -345-6789
Zum Speichern von Telefonnummern sollten Sie mit einem anderen Datentyp als Nummern verwenden.
Dies erreichen Sie am einfachsten mit dem integrierten MaskFormatter in der Bibliothek javax.swing.text .
Sie können so etwas tun:
import javax.swing.text.MaskFormatter;
String phoneMask= "###-###-####";
String phoneNumber= "123423452345";
MaskFormatter maskFormatter= new MaskFormatter(phoneMask);
maskFormatter.setValueContainsLiteralCharacters(false);
maskFormatter.valueToString(phoneNumber) ;
Wenn Sie wirklich den richtigen Weg benötigen, können Sie das kürzlich geöffnete libphonenumber von Google verwenden.
Die schlechteste Lösung wäre:
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);
Sie können Ihre eigene Methode implementieren, um dies für Sie zu tun. Ich empfehle Ihnen, etwas wie dieses zu verwenden. Verwendung von DecimalFormat
und MessageFormat
. Mit dieser Methode können Sie so ziemlich alles verwenden, was Sie möchten (String,Integer,Float,Double
), und die Ausgabe ist immer richtig.
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);
}
}
Ergebnis wird sein
(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
Sie können jede Zeichenfolge, die nicht numerische Zeichen enthält, auch in das von Ihnen gewünschte Format formatieren
public static void main(String[] args){
String num = "ab12345*&67890";
System.out.println(PhoneNumberUtil.formateToPhoneNumber(num,"(XXX)-XXX-XXXX",10));
}
sie können ein beliebiges Format wie XXX-XXX-XXXX und die Länge der Telefonnummer angeben. Wenn die Eingabelänge größer als die angegebene Länge ist, wird die Zeichenfolge abgeschnitten.
Holen Sie sich meine Klasse hier: https://github.com/gajeralalji/PhoneNumberUtil/blob/master/PhoneNumberUtil.Java
Sie können auch https://github.com/googlei18n/libphonenumber verwenden. Hier ist ein Beispiel:
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);
Hier können Sie die Bibliothek in Ihrem Klassenpfad abrufen: http://mvnrepository.com/artifact/com.googlecode.libphonenumber/libphonenumber
DecimalFormat
erlaubt nicht die Formatierung beliebiger Texte innerhalb der Zahl, nur als Präfix oder Suffix. Also kann es dir dort nicht helfen.
Meines Erachtens ist das Speichern einer Telefonnummer als numerischer Wert völlig falsch. Was ist, wenn ich eine internationale Nummer speichern möchte? Viele Länder verwenden +
, um einen Ländercode anzugeben (z. B. +1
für USA/Canda), andere verwenden 00
(z. B. 001
).
Beide können nicht wirklich in einem numerischen Datentyp dargestellt werden ("Ist diese Nummer 1555123 oder 001555123?")
Ich hätte gedacht, dass Sie ein MessageFormat anstelle von DecimalFormat verwenden müssen. Das sollte flexibler sein.
Sie können die Teilzeichenfolge und Verkettung auch für die einfache Formatierung verwenden.
telephoneNumber = "("+telephoneNumber.substring(0, 3)+")-"+telephoneNumber.substring(3, 6)+"-"+telephoneNumber.substring(6, 10);
Zu beachten ist jedoch, dass Sie die Länge des Telefonnummernfelds überprüfen müssen, um sicherzustellen, dass Ihre Formatierung sicher ist.
String formatterPhone = String.format ("% s-% s-% s") phoneNumberSubstring (0, 3), phoneNumberSubstring (3, 6), phoneNumberSubstring (6, 10));
Verwenden Sie StringBuilder
für die Leistung.
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);
}