Skaitļi un PHP
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' :)
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 " ".
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
MMK
2004. gada 5. martā, plkst. 10:23
lai pārbaudītu vai ir skaitlis ir labāk izmantot preg_match...
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).
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?
laacz
2004. gada 5. martā, plkst. 10:39
MMK: echo number_format(9, 2);
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... :)
Grrr
2004. gada 5. martā, plkst. 13:34
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
Kaspars
2004. gada 6. martā, plkst. 09:49
Runa nekur neiet!!
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...