/ Forside / Teknologi / Udvikling / PHP / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
PHP
#NavnPoint
rfh 3959
natmaden 3372
poul_from 3310
funbreak 2700
stone47 2230
Jin2k 1960
Angband 1743
Bjerner 1249
refi 1185
10  Interkril.. 1146
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

Søg
Reklame
Statistik
Spørgsmål : 177435
Tips : 31962
Nyheder : 719565
Indlæg : 6407995
Brugere : 218879

Månedens bedste
Årets bedste
Sidste års bedste