/usr/local/CPAN/oEdtk/oEdtk/SignedField.pm


package oEdtk::SignedField;

# Decode a signed amount field encoded using Infinite conventions.

use strict;
use warnings;

use base 'oEdtk::Field';
our $VERSION		= 0.01;

sub new {
	my ($class, $name, $ilen, $flen) = @_;

	$flen = 0 unless defined($flen);
	my $self = $class->SUPER::new($name, $ilen + $flen);
	$self->{'intlen'} = $ilen;
	$self->{'fraclen'} = $flen;
	return $self;
}

sub process {
	my ($self, $data) = @_;

	$data =~ s/\s+//g;

	if ($data !~ /^-?\d*[p-y]?$/) {
		warn "WARN : Unexpected numerical value: $data in ".$self->{'name'}."\n";
	}

	if ($data eq '') {
		$data = 0;
	}
	if ($data =~ s/([p-y])$/ord($1) - ord('p')/e) {
		$data *= -1;
	}

	my $flen = $self->{'fraclen'};
	if ($data !~ /\./ && $flen > 0) {
		$data /= 10 ** $flen;
		return sprintf("%.${flen}f", $data);
	}
	return $data;
}

1;