Библиотеки единиц измерения 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 года назад!

Другие вопросы по тегам