java中质量、体积的单位转换(药品相关的单位转换)

公司的项目为药事项目,医生开处方的药品单位不规范导致表报数据统计不准确,此段代码只为解决目前项目中处方填写中存入的单位不规范,需要一个统一的单位来处理表报的问题。


1.UnitObject.java实体类,用来封装单位转后结果的对象。

package com.immor.hpms.unitconvert.entity;

/**
 * @author 李白的粉
 * 	 	用来封装返回的单位转换的对象
 * 		num 值
 * 		unit 单位
 */
public class UnitObject {
	private double num;
	
	private String unit;

	@Override
	public String toString() {
		return "UnitObject [num=" + num + ", unit=" + unit + "]";
	}

	public UnitObject() {
	}

	public UnitObject(double num, String unit) {
		this.num = num;
		this.unit = unit;
	}

	public double getNum() {
		return num;
	}

	public void setNum(double num) {
		this.num = num;
	}

	public String getUnit() {
		return unit;
	}

	public void setUnit(String unit) {
		this.unit = unit;
	}

}

2.实体类BaseUnitInfo.java:单位转换涉及到的参数实体类。

package com.immor.hpms.unitconvert.entity;

/**
 * 单位转换需要的参数
 * @author 李白的粉
 *
 */
public class BaseUnitInfo {
	private double component;
	
	private String componentUnit;
	
	private double volume;
	
	private String volumeUnit;
	
	private String packingUnit;
	
	private String miniUnit;
	
	private double ratio;
	
	public BaseUnitInfo() {
	}

	public BaseUnitInfo(double component, String componentUnit, double volume,
			String volumeUnit, String packingUnit, String miniUnit, double ratio) {
		this.component = component;
		this.componentUnit = componentUnit;
		this.volume = volume;
		this.volumeUnit = volumeUnit;
		this.packingUnit = packingUnit;
		this.miniUnit = miniUnit;
		this.ratio = ratio;
	}

	public double getComponent() {
		return component;
	}

	public void setComponent(double component) {
		this.component = component;
	}

	public String getComponentUnit() {
		return componentUnit;
	}

	public void setComponentUnit(String componentUnit) {
		this.componentUnit = componentUnit;
	}

	public double getVolume() {
		return volume;
	}

	public void setVolume(double volume) {
		this.volume = volume;
	}

	public String getVolumeUnit() {
		return volumeUnit;
	}

	public void setVolumeUnit(String volumeUnit) {
		this.volumeUnit = volumeUnit;
	}

	public String getPackingUnit() {
		return packingUnit;
	}

	public void setPackingUnit(String packingUnit) {
		this.packingUnit = packingUnit;
	}

	public String getMiniUnit() {
		return miniUnit;
	}

	public void setMiniUnit(String miniUnit) {
		this.miniUnit = miniUnit;
	}

	public double getRatio() {
		return ratio;
	}

	public void setRatio(double ratio) {
		this.ratio = ratio;
	}
}

3.ConversionRatioUtil.java获取转换比的工具类

package com.immor.hpms.unitconvert.utils;


/**
 * 转化比
 * @author 李白的粉
 * @version 1.0
 *
 */
public class ConversionRatioUtil {

	public static void main(String[] args) {
		String unit = "kg";
		String toUnit = "mg";
		double d = getRatio(unit, toUnit);
		if(d == 0){
			System.out.println("传入单位参数: 从  "+unit+ "  到   "+toUnit+"  不对!!");
		}else{
			System.out.println(d);
		}
		System.out.println("\n\n\n\n----------------------------------");
		double ss = getRatio("公斤","g");
		System.out.println(ss);
	}

	/**
	 * 获取转换比
	 * @param unit  开始单位
	 * @param toUnit 结束单位
	 * @return 返回比率
	 */
	public static double getRatio(String unit, String toUnit) {
		int power = -1;
		if (unit == null || "".equals(unit) || toUnit == null
				|| "".equals(toUnit)) {
			power = -1;
		} else {
			int start = getPower(unit);
			int end = getPower(toUnit);
			if (start == 0 || end == 0) {
				power = -1;
			}else if(start == end){
				power = 0;
			}else {
				power = start - end;
			}
		}
		if(power == -1){
			return 0;
		}
		return Math.pow(10, power);
	}

	/**
	 * 获取值最小单位的比率 
	 * 			重量单位只能计算至微克 
	 * 			体积单位只能计算至微升
	 * @param unit
	 *            传入的单位
	 * @return 返回比率是次幂
	 */
	private static int getPower(String unit) {
		if ("kg".equalsIgnoreCase(unit) || "公斤".equals(unit) || "千克".equals(unit)) {
			return 12;
		}
		if ("g".equalsIgnoreCase(unit) || "克".equals(unit)) {
			return 9;
		}
		if ("mg".equalsIgnoreCase(unit) || "毫克".equals(unit)) {
			return 6;
		}
		if ("ug".equalsIgnoreCase(unit) || "微克".equals(unit)) {
			return 3;
		}
		if ("l".equalsIgnoreCase(unit) || "升".equals(unit)) {
			return 9;
		}
		if ("ml".equalsIgnoreCase(unit) || "毫升".equals(unit)) {
			return 6;
		}
		if ("ul".equalsIgnoreCase(unit) || "微升".equals(unit)) {
			return 3;
		}
		
		if ("百万iu".equals(unit) || "百万单位".equals(unit) || "百万u".equals(unit)) {
			return 9;
		}
		if ("万iu".equals(unit) || "万单位".equals(unit) || "万u".equals(unit)) {
			return 7;
		}
		if ("iu".equalsIgnoreCase(unit) || "单位".equals(unit)) {
			return 3;
		}
		if ("cm".equalsIgnoreCase(unit)) {
			return 3;
		}
		return 0;
	}

}

4.UnitConvert.java 主类:对插入参数不规范的一些处理以及正则获取UnitObject对象

package com.immor.hpms.unitconvert.main;

import java.util.ArrayList;
import java.util.List;

import com.immor.hpms.unitconvert.entity.BaseUnitInfo;
import com.immor.hpms.unitconvert.entity.UnitObject;
import com.immor.hpms.unitconvert.utils.ConversionRatioUtil;

/**
 * @author 李白的粉
 *
 */
public class UnitConvert {
	
	
	public static void main(String[] args) {
		List<BaseUnitInfo> lists = getBaseUnitInfoLists();
		String value ="2盒";
		UnitObject obj =get2MiniUnit(lists.get(0), value);
		System.out.println(obj.getNum()+""+obj.getUnit());
	}
	
	
	/**
	 * 正则匹配  把要转换的String转换为值、单位的对象
	 * @param value
	 * @param ratio
	 * @param packingUnit
	 * @param componentUnit
	 * @return
	 */
	private static UnitObject getUO(String value,double ratio, String packingUnit, String componentUnit){
		String num = value.replaceAll("[a-zA-Z]", "").replaceAll("[\u4e00-\u9fa5]", ""); //去掉字母与中文
		String unit = value.replace(num, ""); //获取单位
		if("".equals(unit)){
			unit=componentUnit;
		}
		if(packingUnit.equals(unit)){ //如果出入的单位等于包装单位
			UnitObject uo = new UnitObject();	
			uo.setNum(Double.valueOf(num)*ratio); //数目乘以比率
			uo.setUnit(componentUnit);	//单位设置为剂量单位
			return uo;
		}
		UnitObject uo1 = new UnitObject();
		uo1.setNum(Double.valueOf(num));
		uo1.setUnit(unit);
		return uo1;
	}
	
	/**
	 * 获取转化成最小单位UnitObject
	 * @return
	 */
	public static UnitObject get2MiniUnit(BaseUnitInfo baseUserInfo, String val){
		UnitObject uo = new UnitObject();
		String miniUnit = baseUserInfo.getMiniUnit();
		UnitObject uObj = getUO(val, baseUserInfo.getRatio(), baseUserInfo.getPackingUnit(), baseUserInfo.getComponentUnit());
		Double num = uObj.getNum();
		String unit = uObj.getUnit();
		double power = ConversionRatioUtil.getRatio(unit, miniUnit);
		if(power==0){
		    uObj = getUO(num+baseUserInfo.getComponentUnit(), baseUserInfo.getRatio(), baseUserInfo.getPackingUnit(), baseUserInfo.getComponentUnit());
			num = uObj.getNum();
			unit = uObj.getUnit();
			power = ConversionRatioUtil.getRatio(unit, miniUnit);
		}
		double dval = num*power;
		uo.setNum(dval);
		uo.setUnit(miniUnit);
		return uo;
	}
	
	/**
	 * 获取转化为剂量单位UnitObject
	 * @return
	 */
	public static UnitObject get2ComponentUnit(BaseUnitInfo baseUserInfo, String val){
		UnitObject uo = new UnitObject();
		return uo;
	}
	
	/**
	 * 模拟数据集合
	 * @return
	 */
	private static List<BaseUnitInfo> getBaseUnitInfoLists(){
		List<BaseUnitInfo> lists = new ArrayList<BaseUnitInfo>();
		BaseUnitInfo bui = new BaseUnitInfo();
		
		bui.setComponent(1.5);
		bui.setComponentUnit("g");
		bui.setVolume(0);
		bui.setVolumeUnit("");
		bui.setMiniUnit("mg");
		bui.setPackingUnit("盒");
		bui.setRatio(10);
		lists.add(bui);
		
		BaseUnitInfo bui2 = new BaseUnitInfo();
		bui2.setComponent(0);
		bui2.setComponentUnit("g");
		bui2.setVolume(1);
		bui2.setVolumeUnit("ml");
		bui2.setMiniUnit("l");
		bui2.setPackingUnit("支");
		bui2.setRatio(10);
		lists.add(bui2);
		
		return lists;
	}
}


  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

李白的粉

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值