Java實現(xiàn)單位換算功能
本文實例為大家分享了Java實現(xiàn)單位換算功能的具體代碼,供大家參考,具體內(nèi)容如下
使用枚舉進行簡單計算
只加入了一些簡單常用的單位,如有需要自行添加,以標(biāo)準(zhǔn)單位為基準(zhǔn)
package com.dessert.common.enu; import org.apache.commons.lang3.StringUtils; import java.math.BigDecimal; public class UnitConversion { ? ? /** ? ? ?* 默認保留兩位小數(shù),四舍五入 ? ? ?* ? ? ?* @param value ? ?原始數(shù)值 ? ? ?* @param original 原始單位 ? ? ?* @param need ? ? 轉(zhuǎn)換的單位 ? ? ?* @return ? ? ?*/ ? ? public static BigDecimal conversion(BigDecimal value, UnitsEnum original, UnitsEnum need) { ? ? ? ? return conversion(value, original, need, 2); ? ? } ? ? /** ? ? ?* @param value ? ?原始數(shù)值 ? ? ?* @param original 原始單位 ? ? ?* @param need ? ? 轉(zhuǎn)換的單位 ? ? ?* @param scale ? ?小數(shù)點位數(shù) ? ? ?* @return ? ? ?*/ ? ? public static BigDecimal conversion(BigDecimal value, UnitsEnum original, UnitsEnum need, int scale) { ? ? ? ? if (original == UnitsEnum.UN_KNOWN || need == UnitsEnum.UN_KNOWN) { ? ? ? ? ? ? throw new IllegalArgumentException("存在不支持的單位參數(shù)"); ? ? ? ? } ? ? ? ? if (original.category != need.category) { ? ? ? ? ? ? throw new IllegalArgumentException("轉(zhuǎn)換單位不統(tǒng)一!" + original.category.name + "不能轉(zhuǎn)換為" + need.category.name); ? ? ? ? } ? ? ? ? return value == null ? new BigDecimal(0) : value.multiply(need.rate).divide(original.rate, scale, BigDecimal.ROUND_HALF_UP); ? ? } ? ? /** ? ? ?* 默認保留兩位小數(shù),四舍五入 ? ? ?* ? ? ?* @param value ? ?原始數(shù)值 ? ? ?* @param original 原始單位 ? ? ?* @param need ? ? 轉(zhuǎn)換的單位 ? ? ?* @return ? ? ?*/ ? ? public static BigDecimal conversion(BigDecimal value, String original, String need) { ? ? ? ? return conversion(value, getUnitEnum(original), getUnitEnum(need)); ? ? } ? ? public static UnitsEnum getUnitEnum(String unit) { ? ? ? ? if (StringUtils.isNotEmpty(unit)) { ? ? ? ? ? ? for (UnitsEnum unitEnum : UnitsEnum.values()) { ? ? ? ? ? ? ? ? for (String possibleName : unitEnum.possibleNames) { ? ? ? ? ? ? ? ? ? ? if (possibleName.equals(unit.toLowerCase())) { ? ? ? ? ? ? ? ? ? ? ? ? return unitEnum; ? ? ? ? ? ? ? ? ? ? } ? ? ? ? ? ? ? ? } ? ? ? ? ? ? } ? ? ? ? } ? ? ? ? return UnitsEnum.UN_KNOWN; ? ? } ? ? public enum UnitsEnum { ? ? ? ? LG_KM(CategoryEnum.LENGTH, "km", new String[]{"km", "千米"}, new BigDecimal("0.001"), "千米"), ? ? ? ? LG_M(CategoryEnum.LENGTH, "m", new String[]{"m", "米"}, new BigDecimal("1"), "米"), ? ? ? ? LG_Dm(CategoryEnum.LENGTH, "dm", new String[]{"dm", "分米"}, new BigDecimal("10"), "分米"), ? ? ? ? LG_CM(CategoryEnum.LENGTH, "cm", new String[]{"cm", "厘米"}, new BigDecimal("100"), "厘米"), ? ? ? ? LG_MM(CategoryEnum.LENGTH, "mm", new String[]{"mm", "毫米"}, new BigDecimal("1000"), "毫米"), ? ? ? ? LG_UM(CategoryEnum.LENGTH, "um", new String[]{"um", "微米"}, new BigDecimal("1000000"), "微米"), ? ? ? ? LG_NM(CategoryEnum.LENGTH, "nm", new String[]{"nm", "納米"}, new BigDecimal("1000000000"), "納米"), ? ? ? ? LG_INCH(CategoryEnum.LENGTH, "inch", new String[]{"in", "inch", "英寸"}, new BigDecimal("39.3700787"), "英寸"), ? ? ? ? EG_T(CategoryEnum.WEIGHT, "t", new String[]{"t", "噸"}, new BigDecimal("0.001"), "噸"), ? ? ? ? EG_KG(CategoryEnum.WEIGHT, "kg", new String[]{"kg", "千克"}, new BigDecimal("1"), "千克"), ? ? ? ? EG_G(CategoryEnum.WEIGHT, "g", new String[]{"g", "克"}, new BigDecimal("1000"), "克"), ? ? ? ? EG_MG(CategoryEnum.WEIGHT, "mg", new String[]{"mg", "毫克"}, new BigDecimal("1000000"), "毫克"), ? ? ? ? EG_UG(CategoryEnum.WEIGHT, "μg", new String[]{"μg", "ug", "微克"}, new BigDecimal("1000000000"), "微克"), ? ? ? ? EG_LB(CategoryEnum.WEIGHT, "lb", new String[]{"lb", "lbs", "磅"}, new BigDecimal("2.2046226"), "磅"), ? ? ? ? EG_OZ(CategoryEnum.WEIGHT, "oz", new String[]{"oz", "盎司"}, new BigDecimal("35.2739619"), "盎司"), ? ? ? ? EG_CT(CategoryEnum.WEIGHT, "ct", new String[]{"ct", "克拉"}, new BigDecimal("5000"), "克拉"), ? ? ? ? UN_KNOWN(null, "未知", null, new BigDecimal("0"), "未知"); ? ? ? ? private CategoryEnum category; ? ? ? ? private String units; ? ? ? ? private String[] possibleNames; ? ? ? ? private BigDecimal rate; ? ? ? ? private String description; ? ? ? ? UnitsEnum(CategoryEnum category, String units, String[] possibleNames, BigDecimal rate, String description) { ? ? ? ? ? ? this.category = category; ? ? ? ? ? ? this.units = units; ? ? ? ? ? ? this.possibleNames = possibleNames; ? ? ? ? ? ? this.rate = rate; ? ? ? ? ? ? this.description = description; ? ? ? ? } ? ? ? ? public CategoryEnum getCategory() { ? ? ? ? ? ? return category; ? ? ? ? } ? ? ? ? public String getUnits() { ? ? ? ? ? ? return units; ? ? ? ? } ? ? ? ? public String[] getPossibleNames() { ? ? ? ? ? ? return possibleNames; ? ? ? ? } ? ? ? ? public BigDecimal getRate() { ? ? ? ? ? ? return rate; ? ? ? ? } ? ? ? ? public String getDescription() { ? ? ? ? ? ? return description; ? ? ? ? } ? ? ? ? private enum CategoryEnum { ? ? ? ? ? ? LENGTH("length", UnitsEnum.LG_M, "長度"), ? ? ? ? ? ? WEIGHT("weight", UnitsEnum.EG_KG, "重量"); ? ? ? ? ? ? private String name; ? ? ? ? ? ? private UnitsEnum base; ? ? ? ? ? ? private String description; ? ? ? ? ? ? CategoryEnum(String name, UnitsEnum base, String description) { ? ? ? ? ? ? ? ? this.name = name; ? ? ? ? ? ? ? ? this.base = base; ? ? ? ? ? ? ? ? this.description = description; ? ? ? ? ? ? } ? ? ? ? ? ? public String getName() { ? ? ? ? ? ? ? ? return name; ? ? ? ? ? ? } ? ? ? ? ? ? public UnitsEnum getBase() { ? ? ? ? ? ? ? ? return base; ? ? ? ? ? ? } ? ? ? ? ? ? public String getDescription() { ? ? ? ? ? ? ? ? return description; ? ? ? ? ? ? } ? ? ? ? } ? ? } }
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
SpringBoot基于Redis的分布式鎖實現(xiàn)過程記錄
Redis是一套 key-value 高性能數(shù)據(jù)庫,使用它可以大大提高我們的開發(fā)效率,在SpringBoot中,自動配置也幫我們節(jié)約了大量的配置,下面這篇文章主要給大家介紹了關(guān)于SpringBoot基于Redis的分布式鎖實現(xiàn)的相關(guān)資料,需要的朋友可以參考下2022-01-01Java中的布隆過濾器原理實現(xiàn)和應(yīng)用
Java中的布隆過濾器是一種基于哈希函數(shù)的數(shù)據(jù)結(jié)構(gòu),能夠高效地判斷元素是否存在于一個集合中。它廣泛應(yīng)用于緩存、網(wǎng)絡(luò)協(xié)議、數(shù)據(jù)查詢等領(lǐng)域,在提高程序性能和減少資源消耗方面具有顯著優(yōu)勢2023-04-04java報錯之springboot3+vue2項目web服務(wù)層報錯總結(jié)
java入門學(xué)習(xí),隨手記錄一下開發(fā)過程中產(chǎn)生的報錯,有些錯誤是網(wǎng)上搜索再加上自己嘗試,隨手引用了一些其他人的記錄,也是留給自己看的,或是希望能對其他初學(xué)者有幫助2023-06-06如何使用spring ResponseEntity處理http響應(yīng)
這篇文章主要介紹了如何使用spring ResponseEntity處理http響應(yīng)的操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-07-07如何將JSP/Servlet項目轉(zhuǎn)換為Spring Boot項目
這篇文章主要介紹了如何將JSP/Servlet項目轉(zhuǎn)換為Spring Boot項目,幫助大家更好的利用springboot進行網(wǎng)絡(luò)編程,感興趣的朋友可以了解下2020-10-10