вроде уже победил, хотя если как-то красивее это сделать можно ?!
| Код | 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
|
|