Java實現(xiàn)單位換算功能
本文實例為大家分享了Java實現(xiàn)單位換算功能的具體代碼,供大家參考,具體內(nèi)容如下
使用枚舉進(jìn)行簡單計算
只加入了一些簡單常用的單位,如有需要自行添加,以標(biāo)準(zhǔn)單位為基準(zhǔn)
package com.dessert.common.enu;
import org.apache.commons.lang3.StringUtils;
import java.math.BigDecimal;
public class UnitConversion {
? ? /**
? ? ?* 默認(rèn)保留兩位小數(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);
? ? }
? ? /**
? ? ?* 默認(rèn)保留兩位小數(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-01
Java中的布隆過濾器原理實現(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-04
java報錯之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進(jìn)行網(wǎng)絡(luò)編程,感興趣的朋友可以了解下2020-10-10

