✉️ Saņem šito visu e-pastā. Tā vietā, lai palaistu garām kaut ko no tā, ko es rakstu savā blogā, tagad vari pierakstīties un saņemt e-pastā visu, ko es te rakstu. Tas nav bieži.

← Uz sākumu

Skaitļi un PHP

2004. gada 5. martā, 11 komentāri

Kā zināms, PHP nav strikti noteiktu mainīgo tipu. Piem., string <=> skaitlis konversijas notiek vienā vīlē. Taču, ir daži caveats, par kuriem vēlētos jums pastāstīt :) Konkrēti iet runa par to, kā pārvēršas strings par skaitli un ko darīt, lai tas notiktu puslīdz universāli.

Sāksim ar to, ka nodefinēsim - skaitlis var būt gan vesels, gan ar komatu un stuff.

Uzreizi rodas nepieciešamība apstrādāt ne tikai decimālo punktu (.), bet arī decimālo komatu (,). Tā kā PHP pēc noklusēšanas par decimālo atdalītāju uzskata tieši punktu, nevis komatu, tad nepieciešama viena īsa rindiņa:

$skaitlis = str_replace(',', '.', $skaitlis);

Tālāk. Liela daļa cilvēku pārbauda, vai ievadītais ir skaitlis, ar funkcijas is_numeric() palīdzību. Viss jau būtu labi, bet lietotājiem nereti ir tendence ievadīt ne tikai skaitli, bet arī dažas labas tukšuma zīmes pirms un pēc tā. Un ja ir šīs tukšuma zīmes, lielākoties, paziņojot, ka skaitlis ievadīts nepareizi, lietotājs apmulsīs, jo kļūdu neredzēs.

Ja cilvēks ievada ' 0.12' (pirms skaitļa ir atstarpe), tad viss ir ok. is_numeric() atgriež true.

Taču, ja atstarpe parādās pēc skaitļa, šī pati funkcija atgriež false. Šinī gadījumā mēs saucam talkā trim() un mūsu kods izskatās jau šādi:

$skaitlis = str_replace(',', '.', $skaitlis);
$skaitlis = trim($skaitlis);

Protams, ja nav nepieciešams apstrādāt lietotāja kļūdas, tad var izmantot type casting, pārveidojot skaitli par sev nepieciešama datu tipa pārstāvi kādā no sekojošajiem veidiem:

$skaitlis = (int)$skaitlis; // ja nepieciešams integer
$skaitlis = (double)$skaitlis; // ja nepieciešams double

Starp citu, es neizmantoju funkciju intval(), jo, ja veicu type castu, tad es vēlos, lai tādās vietās es to ieraudzītu uzreizi, nevis meklētu, kur tad ir funkcija...

Vēl viens moments. Iespējams, ka nesaistīts. Kā jums liekas, ko atgriezīs sekojošais piemērs?

$a = (0.1 + 0.7) * 10;
echo intval($a); // Būtu jābūt 8, vai ne?

Ja nepieciešams pārveidot reālus skaitļus par veseliem, ieteicams ir izmantot round() funkciju, jo vienkāršs (int) vai intval() nepalīdzēs. Peldošais punkts un precizitātes problēmas, va zi' :)

Tu atbildi augstāk redzamajam komentāram. Atcelt

Gravatar muldis

2004. gada 5. martā, plkst. 08:56

Ja pavisam strikti skatās, tad cilvēkiem ir arī tendence raks'tīt skaitļus šādi 10 000 000, līdz ar to jārepleiso visi " ".

Gravatar Delf

2004. gada 5. martā, plkst. 09:14

nu nezinu, man liekas x xxx xxx figuree tikai display modee - tad kad paraada userim. bet reali dati glabaajaas kaa viens vesels strings/numbers

ir funkcija number_format(..) jamaa visu pareizi izdara

Gravatar MMK

2004. gada 5. martā, plkst. 10:23

lai pārbaudītu vai ir skaitlis ir labāk izmantot preg_match...

Gravatar laacz

2004. gada 5. martā, plkst. 10:26

MMK: muļķības. Tas būs lēnāk (regulārā izteiksme būs vienkārši monstroza).

Gravatar MMK

2004. gada 5. martā, plkst. 10:35

Iespējams... A ir iespējams dabūt no skaitļa 9 skaitli 9.00 ar kādu built-in f-ju?

Vai arī pašam ir jāraxta?

Gravatar laacz

2004. gada 5. martā, plkst. 10:39

MMK: echo number_format(9, 2);

Gravatar Laacz:

2004. gada 5. martā, plkst. 11:11

Par šito liels paldies, sen jau bija vajadzība, jo nu pie string f-jām to galīgi nebiju meklējis... :)

Gravatar Grrr

2004. gada 5. martā, plkst. 13:34

ko darīt, lai tas notiktu puslīdz universāli. [...] A ko PHP sscanf() neatpazīst visus šos variantus? Un user inputam ir vai nu jābūt %d vai %f, atkarībā no vajadzības.

Gravatar elfz

2004. gada 5. martā, plkst. 16:58

kamēr ļaužu prasībās nebūs punkta par iespēju skaitļus vadīt eksponenciālajā formātā, būs ok ;p

Gravatar ulzha

2004. gada 8. martā, plkst. 22:21

Kāpēc lai neietu? Tāpēc ka "no krievu valodas"? Apsmadzeņojam tagad šitādu domu - ja daudzi tā saka, turklāt saprot viennozīmīgi, tad vai tā nav pareiza valodas konstrukcija? Es par izsaukumzīmju skaita samazināšanu...