java.lang.NumberFormatException: для входной строки: «20110328094108069414» - PullRequest
5 голосов
/ 01 апреля 2011

Я пытаюсь преобразовать строковое значение в long и получаю: java.lang.NumberFormatException: For input string: "20110328094108069414"

Мой код:

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

Ошибка:

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)

Ответы [ 6 ]

6 голосов
/ 01 апреля 2011

Максимально допустимое значение long равно

  9223372036854775807L

, а ваше значение равно:

  20110328094108069414L

Вы не можете использовать long для этого.Вместо этого вы можете использовать BigInteger, но, учитывая вариант использования, я думаю, что String будет наиболее подходящим типом.(Я не могу себе представить, что вам нужно , чтобы выполнять целочисленную арифметику для идентификаторов книг, и если вам нужно выполнить числовое сравнение, вы могли бы легко реализовать собственный компаратор, чтобы сделать это для десятичных строк.)

5 голосов
/ 01 апреля 2011

Я думаю, вам нужно использовать BigInteger или BigDecimal

Например:

BigInteger bi;

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

Также добавьте блок try-catch с NumberFormatException

1 голос
/ 01 апреля 2011

20110328094108069414 вне диапазона длинных.

0 голосов
/ 01 апреля 2011

Номер вне диапазона. Используйте BigInteger!

0 голосов
/ 01 апреля 2011

Я не думаю, что ярлык PSFT_20110328114728073793 когда-либо предназначался для арифметического использования.Кажется, это сочетание типа, даты и идентификатора.Как уже отмечали другие, 20110328114728073793 долго не уместится.Может быть, разбить строку на ее оригинальные части было бы лучше для вашего варианта использования?

0 голосов
/ 01 апреля 2011

Как насчет использования чего-то подходящего для хранения временных меток больше, чем просто длинных? Дата урока? или JodaTime? Вероятно, этот пост также будет полезен: Время Joda: Как конвертировать String в LocalDate?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...