/**
|
*
|
*/
|
package timeflow.format.field;
|
|
public class FormatDouble extends FieldFormat
|
{
|
@Override
|
public String format(Object o) {
|
return o.toString();
|
}
|
|
@Override
|
public Object _parse(String s) {
|
if (s==null || s.trim().length()==0)
|
return null;
|
return parseDouble(s);
|
}
|
|
public static double parseDouble(String s)
|
{
|
int n=s.length();
|
if (n>3)
|
{
|
if (s.charAt(0)=='(' && s.charAt(n-1)==')')
|
{
|
s='-'+s.substring(1,n-1);
|
n--;
|
}
|
}
|
// remove $,%, etc.
|
StringBuffer b=new StringBuffer();
|
for (int i=0; i<n; i++)
|
{
|
char c=s.charAt(i);
|
if (Character.isDigit(c) || c=='-' || c=='.')
|
b.append(c);
|
}
|
|
try
|
{
|
return Double.parseDouble(b.toString());
|
}
|
catch (RuntimeException e)
|
{
|
System.out.println("b="+b);
|
throw e;
|
}
|
}
|
|
|
@Override
|
public Class getType() {
|
return Double.class;
|
}
|
@Override
|
public double scoreFormatMatch(String s) {
|
s=s.trim();
|
int n=s.length();
|
if (n==5) // possible zip code
|
{
|
if (s.charAt(0)=='0')
|
return -3; // gotta be a zip code!
|
return 0;
|
}
|
if (n==9) // possible zip+4, but really, who knows...
|
return 0;
|
|
if (n==4) // possible date.
|
{
|
try
|
{
|
int x=Integer.parseInt(s);
|
if (x>1900 && x<2030)
|
return -1; // that's very likely a date.
|
if (x>1700 && x<2100)
|
return 0; // you don't know.
|
|
}
|
catch (Exception e) {} // evidently not a date :-)
|
}
|
|
if (n==0)
|
return -.1;
|
int ok=0;
|
int bad=0;
|
for (int i=0; i<n; i++)
|
{
|
char c=s.charAt(i);
|
if (Character.isDigit(c) || c=='.' || c==',' || c=='-' || c=='$' || c=='%')
|
ok++;
|
else
|
bad++;
|
}
|
return 4-5*bad;
|
}
|
|
@Override
|
public String getHumanName() {
|
return "Number";
|
}
|
|
}
|