tag:forum.selfhtml.org,2005:/self
Multiplikation – SELFHTML-Forum
2011-03-08T05:51:29Z
https://forum.selfhtml.org/self/2011/feb/26/multiplikation/1496514#m1496514
Jens-Staufenberg
2011-02-26T09:42:59Z
2011-02-26T09:42:59Z
Multiplikation
<p>Guten Tag,</p>
<p>ich bin absoluter Anfänger in PHP man möge mir daher Anfängerfehler verzeihen.<br>
Folgendes Problem:<br>
<code class="language-php"><span class="token keyword">echo</span> <span class="token string single-quoted-string">'"'</span><span class="token operator">.</span><span class="token variable">$datensatz</span><span class="token operator">-></span><span class="token property">max</span><span class="token operator">.</span><span class="token string single-quoted-string">'"'</span><span class="token punctuation">;</span></code><br>
erzeugt "0.5" (man beachte Punkt nicht Komma, und keine Leerstellen)</p>
<p><code class="language-php"><span class="token keyword">echo</span> <span class="token string single-quoted-string">'"'</span><span class="token operator">.</span><span class="token variable">$datensatz</span><span class="token operator">-></span><span class="token property">max</span> <span class="token operator">*</span> <span class="token number">24.</span><span class="token string single-quoted-string">'"'</span><span class="token punctuation">;</span></code><br>
erzeugt "0"</p>
<p><code class="language-php"><span class="token keyword">echo</span> <span class="token string single-quoted-string">'"'</span><span class="token operator">.</span><span class="token punctuation">(</span><span class="token variable">$datensatz</span><span class="token operator">-></span><span class="token property">max</span> <span class="token operator">*</span> <span class="token number">24</span><span class="token punctuation">)</span><span class="token operator">.</span><span class="token string single-quoted-string">'"'</span><span class="token punctuation">;</span></code><br>
erzeugt "0"</p>
<p><code class="language-php"><span class="token keyword">echo</span> <span class="token string single-quoted-string">'"'</span><span class="token operator">.</span><span class="token punctuation">(</span><span class="token number">0.5</span> <span class="token operator">*</span> <span class="token number">24</span><span class="token punctuation">)</span><span class="token operator">.</span><span class="token string single-quoted-string">'"'</span><span class="token punctuation">;</span></code><br>
erzeugt "12" <- das gewünschte Ergebnis</p>
<p>Was mache ich denn falsch?</p>
<p></p>
https://forum.selfhtml.org/self/2011/feb/26/multiplikation/1496519#m1496519
dedlfix
2011-02-26T09:57:14Z
2011-02-26T09:57:14Z
Multiplikation
<p>Hi!</p>
<blockquote>
<p><code class="language-php"><span class="token keyword">echo</span> <span class="token string single-quoted-string">'"'</span><span class="token operator">.</span><span class="token variable">$datensatz</span><span class="token operator">-></span><span class="token property">max</span><span class="token operator">.</span><span class="token string single-quoted-string">'"'</span><span class="token punctuation">;</span></code><br>
erzeugt "0.5" (man beachte Punkt nicht Komma, und keine Leerstellen)<br>
<code class="language-php"><span class="token keyword">echo</span> <span class="token string single-quoted-string">'"'</span><span class="token operator">.</span><span class="token punctuation">(</span><span class="token variable">$datensatz</span><span class="token operator">-></span><span class="token property">max</span> <span class="token operator">*</span> <span class="token number">24</span><span class="token punctuation">)</span><span class="token operator">.</span><span class="token string single-quoted-string">'"'</span><span class="token punctuation">;</span></code><br>
erzeugt "0"<br>
<code class="language-php"><span class="token keyword">echo</span> <span class="token string single-quoted-string">'"'</span><span class="token operator">.</span><span class="token punctuation">(</span><span class="token number">0.5</span> <span class="token operator">*</span> <span class="token number">24</span><span class="token punctuation">)</span><span class="token operator">.</span><span class="token string single-quoted-string">'"'</span><span class="token punctuation">;</span></code><br>
erzeugt "12" <- das gewünschte Ergebnis<br>
Was mache ich denn falsch?</p>
</blockquote>
<p>echo '"' . ('0.5' * 24) . '"';<br>
ergibt auch "12". Du hast was anderes in $datensatz->max stehen als angezeigt wird. Lass dir den Inhalt mit var_dump() anzeigen. Wenn dabei eine andere Länge als 3 angezeigt wird, gib zusätzlich den Wert mit echo urlencode($datensatz->max); aus.</p>
<p>Lo!</p>
https://forum.selfhtml.org/self/2011/feb/26/multiplikation/1496518#m1496518
Matti Mäkitalo
matti@fanalin.de
http://www.fanalin.de
2011-02-26T10:03:14Z
2011-02-26T10:03:14Z
Multiplikation
<p>Hi,</p>
<blockquote>
<p>Folgendes Problem:<br>
<code class="language-php"><span class="token keyword">echo</span> <span class="token string single-quoted-string">'"'</span><span class="token operator">.</span><span class="token variable">$datensatz</span><span class="token operator">-></span><span class="token property">max</span><span class="token operator">.</span><span class="token string single-quoted-string">'"'</span><span class="token punctuation">;</span></code><br>
erzeugt "0.5" (man beachte Punkt nicht Komma, und keine Leerstellen)</p>
<p><code class="language-php"><span class="token keyword">echo</span> <span class="token string single-quoted-string">'"'</span><span class="token operator">.</span><span class="token variable">$datensatz</span><span class="token operator">-></span><span class="token property">max</span> <span class="token operator">*</span> <span class="token number">24.</span><span class="token string single-quoted-string">'"'</span><span class="token punctuation">;</span></code><br>
erzeugt "0"</p>
<p><code class="language-php"><span class="token keyword">echo</span> <span class="token string single-quoted-string">'"'</span><span class="token operator">.</span><span class="token punctuation">(</span><span class="token variable">$datensatz</span><span class="token operator">-></span><span class="token property">max</span> <span class="token operator">*</span> <span class="token number">24</span><span class="token punctuation">)</span><span class="token operator">.</span><span class="token string single-quoted-string">'"'</span><span class="token punctuation">;</span></code><br>
erzeugt "0"</p>
<p><code class="language-php"><span class="token keyword">echo</span> <span class="token string single-quoted-string">'"'</span><span class="token operator">.</span><span class="token punctuation">(</span><span class="token number">0.5</span> <span class="token operator">*</span> <span class="token number">24</span><span class="token punctuation">)</span><span class="token operator">.</span><span class="token string single-quoted-string">'"'</span><span class="token punctuation">;</span></code><br>
erzeugt "12" <- das gewünschte Ergebnis</p>
<p>Was mache ich denn falsch?</p>
</blockquote>
<p>Kannst du ein komplettes Beispiel posten, an dem man den Fehler nachvollziehen kann?<br>
Ich habe mir eins gebaut (s.u.), und bei mir funktioniert alles wie erwartet.</p>
<pre><code class="block language-php"><span class="token php language-php"><span class="token delimiter important"><?PHP</span>
<span class="token keyword">class</span> <span class="token class-name-definition class-name">Datensatz</span> <span class="token punctuation">{</span>
<span class="token keyword">public</span> <span class="token variable">$max</span> <span class="token operator">=</span> <span class="token string double-quoted-string">"0.5"</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token variable">$datensatz</span> <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Datensatz</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token delimiter important">?></span></span>
<span class="token doctype"><span class="token punctuation"><!</span><span class="token doctype-tag">DOCTYPE</span> <span class="token name">html</span><span class="token punctuation">></span></span>
<span class="token tag"><span class="token tag"><span class="token punctuation"><</span>html</span><span class="token punctuation">></span></span>
<span class="token tag"><span class="token tag"><span class="token punctuation"><</span>head</span><span class="token punctuation">></span></span>
<span class="token tag"><span class="token tag"><span class="token punctuation"><</span>meta</span> <span class="token attr-name">charset</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">'</span>UTF-8<span class="token punctuation">'</span></span> <span class="token punctuation">/></span></span>
<span class="token tag"><span class="token tag"><span class="token punctuation"><</span>title</span><span class="token punctuation">></span></span>Test<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>title</span><span class="token punctuation">></span></span>
<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>head</span><span class="token punctuation">></span></span>
<span class="token tag"><span class="token tag"><span class="token punctuation"><</span>body</span><span class="token punctuation">></span></span>
<span class="token tag"><span class="token tag"><span class="token punctuation"><</span>ul</span><span class="token punctuation">></span></span>
<span class="token tag"><span class="token tag"><span class="token punctuation"><</span>li</span><span class="token punctuation">></span></span>"<span class="token php language-php"><span class="token delimiter important"><?PHP</span> <span class="token keyword">echo</span> <span class="token variable">$datensatz</span><span class="token operator">-></span><span class="token property">max</span><span class="token punctuation">;</span> <span class="token delimiter important">?></span></span>"<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>li</span><span class="token punctuation">></span></span>
<span class="token tag"><span class="token tag"><span class="token punctuation"><</span>li</span><span class="token punctuation">></span></span>"<span class="token php language-php"><span class="token delimiter important"><?PHP</span> <span class="token keyword">echo</span> <span class="token variable">$datensatz</span><span class="token operator">-></span><span class="token property">max</span><span class="token operator">*</span><span class="token number">24</span><span class="token punctuation">;</span> <span class="token delimiter important">?></span></span>"<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>li</span><span class="token punctuation">></span></span>
<span class="token tag"><span class="token tag"><span class="token punctuation"><</span>li</span><span class="token punctuation">></span></span><span class="token php language-php"><span class="token delimiter important"><?PHP</span> <span class="token keyword">echo</span> <span class="token string single-quoted-string">'"'</span> <span class="token operator">.</span> <span class="token variable">$datensatz</span><span class="token operator">-></span><span class="token property">max</span><span class="token operator">*</span><span class="token number">24</span> <span class="token operator">.</span> <span class="token string single-quoted-string">'"'</span><span class="token punctuation">;</span> <span class="token delimiter important">?></span></span><span class="token tag"><span class="token tag"><span class="token punctuation"></</span>li</span><span class="token punctuation">></span></span>
<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>ul</span><span class="token punctuation">></span></span>
<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>body</span><span class="token punctuation">></span></span>
<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>html</span><span class="token punctuation">></span></span>
</code></pre>
<p>Bis die Tage,<br>
Matti</p>
<div class="signature">-- <br>
<a href="http://tntnet.org/" rel="nofollow noopener noreferrer">Webapplikationen in C++ entwickeln</a>
</div>
https://forum.selfhtml.org/self/2011/feb/26/multiplikation/1496515#m1496515
MudGuard
http://www.andreas-waechter.de/
2011-02-26T10:07:19Z
2011-02-26T10:07:19Z
Multiplikation
<p>Hi,</p>
<blockquote>
<p><code class="language-php"><span class="token keyword">echo</span> <span class="token string single-quoted-string">'"'</span><span class="token operator">.</span><span class="token variable">$datensatz</span><span class="token operator">-></span><span class="token property">max</span><span class="token operator">.</span><span class="token string single-quoted-string">'"'</span><span class="token punctuation">;</span></code><br>
erzeugt "0.5" (man beachte Punkt nicht Komma, und keine Leerstellen)</p>
</blockquote>
<p>Der String wird direkt ausgegeben.</p>
<blockquote>
<p><code class="language-php"><span class="token keyword">echo</span> <span class="token string single-quoted-string">'"'</span><span class="token operator">.</span><span class="token variable">$datensatz</span><span class="token operator">-></span><span class="token property">max</span> <span class="token operator">*</span> <span class="token number">24.</span><span class="token string single-quoted-string">'"'</span><span class="token punctuation">;</span></code><br>
erzeugt "0"</p>
</blockquote>
<p>Der String wird, um ihn mit dem Integer multiplizieren zu können, in einen Integer gewandelt.<br>
Welche Locale hast Du eingestellt? Ich hätte hier 24 erwartet - aber vielleicht ist in der verwendeten Locale der . kein Dezimaltrennzeichen ...<br>
Oder es wird bei String->Integer-Umwandlung beim ersten nicht-Integer-Zeichen abgebrochen ...</p>
<blockquote>
<p><code class="language-php"><span class="token keyword">echo</span> <span class="token string single-quoted-string">'"'</span><span class="token operator">.</span><span class="token punctuation">(</span><span class="token variable">$datensatz</span><span class="token operator">-></span><span class="token property">max</span> <span class="token operator">*</span> <span class="token number">24</span><span class="token punctuation">)</span><span class="token operator">.</span><span class="token string single-quoted-string">'"'</span><span class="token punctuation">;</span></code><br>
erzeugt "0"</p>
</blockquote>
<p>Die Klammern dürfen keinen Unterschied zum vorherigen Fall machen.</p>
<blockquote>
<p><code class="language-php"><span class="token keyword">echo</span> <span class="token string single-quoted-string">'"'</span><span class="token operator">.</span><span class="token punctuation">(</span><span class="token number">0.5</span> <span class="token operator">*</span> <span class="token number">24</span><span class="token punctuation">)</span><span class="token operator">.</span><span class="token string single-quoted-string">'"'</span><span class="token punctuation">;</span></code><br>
erzeugt "12" <- das gewünschte Ergebnis</p>
</blockquote>
<p>Der Integer 24 wird für die Multiplikation mit dem Float nach Float gewandelt, dann gerechnet.</p>
<blockquote>
<p>Was mache ich denn falsch?</p>
</blockquote>
<p>Vermutlich ist der Fehler, daß $datensatz->max ein String ist.</p>
<p>cu,<br>
Andreas</p>
<div class="signature">-- <br>
<a href="http://MudGuard.de/" rel="nofollow noopener noreferrer">Warum nennt sich Andreas hier MudGuard?</a><br>
<a href="http://ostereier.andreas-waechter.de/" rel="nofollow noopener noreferrer">O o ostern ...</a><br>
Fachfragen per Mail sind frech, werden ignoriert. Das Forum existiert.<br>
</div>
https://forum.selfhtml.org/self/2011/feb/26/multiplikation/1496517#m1496517
Matti Mäkitalo
matti@fanalin.de
http://www.fanalin.de
2011-02-26T10:10:15Z
2011-02-26T10:10:15Z
Multiplikation
<p>Hi,</p>
<blockquote>
<blockquote>
<p><code class="language-php"><span class="token keyword">echo</span> <span class="token string single-quoted-string">'"'</span><span class="token operator">.</span><span class="token variable">$datensatz</span><span class="token operator">-></span><span class="token property">max</span> <span class="token operator">*</span> <span class="token number">24.</span><span class="token string single-quoted-string">'"'</span><span class="token punctuation">;</span></code><br>
erzeugt "0"</p>
</blockquote>
<p>Der String wird, um ihn mit dem Integer multiplizieren zu können, in einen Integer gewandelt.</p>
</blockquote>
<p>Nein, ich habe ein komplettes Beispiel gepostet (und auch dedlfix hat das als Fehlerquelle eliminiert). Selbst wenn <code class="language-php"><span class="token variable">$datensatz</span><span class="token operator">-></span><span class="token property">max</span></code> ein String ist, kommt dabei 12 raus. Der Fehler ist woanders.</p>
<p>Bis die Tage,<br>
Matti</p>
<div class="signature">-- <br>
<a href="http://tntnet.org/" rel="nofollow noopener noreferrer">Webapplikationen in C++ entwickeln</a>
</div>
https://forum.selfhtml.org/self/2011/feb/26/multiplikation/1496516#m1496516
Christian Kruse
c--j--k--remove-dashes@wwwtech.de
http://wwwtech.de/
2011-03-08T05:51:29Z
2011-03-08T05:51:29Z
Multiplikation
<p>Moin MudGuard,</p>
<blockquote>
<blockquote>
<p>[…]<br>
Der String wird, um ihn mit dem Integer multiplizieren zu können, in einen Integer gewandelt.<br>
Welche Locale hast Du eingestellt?</p>
</blockquote>
</blockquote>
<p>Das ist locale-Unabhängig:</p>
<pre><code class="block">
ckruse@hermes ~ $ php -r 'setlocale(LC_ALL,"de_DE.UTF-8"); echo 0.5,"\n";'
0,5
ckruse@hermes ~ $ php -r 'setlocale(LC_ALL,"de_DE.UTF-8"); echo "0.5" * 2,"\n";'
1
ckruse@hermes ~ $ php -r 'setlocale(LC_ALL,"de_DE.UTF-8"); echo "0,5" * 2,"\n";'
0
ckruse@hermes ~ $ php -v
PHP 5.3.3 (cli) (built: Jan 7 2011 19:14:34)
Copyright (c) 1997-2010 The PHP Group
Zend Engine v2.3.0, Copyright (c) 1998-2010 Zend Technologies
ckruse@hermes ~ $
</code></pre>
<p>Lediglich bei der Ausgabe wird das Trennzeichen aus dem Locale genutzt. Hm, und scheinbar auch das nur, wenn das Locale im Script explizit gesetzt wurde…</p>
<pre><code class="block">
ckruse@hermes ~ $ locale
LANG="de_DE.UTF-8"
LC_COLLATE="de_DE.UTF-8"
LC_CTYPE="de_DE.UTF-8"
LC_MESSAGES="de_DE.UTF-8"
LC_MONETARY="de_DE.UTF-8"
LC_NUMERIC="de_DE.UTF-8"
LC_TIME="de_DE.UTF-8"
LC_ALL="de_DE.UTF-8"
ckruse@hermes ~ $ php -r 'echo 0.5,"\n";'
0\.5
ckruse@hermes ~ $ php -r 'echo setlocale(LC_ALL,NULL)," ",0.5,"\n";'
de_DE.UTF-8 0,5
ckruse@hermes ~ $
</code></pre>
<p>Wirklich merkwürdig. Und irgendwie typisch PHP, die Sprache nervt mich seit geraumer Zeit gewaltig…</p>
<blockquote>
<p>Ich hätte hier 24 erwartet - aber vielleicht ist in der verwendeten Locale der . kein Dezimaltrennzeichen ...<br>
Oder es wird bei String->Integer-Umwandlung beim ersten nicht-Integer-Zeichen abgebrochen ...</p>
</blockquote>
<p>Beim parsen von Zahlen wird nur der Punkt als Dezimal-Trennzeichen akzeptiert. s.o. :)</p>
<p>LG,<br>
CK</p>
<div class="signature">-- <br>
<a href="http://ck.kennt-wayne.de/" rel="nofollow noopener noreferrer">http://ck.kennt-wayne.de/</a><br>
</div>
https://forum.selfhtml.org/self/2011/feb/26/multiplikation/1496520#m1496520
Jens-Staufenberg
2011-02-26T10:15:32Z
2011-02-26T10:15:32Z
Multiplikation
<blockquote>
<p>echo '"' . ('0.5' * 24) . '"';<br>
ergibt auch "12".</p>
</blockquote>
<p>Stimmt es kommt auch 12 bei mir heraus.</p>
<blockquote>
<p>Du hast was anderes in $datensatz->max stehen als angezeigt wird. Lass dir »» den Inhalt mit var_dump() anzeigen.</p>
</blockquote>
<p><code class="language-php"><span class="token keyword type-declaration">object</span><span class="token punctuation">(</span>SimpleXMLElement<span class="token punctuation">)</span><span class="token comment">#16 (1) { [0]=> string(3) "0.5" }</span></code></p>
<p>»»Wenn dabei eine andere Länge als 3 angezeigt wird, gib zusätzlich den Wert »»mit echo urlencode($datensatz->max); aus.<br>
Es kommt ja 3 dabei heraus von daher!?</p>
<p>Mein zweiter versuch war ein IF Anweisung<br>
<code class="language-php"><span class="token keyword">IF</span> <span class="token punctuation">(</span><span class="token variable">$datensatz</span><span class="token operator">-></span><span class="token property">max</span> <span class="token operator">==</span> <span class="token number">0.5</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><span class="token keyword">echo</span> <span class="token string single-quoted-string">'stimmt'</span><span class="token punctuation">;</span><span class="token punctuation">}</span> </code><br>
auch ist die IF Anwendung "TRUE" und das Ergebnis "stimmt" wird angezeigt.</p>
https://forum.selfhtml.org/self/2011/feb/26/multiplikation/1496522#m1496522
Kai345
kai345@knrs.de
http://knrs.de
2011-02-26T13:31:13Z
2011-02-26T13:31:13Z
Multiplikation
<p>[latex]Mae govannen![/latex]</p>
<blockquote>
<blockquote>
<p>Du hast was anderes in $datensatz->max stehen als angezeigt wird. Lass dir »» den Inhalt mit var_dump() anzeigen.</p>
</blockquote>
<p><code class="language-php"><span class="token keyword type-declaration">object</span><span class="token punctuation">(</span>SimpleXMLElement<span class="token punctuation">)</span><span class="token comment">#16 (1) { [0]=> string(3) "0.5" }</span></code></p>
</blockquote>
<p>Also kein String oder eine Zahl, sondern ein SimpleXML-Objekt. Der Wert wird zwar bei der Ausgabe in einen String gewandelt, aber nicht bei Rechenoperationen.</p>
<p><a href="http://www.php.net/manual/de/language.types.type-juggling.php#language.types.typecasting" rel="nofollow noopener noreferrer">Typecasting</a> sollte helfen.</p>
<p>Stur lächeln und winken, Männer!<br>
Kai</p>
<div class="signature">-- <br>
Dank Hixies Idiotenbande geschieht grade eben wieder ein Umdenken<br>
in Richtung "Mess up the Web".(<a href="https://forum.selfhtml.org/?t=197497&m=1324775" rel="noopener noreferrer">suit</a>)<br>
<a href="http://selfhtml.knrs.de/#h_stylesheet" rel="nofollow noopener noreferrer">SelfHTML-Forum-Stylesheet</a>
</div>
https://forum.selfhtml.org/self/2011/feb/26/multiplikation/1496521#m1496521
dedlfix
2011-02-26T14:24:08Z
2011-02-26T14:24:08Z
Multiplikation
<p>Hi!</p>
<blockquote>
<blockquote>
<p>Du hast was anderes in $datensatz->max stehen als angezeigt wird. Lass dir den Inhalt mit var_dump() anzeigen.<br>
object(SimpleXMLElement)#16 (1) { [0]=> string(3) "0.5" }<br>
Wenn dabei eine andere Länge als 3 angezeigt wird, [...]<br>
Es kommt ja 3 dabei heraus von daher!?</p>
</blockquote>
</blockquote>
<p>Ja und nein. Ich ging davon aus, dass es zwar ein String ist, aber da irgendwas Unsichtbares enthalten ist. Aber als String hättest du nur<br>
string(3) "0.5"<br>
oder etwas Ähnliches als Ausgabe von var_dump() bekommen. Du bekommst aber ein Objekt. Das Rätsel löst sich durch die Kontrollausgabe, weil nun herauskommt, dass SimpleXML seine Finger im Spiel hat. Dies hat eine Menge eingebaute <a href="http://de.php.net/manual/en/language.oop5.magic.php" rel="nofollow noopener noreferrer">Magie</a>, die in manchen Situationen beispielsweise ein SimpleXMLElement wie ein String und manchmal wie ein Array aussehen lässt. Und da hilft dir die schon empfohlene Typumwandlung. Hier ein Beispiel zum Nachvollziehen:</p>
<p>echo '<pre>';<br>
$x = simplexml_load_string('<root>0.5</root>');<br>
var_dump($x); # Ausgabe ähnlich wie bei dir</p>
<h3>Ausgabe: 0.5 - PHP erkennt Stringkontext und ruft __toString() vom SimpleXMLElement auf.</h3><p>echo $x, "\n";</p>
<h3>Ausgabe: float(0.5) - da es kein __toFloat() gibt, nehme ich an,</h3><h3>dass __toString() aufgerufen wird und anschließend der Typecast nach float stattfindet.</h3><p>var_dump((float)$x);</p>
<h3>Ausgabe 12</h3><p>echo (float)$x * 24;</p>
<p>Lo!</p>