java 实现前面带零的数字进行加减运算(保留前面的0)

1.情景展示

  比方说,有一数字000122,进行加法运算+1后,返回000123,如何实现?

2.原因分析

  我们知道,在java中,只要是数字,用代表数字类型的数据类型(byte、short、int、long、double、float、BigDecimal)一旦接收,不管数字前方有几个0,都会被吃掉。

  所以,我们要想被加数前面有0,必须用字符串来接收,也就是:

  String number = “000122”,而不是int i = 000122;

  要想进行加减运算,我们就必须将其转换成基本数据类型,进行运算,此时,前面的0已经消失了,所以,我们还要进行补零操作。 

3.解决方案

/*
 * 加法、减法计算(整数之间的运算)
 * @attention: 不支持被加数以0开头,且被加数+加数>9223372036854775807的整数求和运算
 * BigDecimal支持小数运算,该函数只支持整数之间的运算
 * @date: 2020年11月11日 0011 16:28
 * @param: augend 被加数(前面可以带0)
 * @param: addend 加数(可以为负数)
 * @return: java.lang.String 返回字符串是因为:如果前面有0,转数字的话,0会被吞掉
 */
public static String numberAddition(String augend,       int addend) {
    if (!isWholeNumber(augend))       return "被加数不是整数,无法进行加法运算" ;

    // 以0开头,说明进行加法运算后需要进行补零操作
    if (augend.startsWith(      "0" )) {
        // 校验是否大于long类型的最大值:9223372036854775807
        long augendNum;
        try {
            // 因为String.format()不支持BigDecimal运算,只支持基本数据类型,所以无法调用format()直接进行补零操作
            augendNum = Long.parseLong(augend);
        }       catch (NumberFormatException n) {
            return "被加数>long类型的最大值9223372036854775807" ;
        }

        long result = augendNum + addend;
        // 被加数>0,被加数>加数的绝对值,这样result肯定应该大于0
        if (augendNum >       0 && augendNum > Math.abs(addend) && result <       0 ) {
            return "被加数以0开头,且被加数+加数>long类型的最大值9223372036854775807" ;
        }

        // 字符串转数字,前面的0会消失(按原来的长度进行补零)
        // return String.format("%0" + augend.length() + "d", Integer.parseInt(augend) + addend);
        return String.format(      "%0" + augend.length() +       "d" , Long.parseLong(augend) + addend);
    }

    if (!augend.startsWith(      "0" )) {
        // 被加数不以0开头且被加数+加数>9223372036854775807
        BigDecimal resultBg =       new BigDecimal(augend).add(      new BigDecimal(addend));
        if (resultBg.compareTo(      new BigDecimal(Long.MAX_VALUE)) ==       1 ) {
            return String.valueOf(resultBg);
        }       else {
            // 正常的整数运算
            return String.valueOf(Long.parseLong(augend) + addend);
        }
    }

    // 不会执行(走不到这儿)
    return "" ;
}

4.测试

public static void main(String[] args) {
    System.out.println(numberAddition(      "2020111100017420201111000174" ,       1 ));
    System.out.println(numberAddition(      "00009223372036854775806" ,       1 ));
    System.out.println(numberAddition(      "009223372036854775807" ,       2 ));
    System.out.println(numberAddition(      "0000134" ,       1 ));
    System.out.println(numberAddition(      "122" ,       1 ));
}

 

 

posted @ 2020-11-12 15:09  Marydon  阅读(2507)  评论(0编辑  收藏  举报