001/* 002Copyright (c) 2011+, HL7, Inc 003All rights reserved. 004 005Redistribution and use in source and binary forms, with or without modification, 006are permitted provided that the following conditions are met: 007 008 * Redistributions of source code must retain the above copyright notice, this 009 list of conditions and the following disclaimer. 010 * Redistributions in binary form must reproduce the above copyright notice, 011 this list of conditions and the following disclaimer in the documentation 012 and/or other materials provided with the distribution. 013 * Neither the name of HL7 nor the names of its contributors may be used to 014 endorse or promote products derived from this software without specific 015 prior written permission. 016 017THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND 018ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 019WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 020IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, 021INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 022NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 023PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 024WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 025ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 026POSSIBILITY OF SUCH DAMAGE. 027 028 */ 029/** 030 * 031 */ 032package org.hl7.fhir.dstu3.model; 033 034/*- 035 * #%L 036 * org.hl7.fhir.dstu3 037 * %% 038 * Copyright (C) 2014 - 2019 Health Level 7 039 * %% 040 * Licensed under the Apache License, Version 2.0 (the "License"); 041 * you may not use this file except in compliance with the License. 042 * You may obtain a copy of the License at 043 * 044 * http://www.apache.org/licenses/LICENSE-2.0 045 * 046 * Unless required by applicable law or agreed to in writing, software 047 * distributed under the License is distributed on an "AS IS" BASIS, 048 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 049 * See the License for the specific language governing permissions and 050 * limitations under the License. 051 * #L% 052 */ 053 054 055import java.math.BigDecimal; 056import java.math.MathContext; 057import java.math.RoundingMode; 058 059import org.hl7.fhir.instance.model.api.IBaseDecimalDatatype; 060 061import ca.uhn.fhir.model.api.annotation.DatatypeDef; 062 063/** 064 * Primitive type "decimal" in FHIR: A rational number 065 */ 066@DatatypeDef(name = "decimal") 067public class DecimalType extends PrimitiveType<BigDecimal> implements Comparable<DecimalType>, IBaseDecimalDatatype { 068 069 private static final long serialVersionUID = 3L; 070 071 /** 072 * Constructor 073 */ 074 public DecimalType() { 075 super(); 076 } 077 078 /** 079 * Constructor 080 */ 081 public DecimalType(BigDecimal theValue) { 082 setValue(theValue); 083 } 084 085 /** 086 * Constructor 087 */ 088 public DecimalType(double theValue) { 089 // Use the valueOf here because the constructor gives wacky precision 090 // changes due to the floating point conversion 091 setValue(BigDecimal.valueOf(theValue)); 092 } 093 094 /** 095 * Constructor 096 */ 097 public DecimalType(long theValue) { 098 setValue(theValue); 099 } 100 101 /** 102 * Constructor 103 */ 104 public DecimalType(String theValue) { 105 setValue(new BigDecimal(theValue)); 106 } 107 108 @Override 109 public int compareTo(DecimalType theObj) { 110 if (getValue() == null && theObj.getValue() == null) { 111 return 0; 112 } 113 if (getValue() != null && theObj.getValue() == null) { 114 return 1; 115 } 116 if (getValue() == null && theObj.getValue() != null) { 117 return -1; 118 } 119 return getValue().compareTo(theObj.getValue()); 120 } 121 122 @Override 123 protected String encode(BigDecimal theValue) { 124 return getValue().toPlainString(); 125 } 126 127 /** 128 * Gets the value as an integer, using {@link BigDecimal#intValue()} 129 */ 130 public int getValueAsInteger() { 131 return getValue().intValue(); 132 } 133 134 public Number getValueAsNumber() { 135 return getValue(); 136 } 137 138 @Override 139 protected BigDecimal parse(String theValue) { 140 return new BigDecimal(theValue); 141 } 142 143 /** 144 * Rounds the value to the given prevision 145 * 146 * @see MathContext#getPrecision() 147 */ 148 public void round(int thePrecision) { 149 if (getValue() != null) { 150 BigDecimal newValue = getValue().round(new MathContext(thePrecision)); 151 setValue(newValue); 152 } 153 } 154 155 /** 156 * Rounds the value to the given prevision 157 * 158 * @see MathContext#getPrecision() 159 * @see MathContext#getRoundingMode() 160 */ 161 public void round(int thePrecision, RoundingMode theRoundingMode) { 162 if (getValue() != null) { 163 BigDecimal newValue = getValue().round(new MathContext(thePrecision, theRoundingMode)); 164 setValue(newValue); 165 } 166 } 167 168 /** 169 * Sets a new value using an integer 170 */ 171 public void setValueAsInteger(int theValue) { 172 setValue(BigDecimal.valueOf(theValue)); 173 } 174 175 /** 176 * Sets a new value using a long 177 */ 178 public void setValue(long theValue) { 179 setValue(BigDecimal.valueOf(theValue)); 180 } 181 182 /** 183 * Sets a new value using a double 184 */ 185 public void setValue(double theValue) { 186 setValue(BigDecimal.valueOf(theValue)); 187 } 188 189 @Override 190 public DecimalType copy() { 191 return new DecimalType(getValue()); 192 } 193 194 public String fhirType() { 195 return "decimal"; 196 } 197 198}