Autor Zpráva
quatzael
Profil
Zajímalo by mě jestli v javascriptu existuje podobná funkce pro formátování čísel jako je v php number_format($cislo,0,","," ");.

Tak aby jsem měl místo čísla např: 4568 tohle: 4 568.

Jinak to budu muset zase řešit přes AJAX, což by nebyla zas až taková hrůza, ale rozhodně by mi to ušetřilo práci.

Díky.
_es
Profil
quatzael:
podobná funkce pro formátování čísel jako je v php number_format
Priamo nie, ale určite si už niekto nejakú rovnakú, či podobnú, napísal. Prečo si neskúšal hľadať?
quatzael
Profil
_es:
hledat kde?? jestli se to dá řešit pouze jako vkládání znaků do řetězce tak si to asi napíšu sám.. nebo spíš použiju ten AJAX, protože nakonec tam stejně budu muset něco řešit AJAXem takže se nedá asi nic jinýho dělat..
_es
Profil
quatzael:
hledat kde??
Snáď vyhľadávačmi, nie? Trebárs: http://phpjs.org/functions/number_format/
Chamurappi
Profil
Reaguji na quatzaela:
Viz výpis čísla.

Jinak to budu muset zase řešit přes AJAX, což by nebyla zas až taková hrůza
Byla.
quatzael
Profil
Chamurappi:

Dík moc. Použil jsem tohle a trochu jsem si to upravil, abych tam nemusel zadávat všechny ty parametry..

„Jinak to budu muset zase řešit přes AJAX, což by nebyla zas až taková hrůza“
Byla.
Myslíš jako, že to není ideální řešení kvůli tomu, že ta stránka musí zbytečně komunikovat se serverem nebo že je to programátorsky náročnější..??

Já budu muset stejně ještě naprogramovat další funkce, který jsem původně zamýšlel udělat celý v php a hodit to tam přes AJAX, ale teď jsem si uvědomil, že to asi půjde všechno udělat přes ten javascript, protože vlastně ani nebudu muset použít databázi..
Joker
Profil
quatzael:
Myslíš jako, že to není ideální řešení kvůli tomu, že ta stránka musí zbytečně komunikovat se serverem
Řekl bych, že takhle to bylo myšlené.
Přičemž termín není ideální řešení to podle mě nevystihuje, spíš bych použil něco jako maximální prasárna.
quatzael
Profil
Joker:
...spíš bych použil něco jako maximální prasárna.
Hezky řečeno..

Ale když teď budu potřebovat zase zpátky z toho upravenýho čísla udělat normální, aby se s ním dalo počítat, tak jsem zjistil, že funkce .replace() nahrazuje jenom první vyskytující se znak v řetězci..

Našel jsem ale tohle:

function replaceAll(txt, replace, with_this) {  return txt.replace(new RegExp(replace, 'g'),with_this);}

Zdá se mi to krátký a jednoduchý, ale byly na to nějaký výhrady ohledně toho RegExp, tak by mě zajímalo jestli to náhodou není taky nějaká další programátorská čuňárna..


A ještě by mě zajímal názor jestli je ok, když si ty různý čísla ukládám (a čtu z) přímo do nezobrazovaných elementů pomocí funkce .text()??

např:

<div class="obal">
<div class="skryty-element"></div>
<div class="vnitrni-element">obsah</div>
</div>
a po kliku na něco z toho vnitrniho elementu si získávám hodnotu z / nebo zapisuju do toho skrytyho elementu (display:none;)..
neprogramuju OOP, a tohle se mi zdá jako nejjednodušší řešení, protože takových elementů tam mám hafo..
preca1
Profil
K ukládání: lepší by bylo si ty hodnoty ukládat přímo v JS. Takhle se ti v DOMu povaluje hromada zbytečnejch elementů. A když z nich čteš, tak musíš volat nějakou metodu, která dělá kdovíco.
Kde ty hodnoty bereš? Pokud ze serveru, můžeš získat naformátovaný (řetězec) i nenaformátovaný (číslo) hodnoty. Pro výpočty budeš používat číslo, pro zobrazení ten řetězec.

Pozn. 1: ze serveru můžeš dostat složitější odpověď (např. víceúrovňový JSON), takže pokud s těmi čísly pak chceš nějak počítat, možná bys ty výpočty moh provýst na serveru a ušetřit si AJAXový požadavky.

Pozn. 2: v PHP můžeš vypisovat JS, takže hned po načtení stránky můžeš mít ty hodnoty v JS a nemusíš je tahat AJAXem.
quatzael
Profil
no, ale těch čísel je jaksi víc a těch kombinací by bylo strašně moc, takže to počítání určitě budu muset udělat až po načtení ze serveru (tam mám michodem taky spoustu výpočtů). A těch elementů (jako jsem zjednodušeně uvedl výše) je tam taky víc pro to je mám víceméně definovaný pouze třídama, kromě toho obalovýho divu. Kdybych to chtěl řešit čistě proměnnými tak bych to musel řešit asi stejně pomocí objektů, protože by to jinak muselo být nějaký víceúrovňový pole, což už lepší asi řešit těma objektama..

Ale vlastně ani nevím jestli v javascriptu OOP nějaký je.. Ve většině manuálech se o tom ani nezmiňujou..
Navíc potřebuju, aby to fungovalo co nejrychleji a někde jsem četl, že OOP není zrovna moc dobrá volba pokud jde o rychlost procesů..


Kecám, zmiňujou.. OOP je i v javascriptu..
_es
Profil
quatzael:
funkce .replace() nahrazuje jenom první vyskytující se znak v řetězci..
Treba v tej funkcii použiť regulárny výraz s "g" atribútom: https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/String/replace
"text".replace(/znak/g, "inýZnak")
peta
Profil
[#1] quatzael:
http://javascript-reference.info/
toLocaleString() // existuje, ale nemusi byt podprovana prohlizeci
Nebo bys musel pouzit vlastni kod a nebo reg. vyraz (mozna s callback), viz [#11] _es.
google = javascript format number
http://www.queness.com/post/9806/5-missing-javascript-number-format-functions
//Source: Will Master
//Solution #2
function addCommas(nStr) {
    nStr += '';
    var x = nStr.split('.');
    var x1 = x[0];
    var x2 = x.length >; 1 ? '.' + x[1] : '';
    var rgx = /(\d+)(\d{3})/;
     // v tom prikladu maji tady chybne d, melo tam byt \d nebo [0-9], viz http://www.regexp.cz/ ; navic neresi to situaci chybneho cisla s nulo na zacatku 0123 -> 0 123
     
    while (rgx.test(x1)) {
        x1 = x1.replace(rgx, '$1' + ',' + '$2');
    }
     
    return x1 + x2;
}
 
/**
*   Usage:  addCommas(12345678);
*   result: 12,345,678
**/

Source: Darian Cabot
quatzael
Profil
_es:
"text".replace(/znak/g, "inýZnak")
Dík, asi použiju tohle. Zdá se to nejednodušší a vypadá to, že to bude fungovat..

peta:
navic neresi to situaci chybneho cisla s nulo na zacatku 0123 -> 0 123
To naštěstí vůbec nemusím řešit, stejně ty čísla co tam budu mít, budou z 99% do 1 mil..

Na to OOP v javascriptu jsem našel tohle: JavaScript tutorial - Creating objects
Neznáte náhodou ještě nějakej jinej lepší tutoriál.. Mě se zdá, že javascriptový OOP skoro vůbec nikde pořádně nevysvětlujou (maximálně se jen zmíní)..

A je tohle OOP vůbec praktický pro běžný programování?? Jako jestli se ta stránka pak bude chovat bez problémů..

Mě třeba strašně dělá bordel stránka www.nbcnews.com... pořád se tam něco načítá (aktualizuje) a pak se někdy i sekne.. ale možná je to taky tím, že mám nějakej malware v prohlížeči..
preca1
Profil
Napsal sem to moc jemně: ukládat hodnoty, který se používaj v JS do HTML elementů, je zvěrstvo. Určitě to bude pomalejší, všechny hodnoty budou string a principiálně je to špatně.
Je problém naformátovat ty hodnoty na serveru, udělat si jednu proměnnou a do ní všechno narvat? Např.
var cisla = {
  mzda: {
    cislo: 13000,
    formatovany: "13 000"
  },
  pocetObyvatel: {
    cislo: 123456778,
    formatovany: "123 456 778"
  }
}

OOP s timhle nemá vůbec nic společnýho. OOP vůbec chování stránky neovlivňuje. Ovlivňuje to, jak je kód čitelnej, modifikovatelnej, atd. OOP se v JS normálně používá.

Podle mě děláš nějakou ukrutnou prasárnu. Zřejmě zneužíváš AJAX na všechno, používáš HTML elementy na ukládání JS proměnných, věci, co můžeš dělat na serveru provádíš zbytečně v JS, kde pro to musíš psát vlastní funkce, který určitě nebudou tak dobrý jako ty v PHP a kdoví co ještě. Možná kdyby si vložil odkaz na živou ukázku, tak bychom ti mohli poradit, jak tu věc, co děláš, udělat líp.
quatzael
Profil
preca1:
AJAX jsem zatím použil opravdu jen když jsem potřeboval natahat něco z databáze. V PHP jsem udělal 90% všech výpočtů, který byly potřeba. Všechny ty čísla, který teď řeším jsou prakticky věci, který už ovlivňuje uživatel sám podle svýho výběru. Něco jako v e-shopu přidávání a odebírání z košíku až na to, že tady je těch pomyslných košíků víc (pro každej soubor elementů jeden) a do něho se přidávají a odebírají se z něj položky z nichž některé se vzájemně vylučují (když tam uživatel vloží jednu, druhá musí automaticky ven) a některé ne. Navíc se musí všechny ty ceny vydělit a zaokrouhlit (zase podle specifických pravidel - záleží kolik toho v tom košíku zrovna je).

Takhle mám z PHP vyjetých pro každý element asi cca 8 až 16 čísel, který se různě můžou vkládat do košíku. A počet těch kombinací jak ten košík může vypadat pak vychází do stovek, takže v tomhle si myslím, že bude chytřejší na to vytvořit ty objekty..

Už jsem i dostal nápad jak vyřešit to, aby každej ten soubor elementů se pro javascript dal odlišit.. Protože všechny ty soubory elementů vyjíždím přímo přes echo z PHP i některými proměnnými, tak tam ke každýmu elementu přidám do atributu onClick identifikující proměnou, aby se odlišily jednotlivý metody, který mají pro každý soubor elementů fungovat zvlášť.. takže to bude vypadat nějak takhle onClick=\"$identvar.metoda\" a ty funkce v těch objektech si už nějak naprogramuju..

Dal bych sem samozřejmě živou ukázku, ale to fakt nemůžu.. Konkurence je drsná..
quatzael
Profil
Nějak mi nefunguje vkládání nového příspěvku, hlásí to, že jsem nevyplnil políčko na ochrano proti spamu..


Ještě mám totiž dotaz:

Lze nějak volat funkci tak, aby název funkce byl vyjádřen proměnnou??


něco jako toto:

function first { ... }

var promenna = "first";

promenna();

ale tohle nefunguje, nevíte prosím jak to napsat, aby se dalo použít řešení na podobném proncipu??
preca1
Profil
function mojeFunkce() {
  alert('Volám funkci, arr!');
}
var nazevFunkce = 'mojeFunkce';
window[nazevFunkce]();
quatzael
Profil
preca1:
supr, dík moc. A ještě jsem zapoměl dodat, funguje to i na volání objektů??

jak např.:

function mujObjekt() {
  this.metoda = mojeMetoda;
}
function mojeMetoda() {
  alert('Volám funkci, arr!');
}

var objekt = new mujObjekt;

var nazevObjektu = 'objekt';
window[nazevObjektu].metoda();



ještě abych to upřesnil.. zkouším to takhle a nefunguje to:

    
     function proveThis() {
     this.metoda = mojeMetoda;
    }
     function mojeMetoda() {
      return ("proven");
     }
    
    var objekt = new proveThis;
 
    var nazevObjektu = 'objekt';
    var alert = window[nazevObjektu].metoda();   
   
    window.alert (alert);


přitom normálně funguje:

 var alert = objekt.metoda();   
 window.alert (alert);
Chamurappi
Profil
Reaguji na quatzaela:
Lze nějak volat funkci tak, aby název funkce byl vyjádřen proměnnou??
K čemu to potřebuješ? Máš podivné požadavky.

funguje to i na volání objektů??
Viz Dvojí přístup ke členu objektu.
quatzael
Profil
Chamurappi:
K čemu to potřebuješ? Máš podivné požadavky.
Trochu jsem ten problém vysvětloval zde: #15..
Je to složitější... Mám sadu elementů (jednotlivých nabídek produktů s dodatečnými produkty; kolik jich v reálu bude závisí na předchozí volbě), který by se v zásadě měly chovat stejně (proto je mám definovaný třídama a ne identifikátorama), ale počítání s čísly (vkládání do košíku, upravy dělením, zaokrouhlováním fungují u každého trochu rozdílně).. Proto jsem chtěl označit identifikátorem jen obalovej element, pro který by byla jedninečná třída (myslím objektovou)..

takže zjednodušeně ta struktura jednoho z těch elementů by mohla vypadat takto:

<div id="element1" class="obal">
<div class="vnitrni-element">obsah</div>
</div>

přičemž zrovna pro tenhle by existivala třída:

function objektElement1() {
  this.metoda = mojeMetoda1;
}
function mojeMetoda1() {
  alert('Volám funkci, arr!');
}

function objektElement2() {
  this.metoda = mojeMetoda2;
}
function mojeMetoda2() {
  alert('Volám funkci, arr!');
}


var element1 = new objektElement1;
var element2 = new objektElement2;

$("#vnitrni-element").click(
function() {  
 var nazevObjektu = $(this).closest(".obal").attr("id");
 window[nazevObjektu].metoda();   
});     

jde o to, že u každýho objektu budou stejný metody (názvy i počet), ale každá se bude chovat trochu jinak (každá bude definována pod jinou třídou)..
každej ten jednotlivej element má mnoho shodných prvků (CSS, a něco i z javascriptu), to počítání je jediný co je odlišuje, takže bych chtěl, aby zůstaly ty elementy definovaný univerzálně třídama a jen pro to počítání by se měly nějakým způsobem identifikovat a fungovat samostatně..

Nevím jestli jsem to vysvětlil dostatečně, ale aspoň z toho ukázkovýho kódu se myslím dá poznat co potřebuju..
až na to že právě to window[nazevObjektu].metoda(); bohužel nefunguje...


Chamurappi:
Viz Dvojí přístup ke členu objektu.
No pokud by fungovalo tohle:
 
var vlastnost = "konkretnimetoda";
objekt[vlastnost];

tak bych to asi taky mohle udělat nějakpodobně s tím, že bych měl jen jednu třídu a v ní pak nespočet metod pro každý obalový element jednu..
trochu by to možná bylo nepřehlednější tím, že bych měl ty názvy metod o něco delší, protože by obsahovaly i identifikaci pro ty obalový elementy..
quatzael
Profil
Chamurappi:
Viz Dvojí přístup ke členu objektu.
Zápisy objekt.vlastnost a objekt["vlastnost"] jsou ekvivalentní.

Mě to moc ekvivalentní nepříjde..

Když mám opět stejný příklad:

 function mujObjekt() {
 this.metoda = mojeMetoda;
 }
 function mojeMetoda() {
 return ("proven");
 }
     
 var objekt = new mujObjekt;
   
 var alert = objekt.metoda();   
 window.alert (alert);
      
 var show = objekt["metoda"];
 window.alert (show);       

----------------------------------------------------------------------
window.alert (alert); vypíše:
proven

kdežto window.alert (show); vypíše:

function mojeMetoda() {
return ("proven");
}


dělám něco blbě??
Tori
Profil
quatzael
dělám něco blbě??
Podruhé tu funkci nevoláte (ale pracujete s celou funkcí jako objektem).
quatzael
Profil
Tori:
ale jak jí tedy mám tím druhým způsobem "volat"??
Tori
Profil
Je to přeci obyčejná funkce, to je jedno přes jaký identifikátor se k ní dostanete:
objekt.metoda();
objekt["metoda"]();
objekt[jinyObjekt.zjistiNazvyVsechMetod(objekt)[1]](); // (metoda zjistiNazvy... vrátila pole, kde řetězec "metoda" je druhým prvkem
quatzael
Profil
Tori:
no vždyť jo, já jsem pako... jsem tam zapoměl ty závorky..


Tori:
no a lze tedy nějak použít proměnnou i přímo pro název toho objektu, když to lze tak jednoduše pro tu metodu??


Chamurappi:
ještě to zkusím co nejjednodušeji shrnout..

mám pod sebou několik (cca 12, přesný počet závisí na předchozím kroku) obalových elementů jako zjednodušeně zde:

<div id="element1" class="obal">
<div class="vnitrni-element">obsah</div>
</div>

všechny elementy uvnitř obalovýho elementu jsou definovány pouze třídou, jen obalový element má identifikátor.
a já potřebuju, aby když klient klikne na některý z vnitřních elementů, javascript poznal, o který celek se jedná a podle toho použil metodu, která mu přísluší..

ještě poznámka: těch vnitřních elementů je tam poměrně hodně a každý má nějakou svou funkci, takže by se mi hodilo, kdyby pro každý element mohl být jen jeden objekt..
Tori
Profil
quatzael:
až na to že právě to window[nazevObjektu].metoda(); bohužel nefunguje...
Špatný selektor:
<div id="element1" class="obal">
<div class="vnitrni-element">obsah</div>
</div>
$(".vnitrni-element").click(
function() {  
 var nazevObjektu = $(this).closest(".obal").attr("id");
 window[nazevObjektu].metoda();   
});



Jinak osobně bych všechny ty třídy a metody zabalila do jednoho (možná globálního) objektu (připadá mi zbytečné definovat x globálních funkcí, když je potřebuju jen v jednom objektu), něco jako asoc.pole v PHP:
var q = {
    element1 : {
         metoda : function() {
            alert('elm 1, metoda');
        }
    },
    element2 : {
        metoda : function() {
            alert('elm 2, metoda');
        }
    }
};

$(".vnitrni-element").click(
function() {  
    var nazevObjektu = $(this).closest(".obal").attr("id");
    q[nazevObjektu].metoda();   
});
quatzael
Profil
Tori:
selektor jsem tam zatím ani nepoužil.. nefunguje mi ani ten normální způsob:

tohle funguje bez problému:

var alert = objekt.metoda();

kdežto tohle nefunguje:

var alert = window['objekt'].metoda();

hlásí to chybu: "Nelze načíst hodnotu vlastnosti metoda: Objekt má hodnotu Null nebo není definován."
Tori
Profil
A nemáte to celé zabalené v nějaké funkci? Např.:
$(document).ready(function(){
    var objekt = new MujObjekt();
    // ... atd.
});
quatzael
Profil
Tori:
jo, dobrej postřeh!!

mám to dát celý ven?? tohle: var objekt = new MujObjekt(); i tu definici objektu a metod??

jinak to volání metod ale potřebuju mít v tý funkci:
$(document).ready(function(){
    var objekt = new MujObjekt();
    // ... atd.
});



Tori:
vyndal jsem to ven před to a funguje to!! Supr, moc díky!! Konečně se můžu pohnout dál.

jinak v tom $(document).ready(function(){ ... }); má i jiný definovaný funkce (ne objekty) a normálně fungují. Mám je dát asi radši všechny ven, co?
Tori
Profil
quatzael:
To je jen záležitost rozsahu platnosti proměnné - pokud proměnnou definujete uvnitř funkce, můžete ji jejím názvem volat jen tam. Pokud ji definujete jako globální proměnnou (= mimo funkci*), můžete ji ve funkci volat jak jménem, tak přes window.proměnná - stejně jako vám teď uvnitř funkce funguje jak alert('text');, tak window.alert('text'); nebo i window['alert']('text');.

* pomíjím možnost definice glob. proměnné zevnitř funkce.

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:

Odkud se sem odkazuje


Prosím používejte diakritiku a interpunkci.

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