package com.casic.missiles.utils; import com.alibaba.excel.util.StringUtils; import java.math.BigDecimal; import java.math.RoundingMode; /** * @Description: 单位转换工具 * @Author: wangpeng * @Date: 2024/1/12 10:54 */ public class UnitConvertUtil { /** * 频率单位换算:Hz、kHz、MHz、GHz、THz * @param valueOne 需要换算的数值 * @param valueUnit 需要换算的数值单位 * @param finalUnit 需要换算后的单位 * @return 换算后的数据 */ public static BigDecimal frequencyConvert(String valueOne, String valueUnit, String finalUnit) { BigDecimal value = new BigDecimal(valueOne); if (valueUnit.equals(finalUnit)) { return value; } BigDecimal processValue = BigDecimal.ZERO; BigDecimal resultValue = BigDecimal.ZERO; //1、将valueOne转为Hz对应值 switch (valueUnit) { case "kHz": processValue = value.multiply(new BigDecimal("1000")); break; case "MHz": processValue = value.multiply(new BigDecimal("1000000")); break; case "GHz": processValue = value.multiply(new BigDecimal("1000000000")); break; case "THz": processValue = value.multiply(new BigDecimal("1000000000000")); break; default: processValue = value; break; } //2、将valueOne转为finalUnit对应值 switch (finalUnit) { case "kHz": resultValue = processValue.divide(new BigDecimal("1000"), 11, RoundingMode.HALF_UP); break; case "MHz": resultValue = processValue.divide(new BigDecimal("1000000"), 7, RoundingMode.HALF_UP); break; case "GHz": resultValue = processValue.divide(new BigDecimal("1000000000"), 9, RoundingMode.HALF_UP); break; case "THz": resultValue = processValue.divide(new BigDecimal("1000000000000"), 12, RoundingMode.HALF_UP); break; default: resultValue = processValue; break; } return resultValue; } /** * 根据数值和单位得到响应保留小数位数后的数值,:kHz保留小数后3位、MHz 保留小数后6位、GHz保留小数后9位、THz保留小数后12位 * @param valueUnit 单位 * @param value 待保留小数位数的员数值 * @return 保留指定小数位数的数值 */ public static BigDecimal valueDecimalConvert(String valueUnit, String value) { BigDecimal resultValue = new BigDecimal(value); switch (valueUnit) { case "kHz": resultValue = resultValue.setScale(3, RoundingMode.HALF_UP); break; case "MHz": resultValue = resultValue.setScale(6, RoundingMode.HALF_UP); break; case "GHz": resultValue = resultValue.setScale(9, RoundingMode.HALF_UP); break; case "THz": resultValue = resultValue.setScale(12, RoundingMode.HALF_UP); break; default: break; } return resultValue; } /** * 根据数值和单位得到响应保留小数位数后的数值,:kHz保留小数后11位、MHz 保留小数后7位、GHz保留小数后9位 * @param valueUnit 单位 * @param value 待保留小数位数的员数值 * @return 保留指定小数位数的数值 */ public static BigDecimal valueDecimalConvertTwo(String valueUnit, String value) { BigDecimal resultValue = new BigDecimal(value); switch (valueUnit) { case "kHz": resultValue = resultValue.setScale(11, RoundingMode.HALF_UP); break; case "MHz": resultValue = resultValue.setScale(7, RoundingMode.HALF_UP); break; case "GHz": resultValue = resultValue.setScale(9, RoundingMode.HALF_UP); break; default: break; } return resultValue; } /** * 时间单位换算:d、h、min、s、ms、μs、ns、ps * @param valueOne 需要换算的数值 * @param valueUnit 需要换算的数值单位 * @param finalUnit 需要换算后的单位 * @return 换算后的数据 */ public static BigDecimal timeConvert(String valueOne, String valueUnit, String finalUnit) { BigDecimal value = new BigDecimal(valueOne); if (valueUnit.equals(finalUnit)) { return value; } BigDecimal processValue = BigDecimal.ZERO; BigDecimal resultValue = BigDecimal.ZERO; //1、将valueOne转为ns对应值 switch (valueUnit) { case "d": processValue = value.multiply(new BigDecimal("86400000000000")); break; case "h": processValue = value.multiply(new BigDecimal("3600000000000")); break; case "min": processValue = value.multiply(new BigDecimal("60000000000")); break; case "s": processValue = value.multiply(new BigDecimal("1000000000")); break; case "ms": processValue = value.multiply(new BigDecimal("1000000")); break; case "μs": processValue = value.multiply(new BigDecimal("1000")); break; case "ps": processValue = value.multiply(new BigDecimal("0.001")); break; case "MHz": //秒和MHz换算,1MHz=1000000s,1MHz=1000000Hz,1MHz=1000000000000000ns processValue = value.multiply(new BigDecimal("1000000000000000")); break; default: processValue = value; break; } //2、将valueOne转为finalUnit对应值 switch (finalUnit) { case "d": resultValue = processValue.divide(new BigDecimal("86400000000000"), 12, RoundingMode.HALF_UP); break; case "h": resultValue = processValue.divide(new BigDecimal("3600000000000"), 12, RoundingMode.HALF_UP); break; case "min": resultValue = processValue.divide(new BigDecimal("60000000000"), 12, RoundingMode.HALF_UP); break; case "s": resultValue = processValue.divide(new BigDecimal("1000000000"), 12, RoundingMode.HALF_UP); break; case "ms": resultValue = processValue.divide(new BigDecimal("1000000"), 12, RoundingMode.HALF_UP); break; case "μs": resultValue = processValue.divide(new BigDecimal("1000"), 12, RoundingMode.HALF_UP); break; case "ps": resultValue = processValue.divide(new BigDecimal("0.001"), 12, RoundingMode.HALF_UP); break; case "MHz": //秒和MHz换算,1MHz=1000000s,1MHz=1000000Hz,1MHz=1000000000000000ns resultValue = processValue.divide(new BigDecimal("1000000000000000"), 12, RoundingMode.HALF_UP); break; default: resultValue = processValue; break; } return resultValue; } /** * 电压单位换算:kV、V、mV、μV * @param valueOne 需要换算的数值 * @param valueUnit 需要换算的数值单位 * @param finalUnit 需要换算后的单位 * @return 换算后的数据 */ public static BigDecimal voltageConvert(String valueOne, String valueUnit, String finalUnit) { if (StringUtils.isEmpty(valueOne)) { return BigDecimal.ZERO; } BigDecimal value = new BigDecimal(valueOne); if (valueUnit.equals(finalUnit)) { return value; } BigDecimal processValue = BigDecimal.ZERO; BigDecimal resultValue = BigDecimal.ZERO; //1、将valueOne转为 V对应值 switch (valueUnit) { case "kV": processValue = value.multiply(new BigDecimal("1000")); break; case "mV": processValue = value.multiply(new BigDecimal("0.001")); break; case "μV": processValue = value.multiply(new BigDecimal("0.000001")); break; default: processValue = value; break; } //2、将valueOne转为finalUnit对应值 switch (finalUnit) { case "kV": resultValue = processValue.divide(new BigDecimal("1000"), 4, RoundingMode.HALF_UP); break; case "mV": resultValue = processValue.divide(new BigDecimal("0.001"), 4, RoundingMode.HALF_UP); break; case "μV": resultValue = processValue.divide(new BigDecimal("0.000001"), 4, RoundingMode.HALF_UP); break; default: resultValue = processValue; break; } return resultValue; } /** * 功率单位换算:kW、W、mW、μW * @param valueOne 需要换算的数值 * @param valueUnit 需要换算的数值单位 * @param finalUnit 需要换算后的单位 * @return 换算后的数据 */ public static BigDecimal powerConvert(String valueOne, String valueUnit, String finalUnit) { BigDecimal value = new BigDecimal(valueOne); if (valueUnit.equals(finalUnit)) { return value; } BigDecimal processValue = BigDecimal.ZERO; BigDecimal resultValue = BigDecimal.ZERO; //1、将valueOne转为 V对应值 switch (valueUnit) { case "kW": processValue = value.multiply(new BigDecimal("1000")); break; case "mW": processValue = value.multiply(new BigDecimal("0.001")); break; case "μW": processValue = value.multiply(new BigDecimal("0.000001")); break; default: processValue = value; break; } //2、将valueOne转为finalUnit对应值 switch (finalUnit) { case "kW": resultValue = processValue.divide(new BigDecimal("1000"), 4, RoundingMode.HALF_UP); break; case "mW": resultValue = processValue.divide(new BigDecimal("0.001"), 4, RoundingMode.HALF_UP); break; case "μW": resultValue = processValue.divide(new BigDecimal("0.000001"), 4, RoundingMode.HALF_UP); break; default: resultValue = processValue; break; } return resultValue; } /** * 电阻单位换算:MΩ、kΩ、Ω、mΩ、μΩ * @param valueOne 需要换算的数值 * @param valueUnit 需要换算的数值单位 * @param finalUnit 需要换算后的单位 * @return 换算后的数据 */ public static BigDecimal resistanceConvert(String valueOne, String valueUnit, String finalUnit) { BigDecimal value = new BigDecimal(valueOne); if (valueUnit.equals(finalUnit)) { return value; } BigDecimal processValue = BigDecimal.ZERO; BigDecimal resultValue = BigDecimal.ZERO; //1、将valueOne转为 Ω对应值 switch (valueUnit) { case "MΩ": processValue = value.multiply(new BigDecimal("1000000")); break; case "kΩ": processValue = value.multiply(new BigDecimal("1000")); break; case "mΩ": processValue = value.multiply(new BigDecimal("0.001")); break; case "μΩ": processValue = value.multiply(new BigDecimal("0.000001")); break; default: processValue = value; break; } //2、将valueOne转为finalUnit对应值 switch (finalUnit) { case "MΩ": resultValue = processValue.divide(new BigDecimal("1000"), 4, RoundingMode.HALF_UP); break; case "kΩ": resultValue = processValue.divide(new BigDecimal("1000"), 4, RoundingMode.HALF_UP); break; case "mΩ": resultValue = processValue.divide(new BigDecimal("0.001"), 4, RoundingMode.HALF_UP); break; case "μΩ": resultValue = processValue.divide(new BigDecimal("0.000001"), 4, RoundingMode.HALF_UP); break; default: resultValue = processValue; break; } return resultValue; } }