/*
 *******************************************************************************
 * Copyright (C) 2013, International Business Machines Corporation and         *
 * others. All Rights Reserved.                                                *
 *******************************************************************************
 */
package com.ibm.icu.samples.iuc;

import com.ibm.icu.impl.ICUResourceBundle;
import com.ibm.icu.util.UResourceBundle;

/**
 * @author srl
 *
 */
public class SupplementalUtilities {
    /**
     * Convert LDML2ICUConverter format floating point (territoryF, etc)
     * into double.
     * See: SupplementalMapper.java
     * @param n input number, such as -48123456
     * @return double value, such as -123.456
     * @internal
     */
    public static double ldml2d(int n) {
        if(n == 0) {
          return 0.;
        }
        boolean neg = false;
        if(n < 0) {
          n = -n;
          neg = true;
        }
        int exp = (n/1000000);
        n -= (exp * 1000000);
        int sexp = exp - 50; // signed exponent
        double d = n;
        d = d * Math.pow(10, (sexp-5));  // -5 because 50 isn't quite right..
        if(neg) {
          d = -d;
        }
        return d;
    }

    /** Test function */
    public static void main(String... args)    {
        
    System.out.println("Testingldml2d");
      int junk[] = { 
        49990000, // 99%
        48680000,  // 6.8%
        57344400, // ?
        52940000,  // ?
        0,
        -48123456, // gets -0.012346  not -123.456
        -52123456, // this one gets -123.456
        46100000,
        63146600
      };
    
      for(int i=0;i<junk.length;i++) {
          System.out.println(Integer.toString(junk[i]) + " -> " + Double.toString(ldml2d(junk[i])));
      }
      
      System.out.println();
      System.out.println("Testing getICUSupplementalData");
      System.out.println("SupplementalData has " + getICUSupplementalData().getSize() + " size. (nonzero is good!)" );
    }

    /**
     * Open ICU supplemental data
     * @return the bundle
     */
    public static UResourceBundle getICUSupplementalData() {
        UResourceBundle suppData = UResourceBundle.getBundleInstance(
                ICUResourceBundle.ICU_BASE_NAME,
                "supplementalData",
                ICUResourceBundle.ICU_DATA_CLASS_LOADER);
        return suppData;
    }
}
