Как я могу изменить метку на модуле, используя Java Measurement API?

Введение проблемы

Я пытаюсь использовать эту реализацию единиц измерения Java (JSR 363).

Я хотел бы изменить поведение нескольких из предоставленных единиц. Примером одного является DEGREE_ANGLE, так что символ степени (°) добавляется в конце любого количества toString"D. Как сейчас, количество напечатает 6.1345983929 [rad?]

Попытка решения

Я пробовал много разных способов для достижения этой цели, но, похоже, один из способов, который присутствует в других примерах AbstractSystemsOfUnits (как в этой реализации Унифицированного кода для единиц измерения) использовать статический блок, подобный следующему:

// //////////////////////////////////////////////////////////////////////////
// Label adjustments for UCUM system
static {
    SimpleUnitFormat.getInstance().label(ATOMIC_MASS_UNIT, "AMU");
    SimpleUnitFormat.getInstance().label(LITER, "l");
    SimpleUnitFormat.getInstance().label(OUNCE, "oz");      
    SimpleUnitFormat.getInstance().label(POUND, "lb");
}

Я пытался адаптировать это решение, расширяя Units класс реализации я использую.

public final class MyUnits extends Units {
    static {
        SimpleUnitFormat.getInstance().label(DEGREE_ANGLE, "°");
    }
}

И простой тест, пытающийся использовать это расширение:

Quantities.getQuantity(2.009880307999, MyUnits.RADIAN).to(MyUnits.DEGREE_ANGLE).toString();

Дает мне 115.157658975 [rad?]

Вопрос

Как я могу изменить метку на модуле, используя JSR 363 API?

1 ответ

Решение

Хм, я попробовал и у меня не возникло проблем с базовым подходом, который вы описываете, с той библиотекой, которую вы используете (версия 1.0.7)... Я что-то пропустил?

Не нужно расширять, базовый подход работает, вот пример:

import tec.uom.se.ComparableQuantity;
import tec.uom.se.format.SimpleUnitFormat;
import tec.uom.se.quantity.Quantities;
import javax.measure.quantity.Angle;
import static tec.uom.se.unit.Units.DEGREE_ANGLE;
import static tec.uom.se.unit.Units.RADIAN;

public class CustomLabelForDegrees {

    public static void main(String[] args) {
        ComparableQuantity<Angle> x = Quantities.getQuantity(2.009880307999, RADIAN).to(DEGREE_ANGLE);
        System.out.println(x);
        SimpleUnitFormat.getInstance().label(DEGREE_ANGLE, "°");
        System.out.println(x);
        SimpleUnitFormat.getInstance().label(DEGREE_ANGLE, "☯");
        System.out.println(x);
        SimpleUnitFormat.getInstance().label(DEGREE_ANGLE, "degrees");
        System.out.println(x);
    }
}

Это печатает:

115.15765897479669 [rad?]
115.15765897479669 °
115.15765897479669 ☯
115.15765897479669 degrees

Вы можете сделать это где угодно и когда угодно. Обычно это делается в статическом блоке, чтобы сделать это один раз, достаточно рано, но это не является обязательным требованием.

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