Почему contains (“.”) он 'true', но split (“.”) он дает мне пустой array?

Давайте брать этот метод:

public static void getDecimalPart(double n) {
    int decimales = 0;

    // convertimos el valor a string
    String decimalPartString = String.valueOf(n);

    // comprobamos si contiene punto de decimales
    if (decimalPartString.contains(".")) { 
        // lo partimos y lo ponemos en un array
        String[] doubleArray = decimalPartString.split(".");
        // calculamos los decimales
        decimales = (int) (Double.valueOf(doubleArray[1]) * (Math.pow(10, doubleArray[1].length()-2)));
    }

    // imprimimos
    System.out.println("El numero " + n + " tiene " + decimales + " decimales");
}

Подтверди, если цепь contains(".") и в утвердительном случае он делает split(".")... тогда....: почему, когда я выполняю?:

public static void main(String[] args) {
    getDecimalPart(1.25698);
}

Exception in thread "main" java.lang. ArrayIndexOutOfBoundsException: 1 at q1607. Q38239413.getDecimalPart (Q38239413.java:25) at q1607. Q38239413.main (Q38239413.java:14)

Отлаживая даже он расстраивает меня еще больше, так как array полностью пустой, не дает IOOB из-за того, что 1 просит положение, и чтобы он не существовал, но:

doubleArray = []

Что я не вижу, или что я забываю?, я уверен, что это что-то полностью очевидно, но это не вижу....


Вещи, которые я протестировал:

  • Использовать запятую.
  • Использовать десятичный символ системы:

    DecimalFormat format=(DecimalFormat) DecimalFormat.getInstance();
    DecimalFormatSymbols symbols=format.getDecimalFormatSymbols();
        char sep=symbols.getDecimalSeparator();
    
  • В конце концов я сделал различный метод, но остаюсь с интригой, из чего он переходит.

7
задан 07.07.2016, 17:46
2 ответа

Из-за которого в split цепь, которую ты перемещаешь, - регулярное выражение (regex) и внутри регулярных выражений точка "." у него есть специальное значение. Если ты хочешь использовать это как точка, ты это должен убегать "\\."

В то время как метод contains не просит regex а один String и поэтому функционируй как ожидание.

В java осталось бы нечто похожее:

String[] palabras = linea.split("\\.");

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

8
ответ дан 24.11.2019, 13:53
  • 1
    Привет @Daniel, у тебя есть raz и # 243; n, раньше я снял этикетку regex, но уже направил ее в в и # 241; adir, извини из-за моей ошибки. Хороший ответ! B и # 225; sicamente нужно убегать ., но я думаю, что tora способ - вместо utilziar string, utilziar split с char такой точки, которую схвати, и # 237;: split('.') таким образом уже не regex (я верю):) – Miquel Coll 07.07.2016, 12:55
  • 2
    Это с этикетки он оставил меня смещенным jaja, но он ничего не перемещает, не problemo. Прием использования этого как char не conoc и # 237; в, никогда я это не тестировал! Est и # 225; хорошо знать это! – Daniel Faro 07.07.2016, 12:58
  • 3
    принятая miquel, идеал add-on из значения точки и соединение regex... Конечно..... пошла pajareo со своей стороны, правда, не, который произошел со мной, ma и # 241; аны - очень твердые xDDDDDDDDD – Jordi Castilla 07.07.2016, 13:22
  • 4
    Меня зовут Даниэль jajaja. Если, что est и # 225; s я умираю in the morning xd – Daniel Faro 07.07.2016, 13:24
  • 5
    @Daniel выше сказанное, я должен спать м и # 225; s... :P – Jordi Castilla 07.07.2016, 14:57

Поскольку он упоминает о Luiggi Мендосе, методе split(String regex) получи как параметр цепь, которая представляет регулярное выражение. Другой альтернативный метод для того, чтобы тебя взяла точка . как характер расставания ты можешь применять следующее:

double valor = 8545200054.846546;

String ValorStrExponente = String.valueOf(valor);
String ValorStrCompleto = BigDecimal.valueOf(valor).toPlainString();

String[] PartesValor = ValorStrCompleto.split("[.]");

System.out.println("Valor convertido directo a String: "+ValorStrExponente);
System.out.println("Parte entera: "+PartesValor[0]);
System.out.println("Parte decimal: "+PartesValor[1]);

Если ты помещаешь квадратные скобки заключая в точку, он берет это тебе ясно как критерий расставания цепи. Также я рекомендую использовать метод toPlainString(double valor) класса BigDecimal, так как, если стоимость double который ты стараешься отделять в частях, очень большой и ты это конвертируешь прямо с String.valueOf(double valor), он даст тебе как оказанный показательная стоимость. Если ты скроллируешь предыдущий код, тебя производит следующий вывод:

Valor convertido directo a String: 8.545200054846546E9
Parte entera: 8545200054
Parte decimal: 846546
-1
ответ дан 24.11.2019, 13:53