Scrie o funcție în PHP 7+ care să verifice un număr natural

iti dai seama ca nu l-am scris asa :)) l-am scris normal si l-am modificat just to prove a point

1 Like

123 e clar ce-i cu el, dar trebuie sa defineşti ce se întâmpă cu 0123 şi “0123”. Ce trebuie să returneze în cazul lor?

Ultimul ps este o prostie
Nu afecteaza cu nimic cate caractere am scris. Ba mai mult functia mea este relativ scurta.

Esti constient ca fisierul ocupa poate mult sub 1 kb

offtopic
Site ul unde ai pus codul este smecher. Iti zice metrice ale codului + chestii mai low level(op codes )

function p(n='') {return !!n&&n>0&&n<=9876543210&&n%1==0}

În mai puțin de 57 chars nu am reușit să-l scot :smiley:

Parametrul 0123 ajunge în funcție 123, și fiind un număr natural înseamnă că este valid.

Parametrul “0123” ajunge în funcție exact așa cum e și nefiind un număr natural rezultă că este invalid.

@Cosmin_Popescu

Atunci când ajungi să creezi script-uri complexe, este un bad practice să umpli fișierul de cod doar ca să verifici 3 lulele, 3 surcele. Nu ai cum să spui că e o prostie cerința mea, crede-mă.

Uită-te la Ionuț, a minificat funcția că aproape că nu mai returnează nimic :laughing:

@iamntz

Confirm. Nu mai returnează nimic. Ai tras de caractere atât de mult că dă numai erori.

Well, in acest caz codul nu va mai fi atat de scurt, type casting-ul nu mai este suficient, trebuie testat primul caracter sa nu fie zero.

@serghei

Și cum ai de gând să faci asta ? :laughing:

Simplu, $nr[0] != “0” :slight_smile:

Bun,

Aștept funcția.

De data asta trebuie testat si null-ul. Legat de “2.0” apare din nou problema de reprezentare. 2.0 este diferit de “2.0”, trebuie actualizate “specificatiile” :slight_smile:

function is_natural($nr = null)
{
    return $nr && $nr !== (object)$nr && $nr[0] != "0" && $nr == (int)$nr && $nr >= 0 && $nr <= 9876543210;
}

2.0 nu este un număr natural. Și nici “2.0” nu este un număr natural…

pentru “12a” si “x100” functia ta returneaza true

$nr = 0 o sa-ti dea false la prima verificare
‘b’ == (int)'b’o sa fie true.

hai sa-ncerc si eu.

function is_natural( $number = null ) {
	return ( $number !== null )
	       && $number != (object) $number
	       && $number != (array) $number
	       && (string) $number == (string) ( $number + 0 )
	       && (float) $number == (int) $number
	       && $number[0] != 0
	       && (int) $number >= 0 && (int) $number < 9876543211;

}

ps, nu, nu ma chinui sa scot spatiile si formatarea.

It works ! :slight_smile:

O chestie tare
echo(assert(CheckIfIsNumber(0.9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999))); da acest rezultat

assert(): assert(CheckIfIsNumber(1)) failed in C:\Users\cosmi\untitled2\Number.php on line 38

Am testat si cazul cu un nr foarte mare si cel de mai sus :smiley:

Update
Am pus codul si aici

function f($n=null){if($n===(object)$n)return false;if($n<=0)return false;if($n>=9876543210)return false;if($n===(int)$n)return true;} - 134 de caractere. Asa ramane. Ocupa 134 de bytes


De cati matematicieni este nevoie sa schimbi un bec ?
@alescx link gresit, :blush:

0 is_supranatural.

function is_natural($n = "")
{
	return $n !== "" && $n !== (object)$n && $n !== (array)$n && (string)$n === (string)(int)$n && $n >= 0 && $n < 9876543212;
}
""                             = should be false, was false => PASSED
" "                            = should be false, was false => PASSED
null                           = should be false, was false => PASSED
(object)null                   = should be false, was false => PASSED
(object)['caught' => true]     = should be false, was false => PASSED
new stdClass                   = should be false, was false => PASSED
array()                        = should be false, was false => PASSED
array('caught' => true)        = should be false, was false => PASSED
0                              = should be true , was true  => PASSED
"0"                            = should be true , was true  => PASSED
123                            = should be true , was true  => PASSED
1e3                            = should be true , was true  => PASSED
"1e3"                          = should be false, was false => PASSED
0xff                           = should be true , was true  => PASSED
"0xff"                         = should be false, was false => PASSED
"123"                          = should be true , was true  => PASSED
0123                           = should be true , was true  => PASSED
"0123"                         = should be false, was false => PASSED
" 123"                         = should be false, was false => PASSED
" 0123"                        = should be false, was false => PASSED
-1                             = should be false, was false => PASSED
"-1"                           = should be false, was false => PASSED
9876543211                     = should be true , was true  => PASSED
9876543212                     = should be false, was false => PASSED
1.1111111111111E+35            = should be false, was false => PASSED
2.0                            = should be false, was true  => NOT PASSED
"2.0"                          = should be false, was false => PASSED
"12a"                          = should be false, was false => PASSED
"x100"                         = should be false, was false => PASSED
1 Like

mhm. si ce se intampla cand verifici CheckIfIsNumber(‘b’)?

is_natural('2.0')

Returnează true; Oricum, e gălăgie mare în funcția aia…