Decimal2String.java
- /*
- * GovWay - A customizable API Gateway
- * https://govway.org
- *
- * Copyright (c) 2005-2025 Link.it srl (https://link.it).
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 3, as published by
- * the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- *
- */
- package org.openspcoop2.utils.jaxb;
- import java.text.DecimalFormat;
- import java.text.DecimalFormatSymbols;
- import java.util.Locale;
- import javax.xml.bind.annotation.adapters.XmlAdapter;
- /**
- * DateTime2Date
- *
- *
- * @author Andrea Poli (apoli@link.it)
- * @author $Author$
- * @version $Rev$, $Date$
- */
- public class Decimal2String extends XmlAdapter<String, DecimalWrapper>
- {
- @Override
- public String marshal(DecimalWrapper v) throws Exception {
- if(v==null){
- return null;
- }
- StringBuilder pattern = new StringBuilder();
- for (int i = 0; i < v.getMaxInteger(); i++) {
- pattern.append("0");
- }
- if(v.getMaxDecimal()>0){
- pattern.append(".");
- for (int i = 0; i < v.getMaxDecimal(); i++) {
- pattern.append("0");
- }
- }
- DecimalFormatSymbols dfs = new DecimalFormatSymbols(Locale.US); // per avere la punteggiatura come separatore
- DecimalFormat df = new DecimalFormat(pattern.toString(),dfs);
- //System.out.println("MARSHALL -> ["+pattern.toString()+"] int["+v.getInteger()+"] dec["+v.getDecimal()+"] ["+df.format(v.getObject())+"]");
- String value = df.format(v.getObject());
-
- if( (v.getMinInteger()!=v.getMaxInteger())
- ||
- (v.getMinDecimal()!=v.getMaxDecimal()) ){
- //System.out.println("VALORE OTTENUTO ["+value+"]");
- if(value.contains(".")){
- String [] split = value.split("\\.");
- String left = split[0];
- String right = split[1];
- if(v.getMinInteger()!=v.getMaxInteger()){
- left = this.getLeftMinString(split[0], v.getMinInteger());
- }
- if(v.getMinDecimal()!=v.getMaxDecimal()){
- right = this.getRightMinString(split[1], v.getMinDecimal());
- }
- value = left + "." + right ;
- }else{
- value = this.getLeftMinString(value, v.getMinInteger());
- }
- //System.out.println("VALORE CORRETTO ["+value+"]");
- return value;
- }else{
- return value;
- }
- }
-
- private String getLeftMinString(String value,int min){
- StringBuilder bf = new StringBuilder();
- for (int i = (value.length()-1); i >= 0; i--) {
- if(value.charAt(i) != '0' || !this.onlyLeftZero(value, i)){
- bf.append(value.charAt(i));
- }
- else{
- if(bf.length()>=min){
- break;
- }
- else{
- bf.append(value.charAt(i));
- }
- }
- }
- return bf.reverse().toString();
- }
- private String getRightMinString(String value,int min){
- StringBuilder bf = new StringBuilder();
- for (int i = 0; i <value.length(); i++) {
- if(value.charAt(i) != '0' || !this.onlyRightZero(value, i)){
- bf.append(value.charAt(i));
- }
- else{
- if(bf.length()>=min){
- break;
- }
- else{
- bf.append(value.charAt(i));
- }
- }
- }
- return bf.reverse().toString();
- }
-
- private boolean onlyLeftZero(String value, int fromIndex){
- for (int i = fromIndex; i >=0; i--) {
- if(value.charAt(i) != '0'){
- return false;
- }
- }
- return true;
- }
- private boolean onlyRightZero(String value, int fromIndex){
- for (int i = fromIndex; i <value.length(); i++) {
- if(value.charAt(i) != '0'){
- return false;
- }
- }
- return true;
- }
-
- @Override
- public DecimalWrapper unmarshal(String sParam) throws Exception {
- if(sParam==null){
- return null;
- }
- String s = sParam.trim();
- StringBuilder pattern = new StringBuilder();
- DecimalWrapper dw = new DecimalWrapper();
- if(s.contains(".")){
- String [] split = s.split("\\.");
- dw.setMinInteger(split[0].length());
- dw.setMaxInteger(split[0].length());
- for (int i = 0; i < split[0].length(); i++) {
- pattern.append("0");
- }
- pattern.append(".");
- dw.setMinDecimal(split[1].length());
- dw.setMaxDecimal(split[1].length());
- for (int i = 0; i < split[1].length(); i++) {
- pattern.append("0");
- }
- }
- else{
- dw.setMinInteger(s.length());
- dw.setMaxInteger(s.length());
- for (int i = 0; i < s.length(); i++) {
- pattern.append("0");
- }
- }
-
- DecimalFormatSymbols dfs = new DecimalFormatSymbols(Locale.US); // per avere la punteggiatura come separatore
- DecimalFormat df = new DecimalFormat(pattern.toString(),dfs);
- Object o = df.parseObject(s);
- dw.setObject(o);
-
- //System.out.println("UNMARSHALL -> ["+pattern.toString()+"] string["+s+"] ["+dw.getObject()+"] min["+dw.getInteger()+"] dec["+dw.getDecimal()+"]");
-
- return dw;
- }
- }