Удалить начальный нуль и символ-разделитель для BigDecimal

Наше приложение может получить следующие числа:

0.1
0.02
0.003

и т.п.

Эти значения трактуются нашим кодом как BigDecimal, поскольку мы оперируем деньгами.

В веб-интерфейсе есть форма, в которой пользователь должен просматривать эти плавающие части цен, преобразованные в следующие:

1
02
003

Вопрос в том, как обрезать ведущие zero и delimiter character в входных ценах. Возможно, класс BigDecimal имеет стандартный метод, например, trimLeadingZeroes(), но не может его найти.

ОБНОВЛЕНИЕ: обрезать только начальный ноль и символ-разделитель

Например:

1 is 0.1

27 is 0.27

person sergionni    schedule 14.09.2011    source источник
comment
Я не уверен, что понимаю требования. В чем разница между 0,02 и 0,0002 при отображении этих чисел?   -  person Aleks G    schedule 14.09.2011
comment
Итак, вы хотите рассматривать 0,1, 0,01 и 0,001, как если бы они были одинаковыми?   -  person Jon Skeet    schedule 14.09.2011
comment
на самом деле это не ведущие нули .. они передают смысл.   -  person Randy    schedule 14.09.2011
comment
Всегда ли будет одна цифра, отличная от нуля, или возможно 0,023?   -  person dlev    schedule 14.09.2011
comment
Извините за ошибку, я обновил пост   -  person sergionni    schedule 14.09.2011
comment
@Jon Skeet: я обновил сообщение, извините за ошибку: 0,1 — это 1; 0,01 — это 01, а 0,001 — это 001.   -  person sergionni    schedule 14.09.2011
comment
Я предполагаю, что вы хотите вернуть String. Сколько знаков после запятой вы хотите вернуть? Например: 0,000000001 -> ??; Вы хотите, чтобы они были закруглены? Например: если вы хотите максимум 3 знака после запятой, каково ожидаемое значение для 0,0005? (возможные ответы: 000? 001?)   -  person Marsellus Wallace    schedule 20.09.2011


Ответы (8)


Что-то вроде этого?

public String getDecimalFractions(BigDecimal value) {
    String strValue = value.toPlainString();
    int index = strValue.indexOf(".");
    if(index != -1) {
        return strValue.substring(index+1, strValue.length());
    } 
    return "0"; 
}
person Dan MacBean    schedule 19.09.2011


Может ли это быть чем-то таким простым, как это:

public static BigDecimal fix(String str){
    return  new BigDecimal("0." + str);
}

так что если вы сделаете

public static void main(String[] args) {
    System.out.println(fix("1"));
    System.out.println(fix("02"));
    System.out.println(fix("003"));
}

Он будет печатать

0.1
0.02
0.003
person Pablo Grisafi    schedule 19.09.2011

когда вам когда-либо приходится иметь дело с разделением чего-то, это хорошая ставка. Для этого можно использовать строки.

Сначала вы просто конвертируете bigdecimal в строку

String s=bd.toPlainString();

Затем вы просто разделяете его так

String s2=s.split("\\.")[1];

теперь строка s2 содержит числа после разделителя

person yahh    schedule 20.09.2011

Преобразование из BigDecimal в String:

    import java.math.BigDecimal;
    public class XXX {
        public static void main(String[] args){
            doIt("123");
            doIt("123.1");
            doIt("123.01");
            doIt("123.0123");
            doIt("123.00123");
        }
        static void doIt(String input){
            BigDecimal bdIn = new BigDecimal(input);
            System.out.println(bdIn+" -> "+convert(bdIn));
        }
        static String convert(BigDecimal bdIn) {
            BigDecimal bdOut = bdIn.subtract(bdIn.setScale(0, BigDecimal.ROUND_DOWN));
            return bdOut.signum() == 0 ? "0" : bdOut.toPlainString().substring(2);
        }
    }

Результаты:

    123 -> 0
    123.1 -> 1
    123.01 -> 01
    123.0123 -> 0123
    123.00123 -> 00123

Код работает напрямую с любым числом и учитывает только дробную часть. Он также изящно обрабатывает «0.0».

Это та конверсия, которую вы хотели?

person A.H.    schedule 20.09.2011

Вот еще один простой способ сделать это, предполагая, что ваш ввод равен 1.023456.

        BigDecimal bd = new BigDecimal("1.023456");
        BigInteger bi = bd.toBigInteger();
        BigDecimal bd2 = bd.subtract(new BigDecimal(bi));
        String afterDecimalPoint = bd2.scale() > 0 ?
               bd2.toString().substring(2) : "";

Это даст точный результат, который вы искали в bd3, то есть это будет 023456 для приведенного выше примера.

Это будет нормально работать и для целых чисел из-за условия в последней строке, т.е. 1 вернет ""

person Ashkan Aryan    schedule 23.09.2011

Вы можете использовать строковое представление value (BigDecimal) и StringUtils.substringAfter для этого:

StringUtils.substringAfter(value.toPlainString(), ".")
person beny23    schedule 23.09.2011

Как насчет написания метода расширения для расширения этого типа. Простой метод может умножать число до> 1

public int  trimLeadingZeroes(bigint num) {
    while (num < 1)
    {
       num = num * 10;
    }
       return num;
    }
person JBone    schedule 14.09.2011