Autor | Zpráva | ||
---|---|---|---|
Patholog Profil |
#1 · Zasláno: 27. 1. 2014, 09:26:28
Ahoj, potřeboval bych poradit se součtem číslic v datumu.
Mám tedy 3 comba(prvni,druhy,treti) a i input(vystup) + funkci secti která mi automaticky při zmene jakéhokoliv comba zobrazuje soucet hodnot v input. V tom problém není. Např. Číslo 32 se musí sečíst jako 3+2 a zobrazit se 5 Ovšem potřebuji, aby zobrazované hodnoty v input nebo nějakém jiném poli byly jednociferné (1-9) s vyjimkou 2 čísel 11 a 22. Kod <script type="text/javascript"> function secti() { var prvni=document.getElementById('den_nar').value; var druhy=document.getElementById('mes_nar').value; var treti=document.getElementById('rok_nar').value; document.getElementById('vystup').value = Number(prvni)+Number(druhy)+Number(treti); } </script> <select size="1" name="den_nar" tabindex="1" onchange="secti()"> <option value="1">01</option> <option value="2">02</option> <option value="3">03</option> <option value="4">04</option> <option value="5">05</option> <option value="6">06</option> <option value="7">07</option> <option value="8">08</option> <option value="9">09</option> <option value="1">10</option> <option value="2">11</option> <option value="3">12</option> <option value="4">13</option> <option value="5">14</option> <option value="6">15</option> <option value="7">16</option> <option value="8">17</option> <option value="9">18</option> <option value="1">19</option> <option value="2">20</option> <option value="3">21</option> <option value="4">22</option> <option value="5">23</option> <option value="6">24</option> <option value="7">25</option> <option value="8">26</option> <option value="9">27</option> <option value="1">28</option> <option value="2">29</option> <option value="3">30</option> <option value="4">31</option> </select> <select name="mes_nar" onchange="secti()"> <option value="1">01</option> <option value="2">02</option> <option value="3">03</option> <option value="4">04</option> <option value="5">05</option> <option value="6">06</option> <option value="7">07</option> <option value="8">08</option> <option value="9">09</option> <option value="1">10</option> <option value="2">11</option> <option value="3">12</option> </select> <select name="rok_nar" onchange="secti()"> <option value="6">1950</option> <option value="7">1951</option> <option value="8">1952</option> <option value="9">1953</option> <option value="1">1954</option> <option value="2">1955</option> <option value="3">1956</option> <option value="4">1957</option> <option value="5">1958</option> <option value="6">1959</option> <option value="7">1960</option> <option value="8">1961</option> <option value="9">1962</option> <option value="1">1963</option> <option value="2">1964</option> <option value="3">1965</option> <option value="4">1966</option> <option value="5">1967</option> <option value="6">1968</option> <option value="7">1969</option> <option selected value="8">1970</option> <option value="9">1971</option> <option value="1">1972</option> <option value="2">1973</option> <option value="3">1974</option> <option value="4">1975</option> <option value="5">1976</option> <option value="6">1977</option> <option value="7">1978</option> <option value="8">1979</option> <option value="9">1980</option> <option value="1">1981</option> <option value="2">1982</option> <option value="3">1983</option> <option value="4">1984</option> <option value="5">1985</option> <option value="6">1986</option> <option value="7">1987</option> <option value="8">1988</option> <option value="9">1989</option> <option value="1">1990</option> <option value="2">1991</option> <option value="3">1992</option> <option value="4">1993</option> <option value="5">1994</option> <option value="6">1995</option> <option value="7">1996</option> <option value="8">1997</option> <option value="9">1998</option> <option value="1">1999</option> <option value="2">2000</option> <option value="3">2001</option> <option value="4">2002</option> <option value="5">2003</option> <option value="6">2004</option> <option value="7">2005</option> <option value="8">2006</option> <option value="9">2007</option> <option value="1">2008</option> <option value="2">2009</option> <option value="3">2010</option> <option value="4">2011</option> <option value="5">2012</option> <option value="6">2013</option> <option value="7">2014</option> <option value="8">2015</option> <option value="9">2016</option> <option value="1">2017</option> <option value="2">2018</option> <option value="3">2019</option> <option value="4">2020</option> </select> <input name="vystup" type="text" id="vystup" size="5"> </script> </form> Děkuji moc za pomoc |
||
peta Profil |
No, ja bych tam udelal par zasadnich zmen. Mozna, ze eval neni uplne cool, ale v tomhle pripade by to mohlo byt celkem elegantni reseni.
//onchange="secti() onchange="secti(this) //secti() secti(item) //var prvni=document.getElementById('den_nar').value; //var druhy=document.getElementById('mes_nar').value; //var treti=document.getElementById('rok_nar').value; var f = item.form; var prvni = f.den_nar.value; var druhy = f.mes_nar.value; var treti = f.rok_nar.value; <!--option value="6">1950</option--> <option value="1950">1950</option> while (prvni>9 && prvni!=11 && prvni!=33) {prvni = eval(""+prvni.split("").join("+"));} druhy ... treti ... vystup ... |
||
Patholog Profil |
peta:
Jsem z toho zmatený.Jednoduše řečeno to neumím. Tohle mi dělalo vždy problémy. Ale i přes to děkuji |
||
peta Profil |
Ta prvni cast resi prpsani toho formulare tak, abys to nemusel scitat rucne. Samotne scitani potom resi radek 18, ktery, kdyz pridas na spravne misto a pravis to pro vysledek, tak to bude delat, co chces.
while (prvni>9 && prvni!=11 && prvni!=33) - cyklus, opakuj, dokud neplati podminka
str.split("") - rozdeli retezec po znacich 53 -> array(5,3)
.join("+") - spoji pole do retezce a jako oddelovac pouzije +; array(5,3) -> "5+3"
eval - to prevede na js kod, cili poscita to "5+3" -> 5+3 -> 8
""+ - to by tam asi byt nemuselo, pripadne by se to muselo ozavorkovat spravne, raci to tam nedavej Treba, kdyz tomu predas rok 1950, tak to udela 1950 (nevyhovuje podmince) -> 1,9,5,0 -> "1+9+5+0" -> 1+9+5+0 -> 15 15 (nevyhovuje podmince) -> 1,5 -> "1+5" -> 1+5 -> 6 6 (vyhovuje podmince) Ale, muzes pouzit vlastni funkci, ktera scitani provede cyklem |
||
Patholog Profil |
#5 · Zasláno: 27. 1. 2014, 13:47:35
Psal jsem na tvůj email jsem fakt asi lama už mi to za ty 2 dny nemyslí
|
||
Joker Profil |
peta:
Eh. Patholog: Já úplně nechápu, jak ten součet má vlastně fungovat. Mají se tedy sečíst čísla, která jsou jako value v <select>u pro zvolenou položku? A co pak? Chápu správně, že pokud to vyjde 0-9, 11 nebo 22, je to výsledek, jinak se mají sečíst ještě cifry toho čísla které vyšlo? Jestli ano, tak ten kód je skoro správně, stačí přidat jen ten druhý součet: function secti() { var prvni= Number(document.getElementById('den_nar').value); var druhy= Number(document.getElementById('mes_nar').value); var treti= Number(document.getElementById('rok_nar').value); var vysledek = Number(prvni)+Number(druhy)+Number(treti); // Pokud vyjde dvouciferný výsledek a není to 11 nebo 22, sečteme ještě jeho cifry if ((vysledek > 9) && (vysledek != 11) && (vysledek != 22)) { vysledek = Math.floor(vysledek / 10) + (vysledek % 10); } document.getElementById('vystup').value = vysledek; } function secti() { var prvni= Number(document.getElementById('den_nar').value); var druhy= Number(document.getElementById('mes_nar').value); var treti= Number(document.getElementById('rok_nar').value); var vysledek = prvni + druhy + treti; // Pokud vyjde dvouciferný výsledek a není to 11 nebo 22, sečteme ještě jeho cifry while ((vysledek > 9) && (vysledek != 11) && (vysledek != 22)) { vysledek = Math.floor(vysledek / 10) + (vysledek % 10); } document.getElementById('vystup').value = vysledek; } |
||
Patholog Profil |
#7 · Zasláno: 27. 1. 2014, 14:23:19
To je přesně ono Děkujííííí
Mít tě tady poblíž tak tě obejmu :) Díky |
||
peta Profil |
On to totiz nerekl, ale tohle pocitani se pouziva pro numerologii, jedna z tech paved, treba jsem to videl na netu delane pro jmeno a prijmeni. Stacilo by zagooglovat.
Joker: Tvuj priklad ma ten problem, ze kdyz ti tim souctem vyjde 10, 12, tak uz to dal nepokracuje, viz ten priklad, co jsem napsal pro rok 1950. Nejspis to ale pro ten soucet vyjit nemuze. 9 + 9 + 9 = 27 -> 2 + 7 = 9 |
||
Joker Profil |
#9 · Zasláno: 27. 1. 2014, 14:55:08
peta:
Když to vyjde „v prvním kole“, normálně se to znovu sečte. A ve „druhém kole“ nemůže 12 nikdy vyjít. Ale je pravda, že jsem nedomyslel případ, kdy první součet vyjde 19 a tím pádem druhý 10. Oprava je ale triviální, stačí změnit if na while .
while ((vysledek > 9) && (vysledek != 11) && (vysledek != 22)) { |
||
Patholog Profil |
#10 · Zasláno: 27. 1. 2014, 14:56:32
JJ je to pro osudové čislo ale hledal jsem googlil jsem a našel ale ten script byl tak složitý a pro mne neznámé výrazy.
Kdyby to mělo být ve Foxpro tak to mám za chviličku :). Ještě jednou díky funguje to perfektně |
||
pcmanik Profil |
#11 · Zasláno: 27. 1. 2014, 15:01:22
Joker:
Je potrebné aj v premennej výsledok znovu volať Number? Naviac keď sú neni použité operátory rovnosti typov, je potrebné vôbec Number použiť? Má nejaké výhody Number oproti parseInt? Jeho použitie vidím po prvý krát. |
||
Chamurappi Profil |
#12 · Zasláno: 27. 1. 2014, 15:15:35
Reaguji na pcmanika:
„Je potrebné aj v premennej výsledok znovu volať Number?“ Není. „je potrebné vôbec Number použiť?“ Ve value je řetězec, takže operátor plus by spojoval, nesčítal.
„Má nejaké výhody Number oproti parseInt?“ Liší se v několika případech (mám o tom nachystanou pěknou tabulku). Number provádí výchozí konverzi čehokoliv na číslo, stejnou, jako se děje třeba při násobení. Funkce parseInt a parseFloat jsou určené primárně pro řetězce.
|
||
Joker Profil |
#13 · Zasláno: 27. 1. 2014, 15:33:41
pcmanik:
„Je potrebné aj v premennej výsledok znovu volať Number?“ Samozřejmě není. Patholog měl původně Number() při tom sčítání, mně přišlo přehlednější ho dát už do deklarace proměnné, ale už jsem ho pak zapomněl smazat z toho sčítání. „Má nejaké výhody Number oproti parseInt? Jeho použitie vidím po prvý krát.“ Je to kratší :-) Bylo to v původním kódu a funguje to, tak jsem to tam nechal. |
||
Patholog Profil |
Díky
|
||
juriad Profil |
#15 · Zasláno: 27. 1. 2014, 23:06:23
Máš tam
name="den_nar" místo id="den_nar" ; odbobně u ostatních selectů.
|
||
Patholog Profil |
#16 · Zasláno: 28. 1. 2014, 19:19:27
juriad:
JJ já už na to přišel díky moc :) |
||
Časová prodleva: 11 let
|
0