Kredler Stefan wrote:
> 
> Hi all,

Hello,

> a while ago I wrote a little unit conversion I am quite happy with. Just out
> of interest: is there a more elegant way to do it?

I don't know about elegant but I know you can make it a lot shorter.

> And maybe even more interesting: what approach
> should I take to implement the back conversion?
> 
> Here is my code:
> 
> #! /usr/gnu/bin/perl -w
> 
> ##################################################
> #      unit conversion
> #      here I loose the SI-Unit like Volt Ampere etc. but I don't need it.
> #
> sub expand_unit($){
>   my $unit = shift (@_);

@_ is the default argument for shift() in subroutines so:

   my $unit = shift;

>   my $last = "";
>   return $unit if (not ($unit =~ /\d/));

   return $unit unless $unit =~ /\d/;

>   while ( substr($unit,length($unit)-1,1)  =~ /\D/  ){
>     $last = substr($unit,length($unit)-1,1);
>     substr($unit,length($unit)-1,1) = ""; #truncate
>   }

   $last = substr $unit, -1, 1, ''  while $unit =~ /\D$/;

>  SWITCH: {
>     if ($last =~ /G/){
>       $unit *= 1E9;
>       last SWITCH;
>     }
>     if ($last =~ /M/){
>       $unit *= 1E6;
>       last SWITCH;
>     }
>     if ($last =~ /[kK]/){
>       $unit *= 1E3;
>       last SWITCH;
>     }
>     if ($last =~ /m/){
>       $unit *= 1E-3;
>       last SWITCH;
>     }
>     if ($last =~ /u/){
>       $unit *= 1E-6;
>       last SWITCH;
>     }
>     if ($last =~ /n/){
>       $unit *= 1E-9;
>       last SWITCH;
>     }
>     if ($last =~ /p/){
>       $unit *= 1E-12;
>       last SWITCH;
>     }
>   }

  if    ( $last =~ /G/ )    { $unit *= 1E9 }
  elsif ( $last =~ /M/ )    { $unit *= 1E6 }
  elsif ( $last =~ /[kK]/ ) { $unit *= 1E3 }
  elsif ( $last =~ /m/ )    { $unit *= 1E-3 }
  elsif ( $last =~ /u/ )    { $unit *= 1E-6 }
  elsif ( $last =~ /n/ )    { $unit *= 1E-9 }
  elsif ( $last =~ /p/ )    { $unit *= 1E-12 }

>   return $unit;
> }
> 
> ##############################
> # some example
> 
> $value = "852.52mv";
> 
> $new_value = expand_unit($value);
> 
> #do some calculus with this new_value like: new_value1 - new_value2 ....
> 
> print "$value = $new_value\n";



John
-- 
use Perl;
program
fulfillment

-- 
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to