Automatic formatting of measurements in engineering units in Java

I am trying to find a way to automatically format a measurement and unit in a string in technical notation . This is a special case of scientific notation, in which the indicator is always a multiple of three, but is indicated using kilo, mega, milli, micro prefixes.

It will be similar to this post , except that it should handle the entire range of SI units and prefixes.

For example, I get a library that will format such values ​​that: 12345.6789 Hz will be formatted as 12 kHz or 12.346 kHz or 12.34456789 kHz 1234567.89 J will be formatted as 1 MJ or 1.23 MJ or 1.2345 MJ And so on.

The JSR-275 / JScience handles the device measurement in order, but I have not yet found something that will automatically develop the most suitable scaling prefix based on the measurement value.

Cheers, Sam.

+4
source share
1 answer
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); } } 
+2
source

Source: https://habr.com/ru/post/1340256/


All Articles