package sum; import java.math.BigDecimal; import java.math.BigInteger; /** * @author Nikita Doschennikov (me@fymio.us) */ public class SumBigDecimalHex { public static void main(String[] args) { BigDecimal res = new BigDecimal("0"); for (String arg : args) { StringBuilder builder = new StringBuilder(); int idxOfS = -1; for (char c : arg.toCharArray()) { if (!Character.isWhitespace(c)) { if (c == 's' || c == 'S') { idxOfS = builder.length(); } builder.append(c); } else { res = res.add(compute(builder.toString(), idxOfS)); idxOfS = -1; builder = new StringBuilder(); } } res = res.add(compute(builder.toString(), idxOfS)); } System.out.println(res); } static BigDecimal compute(String num, int idxOfS) { BigDecimal res = BigDecimal.ZERO; if (num == null || num.isEmpty()) { return res; } else if (num.startsWith("0x") || num.startsWith("0X")) { num = num.toLowerCase(); num = num.substring(2); if (idxOfS != -1) { idxOfS -= 2; String mantissaHex = num.substring(0, idxOfS); String exponentHex = num.substring(idxOfS + 1); BigInteger mantissa = new BigInteger(mantissaHex, 16); BigInteger exponent = new BigInteger(exponentHex, 16); res = res.add( new BigDecimal(mantissa).scaleByPowerOfTen( exponent.negate().intValueExact() ) ); } else { res = res.add(new BigDecimal(new BigInteger(num, 16))); } } else { res = new BigDecimal(num); } return res; } }