计算字符串里的金额总和

/**
* 根据金额后的单位获取金额,且目前金额只能为阿拉伯数字!
*/
public static String sumMoneyByString(String info){
	String[] unitArr = {"元","万元","亿元"};	//金额单位
	List<String> list = new ArrayList<>();	//整数及浮点数集合
	
	String regex =  "\\d*[.]\\d*|\\d*[1-9]\\d*";
	Pattern p = Pattern.compile(regex);
	Matcher m = p.matcher(info);
	while (m.find()) {
		if (!"".equals(m.group())){
			list.add(m.group());
		}
	}
	
	//遍历集合,扫描罚款信息,看数字后面是否是金额单位,如果是则该数为罚款金额
	int start = 0;	//开始扫描的索引
	List<String> yuanList = new ArrayList<>();	//罚款金额集合(元)
	List<String> wanList = new ArrayList<>();	//罚款金额集合(万元)
	List<String> yiList = new ArrayList<>();	//罚款金额集合(亿元)
	if(list.size() > 0){
		for (String number : list) {
			int first = info.indexOf(number, start);	//金额首位字符在罚款信息中的索引
			start = first + number.length();
			//获取 开始扫描的索引 之后的一个或两个字符,判断是否是金额单位,如果是则该数为罚款金额
			if(info.length() >= start+1){
				String one = info.substring(start, start+1);
				if(unitArr[0].equals(one) && start!= 0){
					yuanList.add(number);
				}
			}
			if(info.length() >= start+2){
				String two = info.substring(start, start+2);
				if(unitArr[1].equals(two) && start!= 0){
					wanList.add(number);
				}
				if(unitArr[2].equals(two) && start!= 0){
					yiList.add(number);
				}
			}
		}
	}
	
	Double yuanSum = 0d;
	Double wanSum = 0d;
	Double yiSum = 0d;
	if(yuanList.size() > 0){
		for (String yuan : yuanList) {
            //精确的加法
			yuanSum = Arith.add(yuanSum, Double.valueOf(yuan));
		}
	}
	if(wanList.size() > 0){
		for (String wan : wanList) {
            //精确的加法及乘法
			wanSum = Arith.add(wanSum, Arith.mul(Double.valueOf(wan),10000d));
		}
	}
	if(yiList.size() > 0){
		for (String yi : yiList) {
            //精确的加法及乘法
			yiSum = Arith.add(yiSum, Arith.mul(Double.valueOf(yi),100000000d));
		}
	}
	//求和
	Double moneySum = Arith.addAll(yuanSum, wanSum, yiSum);
	DecimalFormat df = new DecimalFormat("0.00");
	String sumFormat = df.format(moneySum);
	return sumFormat.equals("0.00") ? "" : sumFormat;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,假设我们需要从下面这个字符串中提取"项目B"下所有订单的总和,并按照比例进行计算: ``` s = "项目A: 1000元;项目B: 2000元;项目C: 3000元\n" s += "订单1: 500元,项目B;订单2: 1000元,项目B;订单3: 500元,项目B" ``` 我们可以使用正则表达式和 Python 进行处理,实现如下: ``` import re # 定义正则表达式 project_pattern = r"项目B: (\d+)元" order_pattern = r"订单\d+: (\d+)元,项目B" # 提取项目B的总金额 project_result = re.search(project_pattern, s) if project_result: project_total = int(project_result.group(1)) else: print("未找到项目B的金额") # 提取订单金额计算总和 order_results = re.findall(order_pattern, s) if order_results: order_total = sum([int(x) for x in order_results]) else: print("未找到订单金额") # 计算比例并输出结果 if project_total and order_total: ratio = order_total / project_total print("项目B的订单总金额为:{}元,占比为:{:.2%}".format(order_total, ratio)) else: print("无法计算比例") ``` 上述代码中,我们首先使用正则表达式`project_pattern`和`order_pattern`分别匹配字符串`s`中的项目B金额和订单金额。然后使用`re.search()`函数提取项目B的金额,并使用`re.findall()`函数提取所有订单的金额。接着,我们分别将项目B金额和订单金额转换为整数后,计算订单总金额,并计算订单总金额占项目B金额的比例。最后,我们将结果输出。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值