Давайте брать этот метод:
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();
В конце концов я сделал различный метод, но остаюсь с интригой, из чего он переходит.
Из-за которого в split цепь, которую ты перемещаешь, - регулярное выражение (regex) и внутри регулярных выражений точка "."
у него есть специальное значение. Если ты хочешь использовать это как точка, ты это должен убегать "\\."
В то время как метод contains
не просит regex а один String
и поэтому функционируй как ожидание.
В java осталось бы нечто похожее:
String[] palabras = linea.split("\\.");
Из-за того, что она расширяет немного ответ, в регулярных выражениях точка - групповой символ, что значит, что он служит для того, чтобы захватить любой характер. У тебя есть больше info в RegexOne
Поскольку он упоминает о 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
regex
, но уже направил ее в в и # 241; adir, извини из-за моей ошибки. Хороший ответ! B и # 225; sicamente нужно убегать.
, но я думаю, что tora способ - вместо utilziar string, utilziar split сchar
такой точки, которую схвати, и # 237;:split('.')
таким образом уже не regex (я верю):) – Miquel Coll 07.07.2016, 12:55:P
– Jordi Castilla 07.07.2016, 14:57