/*
Online Java - IDE, Code Editor, Compiler

Online Java is a quick and easy tool that helps you to build, compile, test your programs online.
*/

// can not use recursion...

public class Main
{
    public static void main(String[] args) 
    {
        System.out.println("Welcome to Online IDE!! Happy Coding :)");
        
        System.out.println("\n" + expandedForm(25745.48124));
    }
    
    public static String expandedForm(Double number)
    {
        String createString=null;
        
        String convertedNumber = Double.toString(number); 
       
        //problem has to be treated as two parts... string before and after decimal place.
        
        int positionDecimalPoint= convertedNumber.indexOf('.');   //zero based notation  it would be 3 in above example
        int remainingChars;
        int roundedNearestUnit;
        int count=1;
        
        int posAfter=1;   // this has to start from right hand side... and cut numbers on right hand side
        // otherwise the decimal point will be removed!
        
        Double remainingPart=0.0;
        Boolean processedNonMantissa=false;
        
        String charsBeforeDecimal = convertedNumber.substring(0,positionDecimalPoint);
        String charsAfterDecimal = convertedNumber.substring(positionDecimalPoint+1,convertedNumber.length());
        
        int lengthCharsBeforeDecimal = charsBeforeDecimal.length();
        int lengthCharsAfterDecimal =  charsAfterDecimal.length();
        
        System.out.println(charsBeforeDecimal);
        System.out.println(charsAfterDecimal);
        
        do
        {
            System.out.println("conversion: " + convertedNumber);
            remainingChars = convertedNumber.length();
            
            // when trying to cast, unfortunately it failed to pick up first Character
            // it picked up two characters....
            //int prefix = (int)(convertedNumber.charAt(0));
            
            int prefix;
            String format=null;
            int denominator;
            char numerator;
            String finalNumber;
            String temp;
            
            prefix = Character.getNumericValue(convertedNumber.charAt(1));
            System.out.println("prefix22:  " + prefix);
            System.out.println("******* " + remainingPart);
            System.out.println("LENGTH***: " + convertedNumber.length());
            System.out.println("LENGTH after decimal***: " + lengthCharsAfterDecimal);
            
            temp=convertedNumber;
            
            convertedNumber=convertedNumber.substring(1,remainingChars);
            remainingPart = Double.parseDouble(convertedNumber);
            
            System.out.println("This i ccurrent length:" + convertedNumber.length());
    
    
    // There is no numerical value at front, because its a decimal point
    
        System.out.println("CHARS AFTER DECIMAL:" + lengthCharsAfterDecimal);
        
        
            if (prefix==-1)   // since its not a char that can be converted number... a decimal point
            {
                if (lengthCharsAfterDecimal==1)  // this brings closure
                {
                    System.out.println("CLOSURE");
                    
                    denominator = 10;
                    finalNumber = temp.charAt(2) + "/" + denominator;
                    System.out.println(convertedNumber);
                    
                    System.out.println("This is final part: " + temp);
                    
                    return createString + " + " + finalNumber;
                }
                // need to see how far away from decimal point
                //index is 0 of decimal point...
                
                denominator = (int) Math.pow(10,lengthCharsAfterDecimal);
                
                numerator = (char) prefix;
                format = convertedNumber.charAt(convertedNumber.length()-1) + "/" + denominator;
                System.out.println("after decimal:" + format);
                
                System.out.println("REEEMAIJING: " + remainingChars);
                
                convertedNumber=convertedNumber.substring(0,convertedNumber.length()-1);
                System.out.println("NEW NEW NEW: " + convertedNumber);
                remainingPart = Double.parseDouble(convertedNumber);
                
                System.out.println("NEW NEW NEW REMAINING: " + remainingPart);
                
                System.out.println("THIS IS CREATE STRING: " + createString);
                
                System.out.println("LEFT: " + remainingPart);
                
                return format + " + " + expandedForm(remainingPart);
            }
                    
            System.out.println("CHECK********************");
            System.out.println("length number: " + convertedNumber.length());
            System.out.println("length decimal: " +lengthCharsAfterDecimal);
            
            
            if (convertedNumber.length()>lengthCharsAfterDecimal+1)  // this would be 3 in  257.24
            {
                
            //need to create alternate int and round down nearest 100
            //need to know number remaining chars in String
            
            // Now remaining characters is used in  10 ^  remainingChars
            // for instance  247  will give  2 x (10 ^ 2) = 200
            
            roundedNearestUnit =  (int) (Math.pow(10,lengthCharsBeforeDecimal-count) * prefix);
            System.out.println("rounded down:" + roundedNearestUnit);
            
            System.out.println("processing: " + convertedNumber);
            
            createString = Integer.toString(roundedNearestUnit);
            
            System.out.println("This is remaining part:" + remainingPart);
            
            String remainder = remainingPart.toString();
            
            return (remainingPart<10 && convertedNumber.charAt(0)!='.') ?   createString + " + " +  (remainder.substring(0,remainder.indexOf('.')))  + " + "  + expandedForm(remainingPart) :  createString + " + " +  expandedForm(remainingPart);
            
        }
        
    }while(convertedNumber.length()>1);
        
        return " ";
        
    }
    
}
