java .lang.NumberFormatException: для входной строки: "52586380" в java .lang.NumberFormatException.forInputString (неизвестный источник) - PullRequest
1 голос
/ 18 апреля 2020

Я пишу простую функцию, которая принимает строку -2739379824/2752586380‬/2286078538, разбивает ее на 3 строки и преобразует каждую строку в большое целое число. Проблема состоит в том, что преобразование первой и третьей строки успешно, но для второй строки я получаю следующую ошибку: Значения
-2739379824 2752586380‬ 2286078538 a: -2739379824


    Exception in component tJava_1 (Montant)
    java.lang.NumberFormatException: For input string: "52586380‬"
        at java.lang.NumberFormatException.forInputString(Unknown Source)
        at java.lang.Integer.parseInt(Unknown Source)
        at java.math.BigInteger.<init>(Unknown Source)
        at java.math.BigInteger.<init>(Unknown Source)

Я пытался преобразовать вторую строку один раз много раз, иногда я получаю правильный вывод, иногда эту ошибку, и я не понимаю, почему. Это моя функция:

        public static BigDecimal myfunction (String Value) {

            String[] Valuestring  = Value.split("/");    
            System.out.println("Values  ");
            System.out.println(Valuestring[0]);
            System.out.println(Valuestring[1]);
            System.out.println(Valuestring[2]);
            BigInteger a = new BigInteger(Valuestring[0]) ;
            System.out.print("a :") ;
            System.out.println(a) ;
            BigInteger b = new BigInteger(Valuestring[1]) ;
            System.out.println("b :") ;
            System.out.println(b) ;
            BigInteger c = new BigInteger(Valuestring[2]) ;
            System.out.println("c :") ;
            System.out.println(c) ;
        }

Ответы [ 2 ]

2 голосов
/ 18 апреля 2020

Не копируйте и не вставляйте значение String, в нем может быть скрыт специальный символ. Я попробовал ваш код, и он дал мне ошибку, как вы сказали. Затем я попытался удалить / и набрать его сам, это сработало. Может быть, копировать вставить источник имеет специальный символ, скрытый внутри. И использовал \\ в split()

public static void main( String[] args ) throws Exception
{
    String x = "-2739379824/2752586380‬/2286078538"; // your string as it is giving the error
    Test.myfunction( "-2739379824/2752586380/2286078538" ); // I tried deleting the / and typed it again
}

public static BigDecimal myfunction( String Value )
{

    String[] Valuestring = Value.strip().split( "\\/" );
    System.out.println( "Values  " );
    System.out.println( Valuestring[0] );
    System.out.println( Valuestring[1] );
    System.out.println( Valuestring[2] );
    BigInteger a = new BigInteger( Valuestring[0].strip() );
    System.out.print( "a :" );
    System.out.println( a );
    BigInteger b = new BigInteger( Valuestring[1].strip() );
    System.out.println( "b :" );
    System.out.println( b );
    BigInteger c = new BigInteger( Valuestring[2].strip() );
    System.out.println( "c :" );
    System.out.println( c );
    return null;
}
1 голос
/ 19 апреля 2020

@ Klaus говорит:

Не копируйте и вставляйте значение String, в нем может быть скрыт специальный символ.

В этом дело это правда. В вашей строке между 0 и вторым / есть один непечатаемый символ Unicode U+202C ("\u202C" как строка Java). Он используется для двунаправленного управления текстом (некоторые языки пишутся справа налево).

Просто поместите курсор в начало скопированного текста, а затем переместите его вправо с помощью курсора и после окончания 0 второго числа вы увидите, что один раз курсор, кажется, не двигается (но на самом деле он движется невидимо). Там вы также можете удалить невидимый символ, исправляя вашу программу.


Обновление: Вот короткая версия, которая работает даже со специальным символом, все еще содержащимся в строке. Он использует .split("[^0-9-+]+"), чтобы разделить что-либо между целыми числами (плюс / минус для положительных / отрицательных чисел также обрабатываются правильно), а не просто по sla sh (/).

package de.scrum_master;

import java.math.BigInteger;
import java.util.Arrays;

public class Dummy {
  public static void main(String[] args) {
    Arrays
      .asList("-2739379824/2752586380‬/2286078538".split("[^0-9-+]+"))
      .stream()
      .map(BigInteger::new)
      .forEach(System.out::println);
  }
}

Журнал консоли:

-2739379824
2752586380
2286078538

Я думаю, вы можете взять его отсюда и настроить в соответствии со своими потребностями. Кстати, я согласен с Клаусом, что вы должны убедиться, что ваши входные строки чистые, чем чистить их вручную. Но если ваши строки, например, скопированы с веб-сайта, вам лучше использовать решение, подобное моему, чтобы убедиться, что программа работает должным образом. Никогда не доверяйте данным из внешних источников.

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