|
| 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
| |
|
|