Удалить конечный ноль в Java

У меня есть строки (из БД), которые могут содержать числовые значения. Если он содержит числовые значения, яЯ хотел бы удалить завершающие нули, такие как:

10.000010.234000

str.replaceAll("\\.0*$", ""), работает на первом, но не на втором.

Многие ответы указывают на использованиеBigDecimal, ноString Я могу получить не может быть числовым. Поэтому я думаю, что лучшее решение, вероятно, через Regex.

 Jens Piegsa20 февр. 2013 г., 17:21
@ Дэвид: Это сокращает все нецелые числа.
 Srujan Kumar Gulla20 февр. 2013 г., 20:53
Использовать DecimalFormat
 David20 февр. 2013 г., 17:17
Просто преобразуйте строку в int и верните ее обратно в строку.

Ответы на вопрос(10)

использованиеDecimalFormatЧистейший путь

String s = "10.1200";
DecimalFormat decimalFormat = new DecimalFormat("0.#####");
String result = decimalFormat.format(Double.valueOf(s));
System.out.println(result);
 maaartinus23 сент. 2014 г., 15:59
И, конечно же, самый медленный (и, может быть, даже самый сложный?).
 maaartinus30 авг. 2018 г., 17:20
@TheWanderer На второй мысли, я в основном согласен с вами. Регулярное выражение на самом деле довольно просто (и яЯ рекомендую изучать регулярные выражения на этом уровне), но более сложные регулярные выражения становятся слишком грязными и слишком быстрыми.
 TheWanderer29 авг. 2018 г., 22:41
@maaartinus, почему это сложно? Как тот, кто неЯ не очень хорошо знаю регулярные выражения, я могу понять этот код и адаптировать его к тому, что мне нужно. Regex может быть быстрее, но с точки зрения синтаксиса, это 'Это просто беспорядок для меня.

Следующее работает для всех следующих примеров:

"1" -> "1"
"1.0" -> "1"
"1.01500" -> "1.015"
"1.103" -> "1.103"

s = s.replaceAll("()\\.0+$|(\\..+?)0+$", "$2");
 Vignesh29 янв. 2019 г., 14:08
Вышеуказанное решение не работает для меня на 890.0 Я получаю 890null

Кент ответ на манипуляции со строками магически работает, а также учитывает потерю точности, но здесьболее чистое решение с использованием BigDecimal

String value = "10.234000";
BigDecimal stripedVal = new BigDecimal(value).stripTrailingZeros();

Затем вы можете конвертировать в другие типы

String stringValue = stripedVal.toPlainString();
double doubleValue = stripedVal.doubleValue();
long longValue = stripedVal.longValue();

Если потеря точности представляет собой конечную проблему для вас, тогда получите точное примитивное значение. Это вызовет исключение ArithmeticException, еслиБудет любая потеря точности для примитива. Увидеть ниже

int intValue = stripedVal.intValueExact();

Отделите часть дроби в первую очередь. Тогда вы можете использовать приведенную ниже логику.

BigDecimal value = BigDecimal.valueOf(345000);
BigDecimal div = new BigDecimal(10).pow(Integer.numberOfTrailingZeros(value.intValue()));
System.out.println(value.divide(div).intValue());

Я нахожу все остальные решения слишком сложными. Просто

s.replaceFirst("\\.0*$|(\\.\\d*?)0+$", "$1");

делает работу Сначала он пробует первый вариант, так что точка, за которой следуют все нули, заменяется ничем (так как группа нене устанавливается). В противном случае, если он находит точку, за которой следуют несколько цифр (как можно меньше из-за ленивого квантификатора*?) с последующими нулями, нули отбрасываются, когда онине входит в группу.Оно работает.

Предупреждение

Мой код опирается на мойпредположение, что добавление несопоставимой группы ничего не делает, Это верно для реализации Oracle, но не для других, в том числеAndroid, который, кажется, добавляет строку "ноль", Я'я бы назвал такие реализации неработоспособными, так как это может не иметь никакого смысла, но ониреисправить в соответствии с Javadoc.

 Everett12 дек. 2014 г., 07:26
Безразлично»т работа. Я получаю результаты, как "23.null»
 nhahtdh12 дек. 2014 г., 11:18
@maaartinus: Глядя на их профили, возможно, они выполняют код на Android.
 maaartinus12 дек. 2014 г., 09:06
@ Эверетт тоже есть какие-то отзывы? Это может быть неправильно, но вывод довольно бесполезен для поиска проблемы.
 Rohan Kandwal23 окт. 2014 г., 07:53
Что такое 1 доллар? Это добавило ноль в конец моей строки
 maaartinus25 окт. 2014 г., 20:19
@RohanKandwal$1 являетсяmatcher.group(1)а какой у тебя тест? У меня довольно много тестовых случаев, как вы можете видеть, и все они работают.
Решение Вопроса

Есть возможности:

1000    -> 1000
10.000  -> 10 (without point in result)
10.0100 -> 10.01 
10.1234 -> 10.1234

Я ленивый и глупый, просто

s = s.indexOf(".") < 0 ? s : s.replaceAll("0*$", "").replaceAll("\\.$", "");

То же решение, использующее содержит вместо indexof, как упомянуто в некоторых комментариях для простоты понимания

 s = s.contains(".") ? s.replaceAll("0*$","").replaceAll("\\.$","") : s
 Serg Burlaka07 февр. 2018 г., 13:23
6.0 будет -> 6.0 плохая работа!
 Serg Burlaka07 февр. 2018 г., 17:49
но в андроиде тоже не странно ((
 Kent01 дек. 2016 г., 11:15
@Projectcontains() а такжеindexOf() делают то же самое. Вы можете проверить реализациюcontains()
 Project01 дек. 2016 г., 22:33
@Kent "Для ясности"
 maaartinus23 сент. 2014 г., 16:00
Достаточно одного регулярного выражения, смотрите мой ответ.
 Kent07 февр. 2018 г., 14:32
@ Сергей я запускаю код в своем Eye-JRE, и он работает для0.0 а также6.0
 Project01 дек. 2016 г., 02:15
Вы можете заменитьs.indexOf(".") < 0 с!s.contains(".") для ясности.
 AFD20 сент. 2013 г., 21:19
Наконец, рабочее решение, которое не бросает исключения!
String value = "10.010"
String s = new DecimalFormat("0.####").format(Double.parseDouble(value));
System.out.println(s);

Output:

   10.01
 Vogel61213 апр. 2015 г., 13:11
Привет, хотя это вполне может ответить на вопрос, но учтите, что другие пользователи могут быть не настолько осведомлены, как вы. Почему Дон'Вы добавляете небольшое объяснение, почему этот код работает? Спасибо!

Вы можете заменить на:

String result = (str.indexOf(".")>=0?str.replaceAll("\\.?0+$",""):str);

Чтобы Regex был максимально простым. (И учитывать такие вклады, как1000 как указано в комментариях)

 Kent20 февр. 2013 г., 17:49
регулярное выражение просто, работает для ул?1000
 fivelements20 февр. 2013 г., 17:58
только что протестировал 1000 -> 1
 mdm20 февр. 2013 г., 18:19
Правильно. Я просто подумал оконечные нули ", Не для математического представления числа. Виноват. В этом случае Кентs ответ (проверяется на "." перед применением регулярных выражений) является более правильным.

Моя реализация с возможностью выбора цифр после делителя:

public static String removeTrailingZero(String number, int minPrecise, char divider) {
    int dividerIndex = number.indexOf(divider);

    if (dividerIndex == -1) {
        return number;
    }

    int removeCount = 0;
    for (int i = dividerIndex + 1; i < number.length(); i++) {
        if (number.charAt(i) == '0') {
            removeCount++;
        } else {
            removeCount = 0;
        }
    }

    int fracLen = number.length() - dividerIndex - 1;

    if (fracLen - removeCount < minPrecise) {
        removeCount = fracLen - minPrecise;
    }

    if (removeCount < 0) {
        return number;
    }

    String result = number.substring(0, number.length() - removeCount);

    if (result.endsWith(String.valueOf(divider))) {
        return result.substring(0, result.length() - 1);
    }

    return result;
}

Как насчет замены

(\d*\.\d*)0*$

от?

\1

 Kent20 февр. 2013 г., 17:38
это имеет проблемы с 1-м примером.
 fivelements20 февр. 2013 г., 17:32
Любые встроенные функции Java для использования?

Ваш ответ на вопрос