```/**
* convert a String into long pennies.
* It ignores invalid chars, lead trail, embedded spaces.
* Dash is treated as a minus sign.
* 0 or 2 decimal places are permitted.
*
* @param numStr String to be parsed.
*
* @return long in pennies.
*
* @exception NumberFormatException if the number is too big to fit in a long.
*/
public static long parseLongPennies( String numStr )
{
numStr = numStr.trim ();
// strip commas, spaces, + etc
StringBuffer b = new StringBuffer( numStr.length() );
boolean negative = false;
int decpl = -1;
for ( int i=0; i<numStr.length(); i++ )
{
char c = numStr.charAt( i );
switch ( c )
{
case '-' :
negative = true;
break;
case '.' :
if ( decpl == -1 )
{
decpl = 0;
}
else
{
throw new NumberFormatException( "more than one decimal point" );
}
break;
case '0' :
case '1' :
case '2' :
case '3' :
case '4' :
case '5' :
case '6' :
case '7' :
case '8' :
case '9' :
if ( decpl != -1 )
{
decpl++;
}
b.append(c);
break;
default:
// ignore junk chars
break;
}
// end switch
}
// end for
if ( numStr.length() != b.length() )
{
numStr = b.toString();
}
if ( numStr.length() == 0 )
{
return 0;
}
long num = Long.parseLong( numStr );
if ( decpl == -1 || decpl == 0 )
{
num *= 100;
}
else if ( decpl == 2 )
{
/* it is fine as is */
}
else
{
throw new NumberFormatException( "wrong number of decimal places." );
}
if ( negative )
{
num = -num;
}
return num;
}
// end parseLongPennies

/**
* convert pennies to a string with a decorative decimal point.
* @param long amount in pennies.
* @return amount with decorative decimal point, but no lead \$.
*/
public final static String penniesToString ( long pennies )
{
boolean negative;
if ( pennies < 0 )
{
pennies = -pennies;
negative = true;
}
else
{
negative = false;
}
String s = Long.toString( pennies );
int len = s.length();
switch ( len )
{
case 1:
s = "0.0" + s;
break;
case 2:
s = "0." + s;
break;
default:
s = s.substring ( 0, len-2 ) + "." + s.substring( len-2, len );
break;
} // end switch
if ( negative )
{
s = "-" + s;
}
return s;
} // end penniesToString```