Autor Zpráva
Patholog
Profil
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
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;
}
Doplnění, takto by vypadal kód upravený ve smyslu pozdějších připomínek (do příspěvku [#12]), vyznačené jsou změny:

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
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
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
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
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
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
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
Máš tam name="den_nar" místo id="den_nar"; odbobně u ostatních selectů.
Patholog
Profil
juriad:
JJ já už na to přišel díky moc :)

Vaše odpověď

Mohlo by se hodit

Neumíte-li správně určit příčinu chyby, vkládejte odkazy na živé ukázky.
Užíváte-li nějakou cizí knihovnu, ukažte odpovídajícím, kde jste ji vzali.

Užitečné odkazy:

Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: