Автоматически форматировать измерения в технические единицы в Java - PullRequest
5 голосов
/ 18 февраля 2011

Я пытаюсь найти способ автоматического форматирования измерения и единицы измерения в строку в инженерной нотации .Это особый случай научного обозначения, в котором показатель степени всегда кратен трем, но обозначается с помощью кило, мега, милли, микро-префиксов.

Это будет похоже на этот пост , за исключением того, что оно должно обрабатывать весь диапазон единиц СИ и префиксов.

Например, я ищу библиотеку, которая будет форматироватьтакие величины, что: 12345,6789 Гц будет отформатирован как 12 кГц или 12,346 кГц или 12,3456789 кГц, 1234567,89 Дж будет отформатирован как 1 МДж, или 1,23 МДж, или 1,2345 МДж и т. д.

JSR-275 / JScience обрабатывает устройствоизмерение в порядке, но мне еще предстоит найти что-то такое, что автоматически подберет наиболее подходящий префикс масштабирования в зависимости от величины измерения.

Приветствия, Сэм.

1 Ответ

4 голосов
/ 18 февраля 2011
import java.util.*;
class Measurement {
    public static final Map<Integer,String> prefixes;
    static {
        Map<Integer,String> tempPrefixes = new HashMap<Integer,String>();
        tempPrefixes.put(0,"");
        tempPrefixes.put(3,"k");
        tempPrefixes.put(6,"M");
        tempPrefixes.put(9,"G");
        tempPrefixes.put(12,"T");
        tempPrefixes.put(-3,"m");
        tempPrefixes.put(-6,"u");
        prefixes = Collections.unmodifiableMap(tempPrefixes);
    }

    String type;
    double value;

    public Measurement(double value, String type) {
        this.value = value;
        this.type = type;
    }

    public String toString() {
        double tval = value;
        int order = 0;
        while(tval > 1000.0) {
            tval /= 1000.0;
            order += 3;
        }
        while(tval < 1.0) {
            tval *= 1000.0;
            order -= 3;
        }
        return tval + prefixes.get(order) + type;
    }

    public static void main(String[] args) {
        Measurement dist = new Measurement(1337,"m"); // should be 1.337Km
        Measurement freq = new Measurement(12345678,"hz"); // should be 12.3Mhz
        Measurement tiny = new Measurement(0.00034,"m"); // should be 0.34mm

        System.out.println(dist);
        System.out.println(freq);
        System.out.println(tiny);

    }

}
...