Как я могу изменить метку на модуле, используя 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
Вы можете сделать это где угодно и когда угодно. Обычно это делается в статическом блоке, чтобы сделать это один раз, достаточно рано, но это не является обязательным требованием.