Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > Округление BigDecimal по желаемому патерну


Автор: firedrago 31.1.2013, 22:12
Всем привет, 
подкинте плс идею как округлять BigDecimal по моим личным правилам
напр.:
*,99
-----
123,12 -> 123,99
3,57 -> 3,99

*,49 
-----
123,12 -> 123,49

*.*9
-----
123,12 -> 123,19

*9,99
-----
123,12 -> 129,99

и т.д.

зарание благодарен!    

Автор: LSD 1.2.2013, 10:29
Цитата(firedrago @  31.1.2013,  23:12 Найти цитируемый пост)
*,99
-----
123,12 -> 123,99
3,57 -> 3,99

round(ROUND_CEILING) - (10^-precision)


Для остальных случаем хотелось бы более детально объяснение как округлять, особенно в граничных случаях: .00 .99 .50 .49 и т.д.

Автор: firedrago 1.2.2013, 11:15
вроде уже победил,  хотя если как-то красивее это сделать можно ?!
Код

import java.math.BigDecimal;
import java.text.ParseException;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Test {
    public static void main(String[] args) throws ParseException {
        String[] pattern = new String[]{"*.49", "*.99", "*.*9", "*9.99", "*.97", "*0", "*90", "*50", "*900"};
        BigDecimal[] num  = new BigDecimal[]{new BigDecimal("123.12"), new BigDecimal("3.57"), new BigDecimal("555.98")};
        
        for(BigDecimal n : num){
            for(String p : pattern){
                BigDecimal t = roundUpWithPattern(n, p);
                System.out.println(p + "\t" + n.toPlainString() + "\t>> " + t.toPlainString());
            }
        }
    }

    public static BigDecimal roundUpWithPattern(BigDecimal source, String pattern){
        String pTens = pattern.replaceAll("[0-9]", "0").replaceAll("\\*(?!.*\\*)","1").replaceAll("\\*","0");
        BigDecimal target = addPattern(source, pattern);
        if(target.compareTo(source) < 0){
            target = addPattern(source.add(new BigDecimal(pTens)), pattern);
        }        
        
        return target;
    }
    
    private static  BigDecimal addPattern(BigDecimal source, String pattern){
        if(pattern.indexOf(".") == -1){
            pattern += ".00";
        }
        String tmpN = source.toPlainString();
        String pPlaceHolder = pattern.replaceAll("\\*", "(\\\\d)").replaceAll("[0-9]", "\\\\d").replaceAll("\\.", "\\\\.");
        Pattern pat = Pattern.compile(pPlaceHolder);
        Matcher m = pat.matcher(tmpN);
        if(m.find()){
            StringBuffer mask = new StringBuffer();
            int i = 1;
            for(char c : pattern.toCharArray()){
                if(c == '*'){
                    mask.append("$" + i);
                    i++;
                }else{
                    mask.append(c);
                }
            }

            String maskedMessage = m.replaceAll(mask.toString());
            return new BigDecimal(maskedMessage);
        }else{
            BigDecimal target = new BigDecimal(pattern.replaceAll("\\*", "0"));
            return target;
        }
    }
}

->
Код

*.49    123.12    >> 123.49
*.99    123.12    >> 123.99
*.*9    123.12    >> 123.19
*9.99    123.12    >> 129.99
*.97    123.12    >> 123.97
*0    123.12    >> 130.00
*90    123.12    >> 190.00
*50    123.12    >> 150.00
*900    123.12    >> 900.00
*.49    3.57    >> 4.49
*.99    3.57    >> 3.99
*.*9    3.57    >> 3.59
*9.99    3.57    >> 9.99
*.97    3.57    >> 3.97
*0    3.57    >> 10.00
*90    3.57    >> 90.00
*50    3.57    >> 50.00
*900    3.57    >> 900.00
*.49    555.98    >> 556.49
*.99    555.98    >> 555.99
*.*9    555.98    >> 555.99
*9.99    555.98    >> 559.99
*.97    555.98    >> 556.97
*0    555.98    >> 560.00
*90    555.98    >> 590.00
*50    555.98    >> 650.00
*900    555.98    >> 900.00

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)