import eprog.*;

/**
 * <tt>FarbCode</tt><br>
 * eine Zusatzklasse für den Widerstand um den Farbcode zu berechnen.
 *
 * @see Widerstand
 * @see FLAGS
 * @see Widerst
 */

class FarbCode extends EprogIO
{
    private String sCode;
    
    /**
     * <tt>Farbcode</tt><br>
     * Constructor für einen Farbcode.
     */
    FarbCode(double dValue)
    {
	sCode = makeCode(dValue);
    }
    
    public String toString()
    {
	return sCode;
    }
    
    /**
     * <tt>makeCode()</tt><br>
     * Berechnet den Farbcode eines Widerstandes.<br>
     * Nimmt einen double entgegen.
     *
     * @return String
     */
    private String makeCode(double dValue)
    {
	//von -2 an...
	String[] sCodeTable = {"si","go","sw","br","rt","or","ge","gn","bl","vi","gr","ws"};
	int potenz = 0;
	StringBuffer tmpString = new StringBuffer("[");
	
	if(FLAGS.DEBUG)
	    println("in 'makeCode()': value of rounded resistance:\t" + dValue);
	
	// "000" häng ich nur an, damit der String auf alle Fälle länger als 3 wird.	
	String sAusgabe = Double.toString(dValue) + "000";
	int iCounter = 0;
	
	//try, da ich ausserhalb des Array landen könnt...
	//(falls das Argument nicht der Spez entspricht. *g*)
	try{
	    for(int i=0; i<4 && i < sAusgabe.length(); i++)
	    {
		if(Character.isDigit(sAusgabe.charAt(i)) && iCounter < 3)
		{
		    if(FLAGS.DEBUG)
			println("in 'makeCode()': value of char:\t\t\t" + (sAusgabe.charAt(i) - 46));
		    //"- 46" da ich einfach den ASCII Code abziehe um auf
		    //den echten Wert einer Zahl komm.
		    //ASCII 48 entspricht einer 0.
		    //da mein array eigentlich bei -2 beginnt, ziehe ich
		    //hier nur 46 ab.
		    tmpString.append(sCodeTable[sAusgabe.charAt(i) - 46] + " ");
		    iCounter++;
		}
	    }
	    //die richtige Potenz ermittle ich mittels Logarithmus
	    //Funktionen.
	    int iPotenz = (int)(Math.log(dValue)/Math.log(10));
	    	    
	    if(FLAGS.DEBUG)
		println("in 'makeCode()': value of potenz:\t\t" + (iPotenz));
	
	    tmpString.append(sCodeTable[iPotenz] + "]");

	    if(FLAGS.DEBUG)
		println("in 'makeCode()': return value of code:\t\t" + tmpString.toString());
	
	    return tmpString.toString();
	}
	//wenn ich eine Exception bekomm, is ein Fehler im Argument.
	//(=Widerstand ist nicht codierbar)
	catch(ArrayIndexOutOfBoundsException e){
	    return "[Kein Codieren möglich]";
	}
    }
}