Kako provjeriti dali je uneseni znak broj?

Pozdrav napravio sam skriptu gdje će korisnik unositi dan mjesec i godinu svog rodjenja, ovo je forma
[HTML]

Datum rođenja: [/HTML]

e sad provjeravam koliko je znakova u polja uneseno vako

A moželi mi neko reći kako da provjeravam dali su uneseni znakovi brojevi ako korisnik unese slovo da mu ispisem gresku.

Ja sam probo nešto uraditi sa (int) ali mi nije uspjelo

u mysql bazu spremam vako

`datum_rodjenja` date NOT NULL default '0000-00-00',

is_numeric()

is_numeric()

ilijoš bolje

var num = 123;

if ( num.match(/^[0-9]+$/) ) {
alert("broj");
}

else if ( !num.match(/^[0-9]+$/) ) {
alert("nije broj");
}

Ne znam kako se JS ponasa, znam da sa PHP-om zna bit problema ako spremis varijablu ovako:
$num = “123”; -> string
$num = 123; -> number
onda moras provjeravat jeli taj string ustvari sadrzi brojcanu vrijednost… :S
najbolje je provjreit reguralnim izrazima

[quote=“Limeni”]
$num = “123”; -> string
$num = 123; -> number
onda moras provjeravat jeli taj string ustvari sadrzi brojcanu vrijednost… :S
najbolje je provjreit reguralnim izrazima[/quote]

Ma da, a odaklem ti to? Pitam jer php manual kaže nešto sasvim drugačije:

http://www.php.net/manual/en/function.is-numeric.php

Problem s is_numeric je

Numeric strings consist of optional sign, any number of digits, optional decimal part and optional exponential part.

Tak da limeni ima pravo. Pattern koji se traži je ovaj:

/^(?:[0-9])$/ - sam treba staviti da odgovara jednom znaku, to si pogledaj po netu

Ne sjecam se tocnog primjera, znam da sam na serveru morao provjeravat jeli varijabla koji sam primio broj i imao sam neobicnih problema sa php funkcijama za provjeru tipa varijable.

Al evo probaj ovaj primjer:

<?php

	$num = "1e4";
	
	if ( is_numeric($num) ) {
		echo "numeric je";
	}
	
?>

Ovo ocito nije broj ali ce ti php javit da je.

Tako da je najbolje sto gosaric kaze pronadi si najbolji pattern na netu koji ce prihvacat tocno ono sto trebas.

jos lakse i brze ctype_digit()

[quote=“Limeni”]Ne sjecam se tocnog primjera, znam da sam na serveru morao provjeravat jeli varijabla koji sam primio broj i imao sam neobicnih problema sa php funkcijama za provjeru tipa varijable.

Al evo probaj ovaj primjer:

<?php

	$num = "1e4";
	
	if ( is_numeric($num) ) {
		echo "numeric je";
	}
	
?>

Ovo ocito nije broj ali ce ti php javit da je.

Tako da je najbolje sto gosaric kaze pronadi si najbolji pattern na netu koji ce prihvacat tocno ono sto trebas.[/quote]

Što uopće nije pogrešno jer 1e4 predstavlja broj 10 na 4 gdje e označava izraz exponenta.

[quote=""]Most calculators and many computer programs present very large and very small results in scientific notation. Because superscripted exponents like 107 cannot always be conveniently represented on computers, typewriters and calculators, an alternative format is often used: the letter E or e represents times ten raised to the power of, thus replacing the × 10, followed by the value of the exponent. Note that the character e is not related to the mathematical constant e (a confusion that is less likely with capital E); and though it stands for exponent, the notation is usually referred to as (scientific) E notation or (scientific) e notation, rather than (scientific) exponential notation (though the latter also occurs).
[/quote]
izvor:

Mislim da ti bi ovo trebao znati svatko tko se bavi programiranjem, jer to spada u elemetarna znanja, ne samo programiranja nego matematike uopće. Tako da taj tvoj primjer uopće nije primjer problema, nego ne razumijevanje matematike. NHF

[quote=“CreatifCode”]Što uopće nije pogrešno jer 1e4 predstavlja broj 10 na 4 gdje e označava izraz exponenta.

izvor:

Mislim da ti bi ovo trebao znati svatko tko se bavi programiranjem, jer to spada u elemetarna znanja, ne samo programiranja nego matematike uopće. Tako da taj tvoj primjer uopće nije primjer problema, nego ne razumijevanje matematike. NHF[/quote]

Zasto mislis da ne znam sto predstavlja 1e4?

Sa funkcijom is_numeric() na serveru nemozes tocno provjeriti jeli vrijednost koju korisnik salje iskljucivo broj! I onaj moj primjer upravo prikazuje taj problem!

Ako saljes varijablu ajaxom, vrijednost ces dobit kao string type, is_int() ce ti vratit false, is_numeric() ce ti vratit true ali ne uvijek, ako ti posalje 1e4 ili bilo koji broj napisan u eksponencijalnoj notaciji, prepoznat ces ga kao broj a imat ces slovo “e” koje nije broj. Ako u bazu moram spremit broj prema kojem cu sortirat, onda to mora bit broje a ne 1e4. A funkcija is_numeric ce propustit “e”.

Onaj moj primjer tocno pokazuje zasto is_numeric() nije pouzdana funkcija i zasto je bolje koristiti reguralne izraze za provjeru i taj primjer je bas pravi primjer problema!

Mislim da stvarno nemas pojma o PHP-u kad ne vidis problem sa is_numeric() u onom jednostavnom primjeru! NHF!

nebi se tija misati, ali…

sve sta saljes na server je string pa normalno da is_int() vraca false

Ok, nemam pojma, ali taj isti problem ćeš imati u C++, kojeg je PHP derivat, Perl, Fortranu i u još moru drugih programskih jezika.

EOD for me.

Možda je najbezbolnije rješenje:

$var = (int) $x;

:slight_smile:

[quote=“antelaca”]nebi se tija misati, ali…

sve sta saljes na server je string pa normalno da is_int() vraca false[/quote]

:doki:

is_int daje inoformaciju o tipu varijable, dok is_numeric daje informaciju o sadržaju varijable, u smislu da li bi se sadržaj mogao interpetirati kao broj. To su dvije posve različite funkcije.

U dokumentaciji stoji da is_numeric provjerava je li ulazni parametar broj ili “brojevni string” (tj. dat će isti rezultat za 123 kao i za “123” - prvo je broj, a drugo “brojevni string”).

Valja pri tome imati na umu da “brojevi” nisu samo “cjelobrojni brojevi u decimalnoj notaciji” - stoga is_numeric funkcija nije nužno dobar način ispitivanja da li je moguće promjeniti tip varijable tako da se naprosto ispita vraća li is_numeric istinu. Očigledan primjer je da bez obzira na programski jezik, ( int )x i ( float )x ne bi dali isto, bez obzira što bi is_numeric( x ) dao istinu za x = “3.14” i x = 3.14. Nešto specifičnije, a možda i neobično je da će ( int )“3e2” dati 3 umjesto 300. Dok će ( float)“3e2” dati ispravno 300. Matematički, 3e2 je cijeli broj. Iako notacija s točkom ili “e” u programskom jeziku tipično implicira i tip varijable, opet bi se moglo očekivati da će “3e2” biti pretvoren u float 300, pa potom u integer 300. No, PHP to tako ne pretvara. Ovo ponašanje je donekle dokumentirano:[quote=""]f the string does not contain any of the characters ‘.’, ‘e’, or ‘E’ and the numeric value fits into integer type limits (as defined by PHP_INT_MAX), the string will be evaluated as an integer. In all other cases it will be evaluated as a float. [/quote]Ovdje se misli na implicitnu konverziju, pa možda ne treba zamjeriti nekome tko zaključi da bi korištenje funkcije intval( “3e2” ) trebalo ili dati 300 ili rezultirati pogreškom jer “3e2” nije sintaksno valjani zapis. Ali, eto, nije tako - u PHP-u su odlučili da funkcija intval, odn. unarni operator int uzimaju najlijeviji sintaksno ispravni dio stringa, a ostatak ignoriraju. To se lako provjeri pomoću intval( “3z2”) ili ( int )“32blabla” . No, valja uočiti da to nije problem funkcije is_numeric - ona točno indicira da se sadržaj stringa “3e2” može interpetirati kao nekakav broj u nekakvoj od nje prepoznavanoj notaciji, dok isto ispravno tumači da se sadržaj stringa “3z2” ne može interpetirato kao broj u niti jednoj od njoj prepoznatljivih notacija, iako će funkcija intval ipak dati nekakav broj i za takav unos. To nas upozorava da funkcije is_numeric i intval (odn. unarni operator int) zapravo i nemaju neke veze jedno s drugim. Isto tako “sigurna” konverzija ne mora biti niti ( float ), odn. floatval(); npr. is_numeric( “0.01000000000001” ) je istina, ali floatval( “0.01000000000001” ) može dati 0.01.

[quote=“Gosaric”]Možda je najbezbolnije rješenje:

$var = (int) $x;

:)[/quote]

ovo nije rjesenje… ti tu radis konverziju a ne provjeru da li je unesen broj

najbezbolnije rjesenje je ctype_digit() funkcija koja provjerava da li su svi znakovi u stringu broj

Mislim da je ova tema trebala da stane na ovom postu. Obzirom kako je momak postavio pitanje ovo je savrsen odgovor.