Überprüfen, ob String, hexadezimal
Ich habe einen String wie "09a" und ich brauche eine Methode, um zu bestätigen, wenn der text ist hexadezimal. Der code, den ich gepostet habe etwas ähnliches macht, es wird überprüft, ob ein string eine Dezimalzahl. Ich möchte das gleiche zu tun, aber für hexadezimal.
private static boolean isNumeric(String cadena) {
try {
Long.parseLong(cadena);
return true;
} catch (NumberFormatException nfe) {
JOptionPane.showMessageDialog(null,"Uno de los números, excede su capacidad.");
return false;
}
}
InformationsquelleAutor Axel Vazquez | 2012-07-11
Du musst angemeldet sein, um einen Kommentar abzugeben.
Gibt es eine überladene
Lang.parseLong
, nimmt einen zweiten parameter, der angibt, die radix:Als alternative könnten Sie auch die Iteration über die Zeichen in der Zeichenfolge, und nennen
- Zeichen.Ziffer(c,16)
auf Sie (wenn einer von Ihnen zurück-1
es ist keine gültige Hexadezimalziffer). Dies ist besonders nützlich, wenn der string zu groß ist, um in einemlong
(wie schon in den Kommentaren, das wäre eine Ausnahme, wenn die erste Methode verwendet wird). Beispiel:BTW, würde ich vorschlagen, die Trennung der Anliegen der "Prüfung auf eine gültige Zahl" und "anzeigen einer Nachricht an den Benutzer", das ist, warum ich einfach zurück
false
im obigen Beispiel anstelle der Mitteilung an die user ersten.Schließlich, Sie könnte einfach mit einem regulären Ausdruck:
Character.forDigit(c,16)
(wenn keine von Ihnen null zurück -'\0'
- es ist keine gültige Hexadezimalziffer). Oder einen regulären Ausdruck verwenden (obwohl es wäre komplizierter und möglicherweise schlechter).Die
Character.forDigit(..)
Ansatz, den Sie angegeben haben, ist ungültig.Character.forDigit(..)
nimmt in einem int und wandelt es in ein char, nicht die andere Weise herum.Dies wird auch eine Ausnahme, wenn der String zu lang ist, was vielleicht nicht gewünscht (vor allem, wenn der String wird verwendet, um eine BigInteger, zum Beispiel).
Während wir gerade dabei sind, Ihre isNumeric Methode gibt false zurück, für Streicher, mit einem "-" vor der Zahl, die gültig sind negative zahlen. Vor der iteration, würde ich ein Häkchen setzen, wenn der erste char ein '-' und wenn ja, wird die iteration beginnen soll ab dem zweiten index. Es sollte auch false zurückgeben, wenn ein '-' ist das einzige Zeichen in der Zeichenfolge.
Bemerkung:
Long.parseLong("f7e511c46d1b8a03", 16)
wird nicht funktionieren, die Feuer NumberFormatException (ungültige lang). So Durchlaufen oder regex sein könnte, bessere Entscheidungen für größere hexadezimal.InformationsquelleAutor mgibsonbr
Schrecklichen Missbrauch von Ausnahmen. Nicht immer tun Sie dies! (Es ist nicht mir, es ist Josh Bloch Effektiv Java). Wie auch immer, ich schlage vor,
parseLong
und fangen Sie die Ausnahme. Josh ' s Buch gibt ein Beispiel, wo die Ausnahme wird immer geworfen werden, um die Kontrolle eines Loop-Schleife ist nicht wirklich so. Außerdem Joshs Anliegen auch zu tun mit Effizienz und Lesbarkeit, aber Sie vorschlagen, REGEX, die beide langsamer und weniger lesbar.Jetzt (aus meiner benchmarking) mit Ihrem regex ist ein bisschen langsamer als die
parseLong
unter der Annahme, dass die überwiegende Mehrheit der Saiten sind tatsächlich korrekt. Ich habe eigentlich damit einverstanden, dass die Verwendung von Ausnahmen ist vielleicht nicht perfekt, und es gibt bessere Lösungen gibt, mein haupteinwand gegen Ihre Antwort ist, dass Sie vorschlagen, etwas, dass schlimmer ist als die Verwendung von Ausnahmen.Das kompilieren der regex-es ist jedes mal überprüft, es ist in der Regel besser, ein Muster verwenden.
InformationsquelleAutor Evgeniy Dorofeev
Verwendet, diese in meinen eigenen code zu überprüfen, wenn die Zeichenfolge ist die MAC-Adresse
Mein Rindfleisch mit den anderen Antworten in diesem thread ist, dass, wenn die Zeichenfolge die Länge ist groß, es würde eine exception werfen, wie gut. Daher nicht sehr nützlich, wenn Sie testen ob eine MAC-Adresse besteht aus gültige hexadezimal.
Seien Sie nicht Angst vor der Verwendung von regex!
InformationsquelleAutor laycat
Lange.parseLong hat eine zweite form, die in ein radix als zweites argument.
InformationsquelleAutor Tony
Hier einige Codes für unterschiedliche Optionen und die Ausführungsdauer (JDK 8):
Test-code:
InformationsquelleAutor toongeorges
Nein-Bibliothek Ansatz
InformationsquelleAutor Braden Steffaniak
Können Sie überprüfen, text beliebiger Länge mit folgenden Verfahren zu praktisch.
if (!hexDigits.Contains(symbol)) return false;
).Dies ist nicht ein sehr effizienter Weg, um zu überprüfen, ob ein String, hexadezimal, und der ternäre operator, der in der return-Anweisung ist überflüssig.
InformationsquelleAutor Warrior