在 Java 中自动将测量值格式化为工程单位

问题描述 投票:0回答:2

我正在尝试找到一种方法来自动将测量值和单位格式化为工程符号中的字符串。这是科学记数法的一个特例,指数始终是三的倍数,但使用千、兆、毫、微前缀表示。

这与这篇文章类似,只是它应该处理整个 SI 单位和前缀范围。

例如,我正在寻找一个可以格式化数量的库,以便: 12345.6789 Hz 将被格式化为 12 kHz 或 12.346 kHz 或 12.3456789 kHz 1234567.89 J 将被格式化为 1 MJ 或 1.23 MJ 或 1.2345 MJ 等等。

JSR-275 / JScience 可以很好地处理单位测量,但我还没有找到可以根据测量大小自动计算出最合适的缩放前缀的东西。

干杯, 萨姆.

java string format notation
2个回答
6
投票
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);

    }

}

0
投票

这应该适用于负数...... < 1.0 will make all negative big numbers to appear incorrectly

© www.soinside.com 2019 - 2024. All rights reserved.