| 
					
							
        
    
        
						
			 | 
			
			
					    
					
        
         
          
         
	
            | Formatering på float Fra : Stig Sørensen | 
  Dato :  14-10-10 00:56 |  
  |  
 
            Hej gruppe.
 Jeg har lavet en simpel "Ohms lov" udregner.
 Der er fire input felter, henholdsvis til spænding (U), strømstyrke
 (I), modstand (R) og effekt (P) - er blot to af disse felter udfyldt
 med et tal, så finder PHP-scriptet resultatet på de resterende to.
 PHP delen kan ses her:  http://pastebin.com/tva7fqEe
Mit problem er når et resultat er f.eks. 50.54545454545454 Ohm - så
 skrives det med et væld af decimaler.
 Jeg har så forsøgt mig med number_format med kun to decimaler, dette
 virker dog også - næsten, for da hvis et resultat er: 0.0000010 Volt -
 ja så vises det jo som 0.00 Volt.
 Kan der ikke laves en flot løsning på dette?
 Som et sidespørgsmål, af ren nysgerrighed, kunne min if-elseif
 afdeling være blevet gjort smartere? F.eks. i et loop? (Min tanke går
 på, at hvis der nu var 100 udregningsmuligheder, så galt det jo om at
 holde tungen lige i munden    )
 På forhånd tak for hjælpen
 mvh
 Stig
            
              |   |   
            
        
 
            
         
           Birger Sørensen (14-10-2010) 
         
	
            | Kommentar Fra : Birger Sørensen | 
  Dato :  14-10-10 08:30 |  
  |  
 
            Stig Sørensen frembragte:
 > Hej gruppe.
 >
 > Jeg har lavet en simpel "Ohms lov" udregner.
 >
 > Der er fire input felter, henholdsvis til spænding (U), strømstyrke
 > (I), modstand (R) og effekt (P) - er blot to af disse felter udfyldt
 > med et tal, så finder PHP-scriptet resultatet på de resterende to.
 >
 > PHP delen kan ses her:  http://pastebin.com/tva7fqEe
>
 >
 > Mit problem er når et resultat er f.eks. 50.54545454545454 Ohm - så
 > skrives det med et væld af decimaler.
 > Jeg har så forsøgt mig med number_format med kun to decimaler, dette
 > virker dog også - næsten, for da hvis et resultat er: 0.0000010 Volt -
 > ja så vises det jo som 0.00 Volt.
 >
 >
 > Kan der ikke laves en flot løsning på dette?
 >
 >
 > Som et sidespørgsmål, af ren nysgerrighed, kunne min if-elseif
 > afdeling være blevet gjort smartere? F.eks. i et loop? (Min tanke går
 > på, at hvis der nu var 100 udregningsmuligheder, så galt det jo om at
 > holde tungen lige i munden    )
 >
 >
 > På forhånd tak for hjælpen
 >
 >
 > mvh
 > Stig
 Du skal bruge scientific notation.
 Gang eller divider dit resultat med 1000 indtil det er > 0 og < 1000, 
 tæl op hvor mange gange der ganges/divideres. Det giver dig eksponenten 
 - som skal angives med Terra, Giga, Mega, Kilo, ingen, milli, micro, 
 nano, penta...
 Derefter udskriver du med det antal cifre du har brug for eller lyst 
 til.
 If'er bliver sjældent overskuelige.
 Man kan bruge switch - men den vil i dit tilfælde også blive 
 kompliceret, for det skal være i flere trin, så det vil næppe blive 
 mere overskueligt...
 Birger
 -- 
 http://varmeretter.dk - billig, sund og hurtig mad
 http://bbsorensen.dk
            
             |   |   
            
        
 
            
         
           Martin Larsen (14-10-2010) 
         
	
            | Kommentar Fra : Martin Larsen | 
  Dato :  14-10-10 11:03 |  
  |   
            Birger Sørensen wrote:
 
 > Gang eller divider dit resultat med 1000 indtil det er > 0 og < 1000,
 > tæl op hvor mange gange der ganges/divideres. Det giver dig eksponenten
 > - som skal angives med Terra, Giga, Mega, Kilo, ingen, milli, micro,
 > nano, penta...
 > Derefter udskriver du med det antal cifre du har brug for eller lyst til.
 
 Ideen er rigtig, men det kan gøres lettere med logaritmer.
 
 <?php
 
 $units = array(-12=>'p', -9=>'n', -6=>'µ', -3=>'m', 0=>'',3=>'k', 
 6=>'M', 9=>'G', 12=>'T');
 $longunits = array(-12=>'pico', -9=>'nano', -6=>'mikro', -3=>'milli', 
 0=>'', 3=>'kilo', 6=>'mega', 9=>'giga', 12=>'tera');
 
 $n = 55.54545454545454;
 
 $exp = floor(log10($n)/3)*3;
 $base = $n/pow(10, $exp);
 $unit = $longunits[$exp];
 printf('%.2f %s', $base, $unit);
 
 ?>
 
 Tilføj selv flere enheder.
 
 Output fx:
 
 55.54
 555.54
 5.56 mega
 56.45 nano
  
            
             |   |   
            
        
 
            
         
            Birger Sørensen (14-10-2010) 
         
	
            | Kommentar Fra : Birger Sørensen | 
  Dato :  14-10-10 11:47 |  
  |  
 
            Martin Larsen tastede følgende:
 > Birger Sørensen wrote:
 >
 >> Gang eller divider dit resultat med 1000 indtil det er > 0 og < 1000,
 >> tæl op hvor mange gange der ganges/divideres. Det giver dig eksponenten
 >> - som skal angives med Terra, Giga, Mega, Kilo, ingen, milli, micro,
 >> nano, penta...
 >> Derefter udskriver du med det antal cifre du har brug for eller lyst til.
 >
 > Ideen er rigtig, men det kan gøres lettere med logaritmer.
 >
 > <?php
 >
 > $units = array(-12=>'p', -9=>'n', -6=>'µ', -3=>'m', 0=>'',3=>'k', 6=>'M', 
 > 9=>'G', 12=>'T');
 > $longunits = array(-12=>'pico', -9=>'nano', -6=>'mikro', -3=>'milli', 0=>'', 
 > 3=>'kilo', 6=>'mega', 9=>'giga', 12=>'tera');
 >
 > $n = 55.54545454545454;
 >
 > $exp = floor(log10($n)/3)*3;
 > $base = $n/pow(10, $exp);
 > $unit = $longunits[$exp];
 > printf('%.2f %s', $base, $unit);
 >
 > ?>
 >
 > Tilføj selv flere enheder.
 >
 > Output fx:
 >
 > 55.54
 > 555.54
 > 5.56 mega
 > 56.45 nano
 Selvfølgelig... Elegant!
  
Birger
 -- 
 http://varmeretter.dk - billig, sund og hurtig mad
 http://bbsorensen.dk
            
             |   |   
            
        
 
            
         
           Stig Sørensen (14-10-2010) 
         
	
            | Kommentar Fra : Stig Sørensen | 
  Dato :  14-10-10 05:45 |  
  |  
 
            On 14 Okt., 12:02, Martin Larsen <martin+spamfree+lar...@bigfoot.com>
 wrote:
 > Ideen er rigtig, men det kan gøres lettere med logaritmer.
 >
 > <?php
 >
 > $units = array(-12=>'p', -9=>'n', -6=>'µ', -3=>'m', 0=>'',3=>'k',
 > 6=>'M', 9=>'G', 12=>'T');
 > $longunits = array(-12=>'pico', -9=>'nano', -6=>'mikro', -3=>'milli',
 > 0=>'', 3=>'kilo', 6=>'mega', 9=>'giga', 12=>'tera');
 >
 > $n = 55.54545454545454;
 >
 > $exp = floor(log10($n)/3)*3;
 > $base = $n/pow(10, $exp);
 > $unit = $longunits[$exp];
 > printf('%.2f %s', $base, $unit);
 >
 > ?>
 >
 > Tilføj selv flere enheder.
 >
 > Output fx:
 >
 > 55.54
 > 555.54
 > 5.56 mega
 > 56.45 nano
 Det var en rigtig elegant løsning, Martin.
 Jeg blev dog inspireret af Birgers svar og kom frem til dette:
 http://pastebin.org/170553
Mvh
 Stig
            
              |   |   
            
        
 
            
         
           Bertel Lund Hansen (14-10-2010) 
         
	
            | Kommentar Fra : Bertel Lund Hansen | 
  Dato :  14-10-10 12:58 |  
  |  
 
            Stig Sørensen skrev:
 > Jeg blev dog inspireret af Birgers svar og kom frem til dette:
 Du har forhåbentlig
      setlocale (LC_ALL, 'da_DK');
 med? Så får du udskrift med rigtigt decimaltegn.
 -- 
 Bertel
 http://bertel.lundhansen.dk/         FIDUSO:  http://fiduso.dk/
            
             |   |   
            
        
 
            
         
           Stig Sørensen (14-10-2010) 
         
	
            | Kommentar Fra : Stig Sørensen | 
  Dato :  14-10-10 05:57 |  
  |   
            Ved input felterne skal man bruge . som komma.
 Hvordan tillader jeg brug af komma i stedet?
 
 Jeg er ikke en ørn til preg_match.
 
 mvh
 Stig
  
            
             |   |   
            
        
 
            
         
           Ole Gaarde Kristense~ (14-10-2010) 
         
	
            | Kommentar Fra : Ole Gaarde Kristense~ | 
  Dato :  14-10-10 22:20 |  
  |   
            >"Stig Sørensen" <stig.sorensen@gmail.com> skrev i en meddelelse 
 >news:a1984c8e-2bd2-4ddf-88da-b0eb7759be26@c21g2000vba.googlegroups.com...
 >Ved input felterne skal man bruge . som komma.
 >Hvordan tillader jeg brug af komma i stedet?
 >
 >Jeg er ikke en ørn til preg_match.
 >
 >mvh
 >Stig
 
 Hej Stig
 
 Jeg er heller ikke god til preg_match så jeg plejer at gøre det at jeg 
 ganske enkelt udskifter komma med punktum.
 $output=str_replace(',','.',$input);
 
 -- 
 Med venlig hilsen
 Ole Gaarde Kristensen
 
 
  
            
             |   |   
            
        
 
            
         
           Ronny Olsen (14-10-2010) 
         
	
            | Kommentar Fra : Ronny Olsen | 
  Dato :  14-10-10 13:49 |  
  |   
            
 > Mit problem er når et resultat er f.eks. 50.54545454545454 Ohm - så 
 skrives det med et væld af decimaler
 $u = 50.54545454545454;
 printf("%.2f volt", $u); // udskriver 50.55 volt
  >for da hvis et resultat er: 0.0000010 Volt - ja så vises det jo som 
 0.00 Volt.
 hvad med at finde prefix og udskrive denne ??
 function prefix(&$tal, &$pre, $TalIndex=1000.0){
    $PreArray = array(
       array (' ','K','M','G','T','P','E','Z','Y'), //kilo, mega, giga, tera, 
 peta, exa, zetta, yotta
       array (' ','m','µ','n','p','f','a','z','y')  //milli, micro, nano, 
 picro, femto, atto, zepto, yocto
    );
   
    $i;
    $Case;
   
    if($tal < 0)  exit(-1); // return(-1)
    if($tal == 0){
       return;
    }
    if($tal >= 1.0){
       $Case = 0;
       for($i=0; $tal>$TalIndex;$i++) $tal /= $TalIndex;
    }
    else{
       $Case = 1;
       for($i=0; $tal<1;$i++) $tal *= $TalIndex;
    }   
    $pre = $PreArray[$Case][$i][0];      
 }
 $u = 0.0000010;
 $pre ='';
 prefix($u, $pre);
 printf("%.2f %c volt", $u, $pre); // udskriver 1.00 µ volt
  >kunne min if-elseif afdeling være blevet gjort smartere?
 jeg gjorde det, at jeg lavede en checkbox, der skulle sættes flueben i, 
 og checkboxene havde så værdierne 1, 2, 4, 8
    $sum = array_sum($_REQUEST['checkbox']);
   
   
    switch($sum){
       // U og R
       case 3: $I=$U/$R; $P=$U*$U/$R;   break;
      
       // U og I
       case 5: $R=$U/$I; $P=$U*$I;   break;
      
       // R og I
       case 6: $U=$R*$I; $P=$R*($I*$I); break;
      
       // U og P
       case 9: $I=$P/$U; $R=$U*$U/$P;    break;
 ......
    }
 demo    http://olsensweb.dk/myownapps/elnik/ohm.php
source  http://olsensweb.dk/myownapps/elnik/elnik.zip
-- 
 Med Venlig Hilsen
 Ronny Olsen
 http://olsensweb.dk
            
             |   |   
            
        
 
    
 
					
					 
			 | 
			
				
        
			 |