У меня есть строка, которую я читаю из файла. Эта строка должна быть преобразована в 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());
}




Вам не нужно удалять первые нули, они будут проигнорированы при преобразовании в 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
Ой, тогда вам нужна только конкретная деталь? хорошо, я отредактирую это
правильно, я должен разобрать 2,24, поскольку именно здесь числа должны отражать сумму, остальная часть строки - другая информация :) 0 действуют как наполнители.
@Joel, вы должны добавить line = line.length() > 1 ? line : "0" + line;, прежде чем преобразовывать строку в BigDecimal, иначе вы получите неправильный результат с числом с одной цифрой
да, я действительно думал об этом. Однако тогда я мог бы просто использовать свое регулярное выражение, но вот так? "^0+(?!$)", "$1.$2"?
@Joel, ваше регулярное выражение бесполезно, оно вызовет исключение No group 1, вы его тестировали?
о да, это правда. mb, не очень хорошо с регулярным выражением. Мне все еще не нравится, что я должен использовать здесь условие строки с этим решением, поскольку это как бы мешает остальной части моего синтаксического анализа.
if ((line = line.length() > 1 ? line : "0" + line) != "") { подойдет, верно?
@Joel никакая строка не должна сравниваться с .equals или isEmpty() в вашем случае, кроме того, если ваш номер должен быть равен или больше 22 цифр, вы можете использовать line = line.substring(2, 24); if (line.length() >= 22) { BigDecimal amount = new BigDecimal(line.replaceFirst("^(.*)(..)$", "$1.$2")); }
@Joel, не могли бы вы поделиться диапазоном цифр, чтобы я мог предложить вам лучшее решение?
диапазон 2,24 или что вы имеете в виду? число может быть где угодно в этом диапазоне. Я просто должен обрезать, пока не появится число, отличное от 0. затем добавьте десятичную дробь :)
хорошо, @Joel, тогда я хотел бы использовать свое редактирование сейчас, проверьте еще раз, это лучший способ, я проверяю длину, прежде чем использовать substring
Не могли бы вы объяснить, чем это отличается от вашего предыдущего решения? Это работает, но я не знаю почему.
@Joel идея состоит в том, чтобы просто проверить длину перед тем, как вы сделаете substring, потому что, если длина строки меньше, чем символ 22(24-2), это вызовет исключение.
Хорошо, но if (!(line = line.length() > 1 ? line : "0" + line).isEmpty()) { тоже должен работать, верно? :) Спасибо тебе за твое терпение
@Joel Это не удастся, если длина меньше 22 символов, потому что вы используете .substring(2, 24), просто попробуйте с другой строкой, например 000456, и вы увидите, что она выдаст java.lang.StringIndexOutOfBoundsException: String index out of range: 24, кроме проблем, вы можете спросить что угодно, не волнуйтесь; )
Вы случайно удалили
.substring(2,24), отредактируйте его, я одобряю. Спасибо