Удалить начальный ноль и символ разделителя для BigDecimal - PullRequest
4 голосов
/ 14 сентября 2011

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

0.1
0.02
0.003

и т.д.

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

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

1
02
003

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

UPDATE: обрезать только ведущий ноль и символ разделителя

Например:

1 is 0.1

27 is 0.27

Ответы [ 9 ]

9 голосов
/ 19 сентября 2011

Как то так?

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"; 
}
1 голос
/ 24 сентября 2011

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

StringUtils.substringAfter(value.toPlainString(), ".")
1 голос
/ 23 сентября 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 вернет ""

1 голос
/ 21 сентября 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".

Это преобразование, которое вы хотели?

1 голос
/ 20 сентября 2011

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

Сначала вы просто конвертируете большое десятичное число в строку

String s=bd.toPlainString();

Затем просторазделить его так:

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

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

1 голос
/ 20 сентября 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
1 голос
/ 14 сентября 2011

Вы пробовали звонить BigDecimal.unscaledValue?Недостатком является то, что 0,13 тогда будет 13, тогда как вы возможно хотите 1,3 ... сказать немного сложно.Если бы вы могли привести больше примеров, это действительно помогло бы.

(Этот подход также потерпел бы неудачу, если бы значение было 1000 для начала - вы бы получили 1 ...)

0 голосов
/ 21 сентября 2011
import java.math.BigDecimal;
import java.math.RoundingMode;


public class RemoveZeroes {

    static final int SCALE = 10;    // decimal range 0.1 ... 0.0000000001
    static final String PADDING = "0000000000"; // SCALE number of zeroes

    public static void main(String [] arg) {

        BigDecimal [] testArray = {
            new BigDecimal(0.27),
            new BigDecimal(0.1),
            new BigDecimal(0.02),
            new BigDecimal(0.003),
            new BigDecimal(0.0000000001),
        };

        for (int i = 0; i < testArray.length; i++) {
            // normalize to the same scale
            BigDecimal b = testArray[i].setScale(SCALE, RoundingMode.FLOOR);
            // pad on the left with SCALE number of zeroes
            String step1 = PADDING + b.unscaledValue().toString();
            // remove extra zeroes from the left
            String step2 = step1.substring(step1.length() - SCALE);
            // remove extra zeroes from the right
            String step3 = step2.replaceAll("0+$", "");
            // print result
            System.out.println(step3);
        }

    }
}
0 голосов
/ 14 сентября 2011

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

public int  trimLeadingZeroes(bigint num) {
    while (num < 1)
    {
       num = num * 10;
    }
       return num;
    }
...