Преобразуйте строку в BigDecimal и добавьте разделитель запятых

У меня есть строка, которую я читаю из файла. Эта строка должна быть преобразована в BigDecimal. Как только это будет bigdecimal, у меня будет что-то вроде этого: 000000000103000000. Все 0 перед первым числом должны быть отформатированы, а последние два 00 должны быть .00. Как мне это сделать? например. (000000004711) -> (47.11)

Код:

BigDecimal amount;
String line = "30000000000000010300000000000000000000009876543210";
final NumberFormat formatter = NumberFormat.getInstance(Locale.FRANCE);/* , instead of . */

while((line = inputStream.readLine()) != null) {

    amount = BigDecimal.valueOf(formatter.parse( 
    line.substring(2,24).replaceFirst("^0+(?!$)", "")).longValue());
}
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
0
555
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

String line = "30000000000000010300000000000000000000009876543210";
if (line.length() >= 22) {
    BigDecimal amount = new BigDecimal(
            line.substring(2, 24).replaceFirst("^(.*)(..)$", "$1.$2")
    );
    System.out.println(amount);
}

Выход

30000000000000010300000000000000000000009876543210 -> 1030000.00

Вы случайно удалили .substring(2,24), отредактируйте его, я одобряю. Спасибо

Joel 29.04.2018 10:47

Ой, тогда вам нужна только конкретная деталь? хорошо, я отредактирую это

YCF_L 29.04.2018 10:48

правильно, я должен разобрать 2,24, поскольку именно здесь числа должны отражать сумму, остальная часть строки - другая информация :) 0 действуют как наполнители.

Joel 29.04.2018 10:49

@Joel, вы должны добавить line = line.length() > 1 ? line : "0" + line;, прежде чем преобразовывать строку в BigDecimal, иначе вы получите неправильный результат с числом с одной цифрой

YCF_L 29.04.2018 10:57

да, я действительно думал об этом. Однако тогда я мог бы просто использовать свое регулярное выражение, но вот так? "^0+(?!$)", "$1.$2"?

Joel 29.04.2018 10:59

@Joel, ваше регулярное выражение бесполезно, оно вызовет исключение No group 1, вы его тестировали?

YCF_L 29.04.2018 11:01

о да, это правда. mb, не очень хорошо с регулярным выражением. Мне все еще не нравится, что я должен использовать здесь условие строки с этим решением, поскольку это как бы мешает остальной части моего синтаксического анализа.

Joel 29.04.2018 11:05
if ((line = line.length() > 1 ? line : "0" + line) != "") { подойдет, верно?
Joel 29.04.2018 11:09

@Joel никакая строка не должна сравниваться с .equals или isEmpty() в вашем случае, кроме того, если ваш номер должен быть равен или больше 22 цифр, вы можете использовать line = line.substring(2, 24); if (line.length() >= 22) { BigDecimal amount = new BigDecimal(line.replaceFirst("^(.*)(..)$", "$1.$2")); }

YCF_L 29.04.2018 11:15

@Joel, не могли бы вы поделиться диапазоном цифр, чтобы я мог предложить вам лучшее решение?

YCF_L 29.04.2018 11:19

диапазон 2,24 или что вы имеете в виду? число может быть где угодно в этом диапазоне. Я просто должен обрезать, пока не появится число, отличное от 0. затем добавьте десятичную дробь :)

Joel 29.04.2018 12:18

хорошо, @Joel, тогда я хотел бы использовать свое редактирование сейчас, проверьте еще раз, это лучший способ, я проверяю длину, прежде чем использовать substring

YCF_L 29.04.2018 12:23

Не могли бы вы объяснить, чем это отличается от вашего предыдущего решения? Это работает, но я не знаю почему.

Joel 29.04.2018 12:25

@Joel идея состоит в том, чтобы просто проверить длину перед тем, как вы сделаете substring, потому что, если длина строки меньше, чем символ 22(24-2), это вызовет исключение.

YCF_L 29.04.2018 12:27

Хорошо, но if (!(line = line.length() > 1 ? line : "0" + line).isEmpty()) { тоже должен работать, верно? :) Спасибо тебе за твое терпение

Joel 29.04.2018 12:31

@Joel Это не удастся, если длина меньше 22 символов, потому что вы используете .substring(2, 24), просто попробуйте с другой строкой, например 000456, и вы увидите, что она выдаст java.lang.StringIndexOutOfBoundsException: String index out of range: 24, кроме проблем, вы можете спросить что угодно, не волнуйтесь; )

YCF_L 29.04.2018 12:33

Другие вопросы по теме