Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将金额拆分为传递的输入_Java - Fatal编程技术网

Java 将金额拆分为传递的输入

Java 将金额拆分为传递的输入,java,Java,我有一个要求,在那里我得到总金额,以及将该金额分成多少部分作为输入。对于outputresponse,我使用构建器模式并避免使用空字段。 总量是一个大的十进制数(如果为null或小于0,则抛出异常),输入数可以在1-3之间(如果超出此范围或非数字,则抛出异常)。我已经写了这段代码,但我不相信,我认为可能有一种更干净、更好的方法,通过查看代码也很容易理解。 此外,在拆分时,无论剩下多少分钱,都将添加到第一个金额中 如果100.01是我必须分成3部分的总金额,我应该得到33.35作为第一笔金额,33

我有一个要求,在那里我得到总金额,以及将该金额分成多少部分作为输入。对于outputresponse,我使用构建器模式并避免使用空字段。 总量是一个大的十进制数(如果为null或小于0,则抛出异常),输入数可以在1-3之间(如果超出此范围或非数字,则抛出异常)。我已经写了这段代码,但我不相信,我认为可能有一种更干净、更好的方法,通过查看代码也很容易理解。 此外,在拆分时,无论剩下多少分钱,都将添加到第一个金额中

如果100.01是我必须分成3部分的总金额,我应该得到33.35作为第一笔金额,33.33作为经常性金额。请告知是否有更干净更好的方法来实现这一点

public OutputResponse splitAmount(BigDecimal totalAmount, int divideInto) {
if (!(1 <= divideInto && 3 >= divideInto)) {
            throw new Exception();
        }
        OutputResponse outputResponse;
        if (totalAmount != null && totalAmount.compareTo(BigDecimal.ZERO) > 0) {
            BigDecimal recurringAmounts = null;
            BigDecimal firstAmount = totalAmount;
            if (divideInto > 1) {
                recurringAmounts = totalAmount.divide(BigDecimal.valueOf(divideInto), 2, RoundingMode.FLOOR);
                firstAmount = totalAmount.subtract(recurringAmounts.multiply(new BigDecimal(divideInto - 1)));
            }

            outputResponse = OutputResponse.builder()
                    .firstAmt(firstAmount)
                    .secondPmtAmt(recurringAmounts)
                    .build();

            if (divideInto > 2) {
                outputResponse.setThirdPmtAmt(recurringAmounts);
            }
        } else {
            throw new Exception();
        }
}
public OutputResponse splitAmount(双十进制totalAmount,int divideInto){
如果(!(1=分成){
抛出新异常();
}
输出响应输出响应;
if(totalAmount!=null&&totalAmount.compareTo(BigDecimal.ZERO)>0){
BigDecimal recurringAmounts=null;
BigDecimal firstAmount=总金额;
如果(分为>1){
RecurringAgamounts=总金额.除法(BigDecimal.valueOf(divideInto),2,舍入模式.地板);
firstAmount=totalAmount.subtract(递归装载.multiply(新的BigDecimal(除以-1));
}
outputResponse=outputResponse.builder()
.firstAmt(firstAmount)
.secondPmtAmt(重复安装)
.build();
如果(分为>2){
输出响应设置第三个DPMTAMT(重复安装);
}
}否则{
抛出新异常();
}
}

可能是可选的,它有助于使代码具有自解释性,并避免嵌套的if-else块:

public OutputResponse splitAmount(BigDecimal totalAmount, int divideInto) throws Exception {
    IntStream.rangeClosed(1, 3)
            .filter(x -> x == divideInto)
            .findAny()
            .orElseThrow(IllegalArgumentException::new);
    
    Optional.ofNullable(totalAmount)
            .filter(d -> d.compareTo(BigDecimal.ZERO) > 0)
            .orElseThrow(IllegalArgumentException::new);
    
    BigDecimal recurringAmounts = totalAmount.divide(BigDecimal.valueOf(divideInto), 2, RoundingMode.FLOOR);
    BigDecimal rest = totalAmount.subtract(recurringAmounts.multiply(BigDecimal.valueOf(divideInto)));

    OutputResponse outputResponse = OutputResponse.builder();
    if(divideInto >= 1) {
       outputResponse = outputResponse.firstAmt(recurringAmounts.add(rest));
    }
    if(divideInto >= 2) {
       outputResponse = outputResponse.secondPmtAmt(recurringAmounts);
    }
    if(divideInto == 3) {
       outputResponse = outputResponse.setThirdPmtAmt(recurringAmounts);
    }
    
    return outputResponse.build();
}
如果选择不适合您的口味:

public OutputResponse splitAmount(BigDecimal totalAmount, int divideInto) throws Exception {
    if(divideInto < 1 || 3 < divideInto) {
       throw new IllegalArgumentException();
    }
    
    if(totalAmount == null || totalAmount.compareTo(BigDecimal.ZERO) <= 0) {
       throw new IllegalArgumentException();
    }
    
    BigDecimal recurringAmounts = totalAmount.divide(BigDecimal.valueOf(divideInto), 2, RoundingMode.FLOOR);
    BigDecimal rest = totalAmount.subtract(recurringAmounts.multiply(BigDecimal.valueOf(divideInto)));

    OutputResponse outputResponse = OutputResponse.builder();
    if(divideInto >= 1) {
       outputResponse = outputResponse.firstAmt(recurringAmounts.add(rest));
    }
    if(divideInto >= 2) {
       outputResponse = outputResponse.secondPmtAmt(recurringAmounts);
    }
    if(divideInto == 3) {
       outputResponse = outputResponse.setThirdPmtAmt(recurringAmounts);
    }
    
    return outputResponse.build();
}
public OutputResponse splitAmount(BigDecimal totalAmount,int divideInto)引发异常{
如果(分成<1 | | 3<分成){
抛出新的IllegalArgumentException();
}
如果(totalAmount==null | | totalAmount.compareTo(BigDecimal.ZERO)=1){
outputResponse=outputResponse.firstAmt(recurringAmounts.add(rest));
}
如果(分为>=2){
outputResponse=outputResponse.secondPmtAmt(重复安装);
}
如果(分为==3){
outputResponse=outputResponse.setThirdPmtAmt(重复安装);
}
返回outputResponse.build();
}

我觉得这是一个更好的网站,你能问一下吗?当然可以。谢谢你的建议。我喜欢你定义变量名的方式,所有的名称都清楚地说明了它将存储什么。您正在引发泛型异常,它可能是一个特定的异常,在这里,用户给出了错误的答案,因此您可能引发了InvalidRequestException或自定义异常。firstAmount和recurringAmounts是否不同?如果没有,那么我们可以重用相同的变量Yes Deepak,我使用的是自定义异常。我只是在这里发布了一个通用的例子,让大家更加关注逻辑。此外,在拆分时,无论剩下多少分钱,都将添加到第一个金额中。因此需要两个独立的变量。如果100.01是我必须分为3部分的总金额,我应该得到33.35作为第一个金额,33.33作为经常性金额。嘿,@eriean,你的解决方案看起来很干净!!谢谢@厄立特里亚人,我觉得不错。然而,有一个问题是,如果我想使用一些自定义异常而不是IllegalArgumentException,我该怎么做?我有一个自定义异常,它的构造函数接受两个参数,一个是我要抛出的HTTP状态码,另一个是CustomError对象,它包含两个错误详细信息字符串。你知道我是否可以用可选的吗?@user9150507抱歉,回答延迟了。我有几天没上网了。您应该能够抛出自己的异常,如下所示:
…OrelsThrow(()->new MyCustomException(HTTP_代码,new CustomError(“foo”,“bar”);