001/* 002 * Units of Measurement Reference Implementation 003 * Copyright (c) 2005-2016, Jean-Marie Dautelle, Werner Keil, V2COM. 004 * 005 * All rights reserved. 006 * 007 * Redistribution and use in source and binary forms, with or without modification, 008 * are permitted provided that the following conditions are met: 009 * 010 * 1. Redistributions of source code must retain the above copyright notice, 011 * this list of conditions and the following disclaimer. 012 * 013 * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions 014 * and the following disclaimer in the documentation and/or other materials provided with the distribution. 015 * 016 * 3. Neither the name of JSR-363 nor the names of its contributors may be used to endorse or promote products 017 * derived from this software without specific prior written permission. 018 * 019 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 020 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, 021 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 022 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE 023 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 024 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 025 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED 026 * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 027 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, 028 * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 029 */ 030package tec.units.ri.quantity; 031 032import javax.measure.Quantity; 033import javax.measure.Unit; 034import javax.measure.format.ParserException; 035 036import tec.units.ri.format.QuantityFormat; 037 038/** 039 * Singleton class for accessing {@link Quantity} instances. 040 * 041 * @author werner 042 * @author otaviojava 043 * @version 0.6, April 18, 2016 044 */ 045public final class Quantities { 046 /** 047 * Private singleton constructor. 048 */ 049 private Quantities() { 050 } 051 052 /** 053 * Returns the {@link #of(Number, javax.measure.Unit) numeric} quantity of unknown type corresponding to the specified representation. This method 054 * can be used to parse dimensionless quantities.<br/> 055 * <code> 056 * Quantity<Dimensionless> proportion = NumberQuantity.of("0.234").asType(Dimensionless.class); 057 * </code> 058 * 059 * <p> 060 * Note: This method handles only {@link javax.measure.format.UnitFormat#getStandard standard} unit format (<a 061 * href="http://unitsofmeasure.org/">UCUM</a> based). Locale-sensitive measure formatting and parsing are handled by the {@link QuantityFormat} 062 * class and its subclasses. 063 * </p> 064 * 065 * @param csq 066 * the decimal value and its unit (if any) separated by space(s). 067 * @return <code>QuantityFormat.getInstance(LOCALE_NEUTRAL).parse(csq)</code> 068 */ 069 public static Quantity<?> getQuantity(CharSequence csq) { 070 try { 071 return QuantityFormat.getInstance().parse(csq); 072 } catch (IllegalArgumentException e) { 073 throw new IllegalArgumentException(e); // TODO could we handle this 074 // differently? 075 } catch (ParserException e) { 076 throw new IllegalArgumentException(e); // TODO could we handle this 077 // differently? 078 } 079 } 080 081 /** 082 * Returns the scalar measurement in the specified unit. 083 * 084 * @param value 085 * the measurement value. 086 * @param unit 087 * the measurement unit. 088 * @return the corresponding <code>numeric</code> quantity. 089 * @throws NullPointerException 090 * when value or unit were null 091 */ 092 public static <Q extends Quantity<Q>> Quantity<Q> getQuantity(Number value, Unit<Q> unit) { 093 094 if (value == null) 095 throw new NullPointerException(); 096 if (unit == null) 097 throw new NullPointerException(); 098 if (Double.class.isInstance(value)) { 099 return new DoubleQuantity<Q>(value.doubleValue(), unit); 100 } else if (Long.class.isInstance(value)) { 101 return new LongQuantity<Q>(Long.class.cast(value), unit); 102 } else if (Short.class.isInstance(value)) { 103 return new ShortQuantity<Q>(Short.class.cast(value), unit); 104 } else if (Integer.class.isInstance(value)) { 105 return new IntegerQuantity<Q>(Integer.class.cast(value), unit); 106 } else if (Float.class.isInstance(value)) { 107 return new FloatQuantity<Q>(Float.class.cast(value), unit); 108 } 109 return new NumberQuantity<Q>(value, unit); 110 } 111}