Ich habe mehrere Fragen zu dem Thema in dem Thema erwähnt (z. B. this one), aber es scheint mir, dass keiner von ihnen dieses Beispiel zur Verfügung gestellt. Ich verwende Java7 und ich möchte eine String
was einer hexadezimalen oder eine Dezimalzahl in einen Integer
oder Long
Wert konvertieren (hängt davon ab, was es darstellt) und ich folgendes tun:Konvertieren von Hex in Java, falscher Wert mit negativen Werten
public Number getIntegerOrLong(String num) {
try {
return Integer.decode(num);
} catch (NumberFormatException nf1) {
final long decodedLong = Long.decode(num);
if ((int) decodedLong == decodedLong) {//used in Java8 java.util.Math.toIntExact()
return (int) decodedLong;
}
return decodedLong;
}
}
Wenn ich einen String verwenden darstellt Wenn ich eine Dezimalzahl alles ist in Ordnung, das Problem mit negativen hexadezimal
Jetzt entstehen, tun:
String hex = "0x"+Integer.toHexString(Integer.MIN_VALUE);
Object number = getIntegerOrLong(hex);
assertTrue(number instanceof Integer):
fehlschlägt, weil es eine Long
zurückgibt. Gleiches gilt für andere negative ganzzahlige Werte.
Außerdem, wenn ich Long.MIN_VALUE
wie im folgenden Beispiel:
String hex = "0x"+Integer.toHexString(Long.MIN_VALUE);
Object number = getIntegerOrLong(hex);
assertTrue(number instanceof Long):
ausfällt, wegen NumberFormatException
mit Nachricht:
java.lang.NumberFormatException: For input string: "8000000000000000"
Ich versuchte auch mit anderen zufälligen Long
Werte (so im Lang .MIN_VALUE und Long.MAX_VALUE, und es schlägt auch fehl, wenn ich negative Zahlen habe, zB
die String
mit dem hexadezimalen 0xc0f1a47ba0c04d89
für die Long
Nummer -4,543,669,698,155,229,815
kehrt:
java.lang.NumberFormatException: For input string: "c0f1a47ba0c04d89"
Wie kann ich das Skript beheben, um das gewünschte Verhalten zu erhalten?
@Aaron, tut mir leid, schlechte Typisierung. Ich mache '" 0x "+ Integer.toHexString (Integer.MIN_VALUE)'. Ist das auch schlecht? –