001/* 002 * Units of Measurement Reference Implementation 003 * Copyright (c) 2005-2017, 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 1.0, October 6, 2016 044 * @since 1.0 045 */ 046public final class Quantities { 047 /** 048 * Private singleton constructor. 049 */ 050 private Quantities() { 051 } 052 053 /** 054 * Returns the {@link #of(Number, javax.measure.Unit) numeric} quantity of unknown type corresponding to the specified representation. This method 055 * can be used to parse dimensionless quantities.<br> 056 * <code> 057 * Quantity<Dimensionless> proportion = NumberQuantity.of("0.234").asType(Dimensionless.class); 058 * </code> 059 * 060 * <p> 061 * Note: This method handles only {@link javax.measure.format.UnitFormat#getStandard standard} unit format (<a 062 * href="http://unitsofmeasure.org/">UCUM</a> based). Locale-sensitive measure formatting and parsing are handled by the {@link QuantityFormat} 063 * class and its subclasses. 064 * </p> 065 * 066 * @param csq 067 * the decimal value and its unit (if any) separated by space(s). 068 * @return <code>QuantityFormat.getInstance(LOCALE_NEUTRAL).parse(csq)</code> 069 */ 070 public static Quantity<?> getQuantity(CharSequence csq) { 071 try { 072 return QuantityFormat.getInstance().parse(csq); 073 } catch (IllegalArgumentException e) { 074 throw new IllegalArgumentException(e); // TODO could we handle this 075 // differently? 076 } catch (ParserException e) { 077 throw new IllegalArgumentException(e); // TODO could we handle this 078 // differently? 079 } 080 } 081 082 /** 083 * Returns the scalar measurement in the specified unit. 084 * 085 * @param value 086 * the measurement value. 087 * @param unit 088 * the measurement unit. 089 * @return the corresponding <code>numeric</code> quantity. 090 * @throws NullPointerException 091 * when value or unit were null 092 */ 093 public static <Q extends Quantity<Q>> Quantity<Q> getQuantity(Number value, Unit<Q> unit) { 094 095 if (value == null) 096 throw new NullPointerException(); 097 if (unit == null) 098 throw new NullPointerException(); 099 if (Double.class.isInstance(value)) { 100 return new DoubleQuantity<Q>(value.doubleValue(), unit); 101 } else if (Long.class.isInstance(value)) { 102 return new LongQuantity<Q>(Long.class.cast(value), unit); 103 } else if (Short.class.isInstance(value)) { 104 return new ShortQuantity<Q>(Short.class.cast(value), unit); 105 } else if (Integer.class.isInstance(value)) { 106 return new IntegerQuantity<Q>(Integer.class.cast(value), unit); 107 } else if (Float.class.isInstance(value)) { 108 return new FloatQuantity<Q>(Float.class.cast(value), unit); 109 } 110 return new NumberQuantity<Q>(value, unit); 111 } 112}