Библиотеки единиц измерения Java, отличные от JSR-275 и API единиц измерения
Существуют ли какие-либо библиотеки Java, работающие с единицами измерения, за исключением JSR-275 (отклоненного и заброшенного) и API единиц измерения (которое, похоже, не имеет реализаций производственного качества)?
3 ответа
Я написал библиотеку модулей , в которой не используется статический набор (поскольку во многих практических приложениях, с которыми я сталкивался, это было бы более громоздко, чем я бы хотел, чтобы такая библиотека была). Он предназначен для работы с юнитами на основе струн, а также с более точными юнитами. Некоторые из поддерживаемых функций включают:
преобразование значений, например:
Units.convert(3, "m", "mm"); Units.convert(3, SiBaseUnit.METER, "mm");
оба вернутся
3000
.упрощение строковых единиц, например:
Units.simplify("kg^3 m^4 s^-6 A^-1");
вернется
"J^2 T"
.поиск названий единиц в определенном контексте, например:
Units.inContext("lx s", UnitContextMatch.COMPATIBLE, PhysicsContext.PHOTOMETRY)
вернет навигационный набор, содержащий
("luminous exposure")
.поддерживает единицы СИ , двоичные единицы, имперские единицы , обычные единицы США , атомные единицы , единицы планки и многое другое. Пользователь также может легко определять собственные единицы.
полностью поддерживает произвольные логарифмические единицы, например
LevelUnit.BEL.inReferenceTo(1, Unit.of("mV")); // automatically determines ref type -> root power LevelUnit.BEL.inReferenceTo(1, Unit.of("W"), LevelUnitReferenceType.POWER); // specify type explicitly Unit.of("ln(re 1 nA)") == LevelUnit.NEPER.inReferenceTo(1, Unit.of("nA")); // true
поддерживает префиксы SI, двоичные префиксы и позволяет пользователю легко реализовывать собственные префиксы
Может обрабатывать неизвестные единицы, если не имеет значения, например:
Units.convert(3, "m^2 this_is_not_a_unit", "mm^2 this_is_not_a_unit");
вернется
3e6
, как неизвестная единицаthis_is_not_a_unit
одинаково для обеих сторон преобразования.для критичных к производительности частей кода можно получить коэффициент преобразования (если преобразование чисто мультипликативное), например:
Units.factor("kg", "t");
вернусь
1e-3
.Позволяет проверить эквивалентность, например
Units.equivalent(1, "s", "min");
вернет false, так как
1min
это не то же самое, что1s
. С другой стороны, проверка конвертируемостиUnits.convertible("s", "min");
вернусь
true
.тесно интегрирована в библиотеку координат (начиная с Java 16 эта библиотека все еще требует предварительных функций, но с Java 17 она будет готова к производству)
Константы реализуются через интерфейс, который поддерживает, например:
определение собственных констант, например
// (3 ± 0.2) mole Constant.of(3, 0.2, "mole");
объединение команд, например
// constant with the distance travelled by light in vacuum in (2 ± 0) seconds as value PhysicsConstant.SPEED_OF_LIGHT_IN_VACUUM.mul(2, 0, SiBaseUnit.SECOND); // constant of the elementary charge per (electron) mass PhysicsConstant.ELEMENTARY_CHARGE.div(PhysicsConstant.ELECTRON_MASS); Constant c = Constant.of(3, 0.2, "mole"); PhysicsConstant.SHIELDING_DIFFERENCE_OF_T_AND_P_IN_HT.mul(c);
(простое) распространение неопределенности
то
Constant
интерфейс предоставляет реализации по умолчанию дляTexable
интерфейс из модуля jatex , так что константа может легко возвращать правильный код LaTeX.правильно задокументированные реализации большинства физических констант, определенных NIST, а также некоторых математических констант.
Я создал Unitility с открытым исходным кодом для работы с физическими величинами и единицами измерения, включая простое преобразование между ними. Пример использования:
// Creating temperature instance of specified units
Temperature temperature = Temperature.ofCelsius(20.5); // {20.50 °C}
// Getting converted value for calculations
double valueInCelsius = temperature.getInCelsius(); // 20.50 °C
double valueInFahrenheits = temperature.getInFahrenheits(); // 68.90 °F
// Checking property current unit, value, and value in base unit
TemperatureUnits unit = temperature.getUnit(); // CELSIUS
TemperatureUnits baseUnit = unit.getBaseUnit(); // KELVIN
// Changing property unit and converting back to base unit
Temperature tempInFahrenheits = temperature.toUnit(TemperatureUnits.FAHRENHEIT);
Temperature tempInKelvins = temperature.toBaseUnit();
Кроме того, внутри величин одного типа поддерживаются логические и основные математические операции:
// Logic operation example:
Temperature smallerTemp = Temperature.ofCelsius(-20.0);
Temperature greaterTemp = Temperature.ofCelsius(0.0);
smallerTemp.isLowerThan(greaterTemp);
greaterTemp.isGreaterThan(smallerTemp);
// Math operation example:
Temperature sourceTemperature = Temperature.ofCelsius(20);
Temperature temperatureToAdd = Temperature.ofKelvins(293.15);
Temperature actualTemperature = sourceTemperature.add(temperatureToAdd); // {40°C}
Возможно, это будет полезно, если вы ищете что-то простое. Он поддерживает выбор наиболее типичных физических величин и их единиц в системе СИ и ИМПЕРИАЛЬНЫХ единицах. Если вам нужно добавить какую-то конкретную единицу или количество - просто дайте мне знать.
https://github.com/unitsofmeasurement/uom-se из JSR 363
https://mvnrepository.com/artifact/org.unitsofmeasurement/unit-api/0.6.2-RC1
Надеюсь, ваша проблема была решена ок. 4 года назад!