5 Stimmen

java.lang.NumberFormatException: Für Eingabe-String: "20110328094108069414"

Ich versuche, einen String-Wert in einen Long-Wert zu konvertieren, und erhalte : java.lang.NumberFormatException: For input string: "20110328094108069414"

Mein Code :

  String buyId  = "PSFT_20110328114728073793";
  long bookId  = Long.parseLong(buyId  .replaceAll("PSFT_",""));

Fehler:

10:12:10,522 ERROR [STDERR] java.lang.NumberFormatException: For input string: "20110328094108069414"
10:12:10,522 ERROR [STDERR]     at java.lang.NumberFormatException.forInputString(NumberFormatException.java:48)
10:12:10,522 ERROR [STDERR]     at java.lang.Long.parseLong(Long.java:415)
10:12:10,522 ERROR [STDERR]     at java.lang.Long.parseLong(Long.java:461)
10:12:10,522 ERROR [STDERR]     at unilog.com.user.ejb.userDAOORCL.checkCWSUserReg(userDAOORCL.java:363)
10:12:10,522 ERROR [STDERR]     at unilog.com.user.ejb.userEJBBean.checkCWSUserReg(userEJBBean.java:141)
10:12:10,522 ERROR [STDERR]     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
10:12:10,523 ERROR [STDERR]     at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
10:12:10,523 ERROR [STDERR]     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
10:12:10,523 ERROR [STDERR]     at java.lang.reflect.Method.invoke(Method.java:585)
10:12:10,523 ERROR [STDERR]     at org.jboss.invocation.Invocation.performCall(Invocation.java:359)
10:12:10,523 ERROR [STDERR]     at org.jboss.ejb.StatelessSessionContainer$ContainerInterceptor.invoke(StatelessSessionContainer.java:237)
10:12:10,523 ERROR [STDERR]     at org.jboss.resource.connectionmanager.CachedConnectionInterceptor.invoke(CachedConnectionInterceptor.java:158)

6voto

Stephen C Punkte 665668

Die größte erlaubte long es

  9223372036854775807L

und Ihr Wert ist:

  20110328094108069414L

Sie können nicht mit einem long für diese. Sie könnten verwenden BigInteger stattdessen, aber angesichts des Anwendungsfalles denke ich, dass String wäre der geeignetste Typ. (Ich kann mir nicht vorstellen, dass Sie unter um Integer-Arithmetik mit Buch-IDs durchzuführen, und wenn Sie numerische Vergleiche durchführen müssen, können Sie leicht einen benutzerdefinierten Comparator implementieren, um dies mit dezimalen Zeichenketten zu tun).

5voto

evilone Punkte 21922

Ich denke, Sie müssen Folgendes verwenden BigInteger o BigDecimal

Zum Beispiel:

BigInteger bi;

String buyId  = "PSFT_20110328114728073793";
bi  = new BigInteger(buyId.replaceAll("PSFT_",""));

Try-Catch-Block hinzufügen, mit NumberFormatException

1voto

RollingBoy Punkte 2727

20110328094108069414 liegt außerhalb der Reichweite von long.

0voto

Alex Nikolaenkov Punkte 2477

Wie wäre es, etwas zu verwenden, das sich für die Speicherung von Zeitstempeln eignet, die nicht nur eine Länge haben? Date-Klasse? oder JodaTime? Wahrscheinlich wird dieser Beitrag auch hilfreich sein: JodaTime : Wie konvertiert man String in LocalDate?

0voto

sthysel Punkte 367

Ich glaube nicht, dass die Bezeichnung PSFT_20110328114728073793 jemals für arithmetische Zwecke verwendet werden sollte. Es scheint eine Kombination aus Typ, Datum und ID zu sein. Wie bereits von anderen erwähnt, passt 20110328114728073793 nicht in ein long. Vielleicht wäre es für Ihren Anwendungsfall sinnvoller, die Zeichenkette in ihre ursprünglichen Teile zu zerlegen?

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X