webForumDet fria alternativet

sträng -> int : Skillnad på "sju" och "0"

PHP

14 svar · 374 visningar · startad av aasah

Medlem sedan mars 20034 471 inlägg
Frågan#1

Jag har något som borde vara ett heltal i en strängvariabel $str. Detta tal ska lagras i MySQL. Alltså ska jag göra om $str's värde till heltal. Om den nu faktiskt innehåller ett heltal är allt frid och fröjd... Men jag vill fånga upp felet om värdet inte är ett heltal. HUR? :q

(int)"1" ==> 1 OK
(int)"0" ==> 0 OK
Men (int)"sju" ==> 0 också!

is_int funkar inte, för is_int($str) är alltid falskt (naturligtvis).

Tacksam för hjälp för jag har kört fast!

Medlem sedan maj 20018 027 inlägg
#2

Borde verkligen php förstå svenska namn på siffror? Om inte, så borde väl detta kunna lösas med en översättningstabell. Men varför ska siffrorna matas in med siffernamnen?

Medlem sedan aug. 20002 975 inlägg
#3

Ta en titt på is_numeric

Medlem sedan mars 20034 471 inlägg
#4

UlfT - Missförstånd! Fullkomligt missförstånd!

Nej, det SKA inte matas in text, den SKA inte förstå annat än heltal. Det är det som är problemet...

$str får sitt värde från en fil. Om man i denna fil råkar skriva 1# istället för 13 tex eller någon (sent en kväll ?) får för sig att skriva 7 p istället för 7 eller vad som helst som inte kan evalueras som heltal... 3,14, sju, &¤(#/Q.... så vill jag få ett felmeddelande och inte en snällt konverterad sträng till siffran 0. För 0 kan mycket väl vara en korrekt nolla, det signalerar inget fel till mig...

För ögonblicket "löser" jag det på detta utomordentligt fula vis: ($str heter eg $keep, bytte namn här för att det skulle bli lättare... :r)

              //knas för att skilja "0" från "sju"
               //(int)"sju" ==> 0 nämligen
               $tmp = $keep;
               $keep = (int)($keep);
               if ($keep == 0 && $tmp != "0")
                  printParseError("... ");
Medlem sedan mars 20034 471 inlägg
#5

Hmmm, har just insett att min nöd-"lösning" inte heller funkar så vidare bra...

Matte skrev:

Ta en titt på is_numeric

Den gör inte riktigt det jag vill. För visst blir: is_numeric("3.14") TRUE... ?

Finns det något annat sätt att försäkra sig om att det är ett heltal än via reguljära uttryck.... ? :q

Medlem sedan feb. 20002 300 inlägg
#6
is_int()

??

Medlem sedan mars 20034 471 inlägg
#7

is_int() funkar inte.

$str = "sju";
echo "sju is int? ".is_int($str);
echo "<br>'7' is int? ".is_int("7");
echo "<br>7 is int? ".is_int(7);

Skriver ut

sju is int?
'7' is int?
7 is int? 1

Dvs "sju" är ingen int - tack för det! ;)
"7" är ingen int
7 är en int

Så nej, det funkar inte.

Medlem sedan feb. 20002 300 inlägg
#8

Kolla på en usercomment för is_int() så borde det lösa sig..

Medlem sedan aug. 20002 975 inlägg
#9

aasah skrev:

Finns det något annat sätt att försäkra sig om att det är ett heltal än via reguljära uttryck.... ? :q

Varför inte använda ett regexp ? Speciella skäl ?

if (!preg_match("/\\D/", $str)) {
   echo "Är ett heltal";
}
Medlem sedan mars 20034 471 inlägg
#10

Matte skrev:

aasah skrev:

Finns det något annat sätt att försäkra sig om att det är ett heltal än via reguljära uttryck.... ? :q

Varför inte använda ett regexp ? Speciella skäl ?

if (!preg_match("/\\D/", $str)) {
   echo "Är ett heltal";
}

För att jag inte fick det att funka... med mitt tidigare försök.

Ditt förslag tar väl bara talen 0 - 9 ? Måste man inte skriva:
'/\\d+/' ???

Vänta ett tag... behöver man inte två \ ? Det står så här i ditt inskrivna förslag, men det syns bara ett? Men till PHP i programmet ska det väl vara två? En som talar om för RE att det är ett speciellt 'd', och en i php-strängen som säger att "ge 17 i att käka upp \:t före d" i princip...?

Medlem sedan mars 20025 907 inlägg
#11

Kopierar man mattes kod rakt av (den versionen som syns i själva tråden) så fungerar det med alla positiva heltal. Anledningen till att han har 2 \ i koden (som man ser om man citerar inlägget) är att wF (dvs. vBulletin) av någon konstig anledning escapear bort det annars.

Medlem sedan mars 20034 471 inlägg
#12

Tusen tack för all hjälp med att reda ut detta! :D

Jag får tränga djupare in i de regexp PHP svänger sig med tror jag. :)

Medlem sedan mars 20034 471 inlägg
#13

aasah skrev:

Matte skrev:

Varför inte använda ett regexp ? Speciella skäl ?

if (!preg_match("/\\D/", $str)) {
   echo "Är ett heltal";
}

... Ditt förslag tar väl bara talen 0 - 9 ? Måste man inte skriva:
'/\\d+/' ???...

Min PHP-version känner i vart fall inte igen \D visade det sig idag när den här raden äntligen kördes... Men följande funkar:

preg_match("/\\d+/", $str)

Rimligtvis gäller det inte för negativa tal, men i mitt fall behövs det inte heller.

Medlem sedan aug. 20002 975 inlägg
#14

Ska du få det att funka får du skriva:

preg_match("/^\\d+$/", $str)

Som du hade skrivit det skulle det blivit en matchning så länge strängen innehöll minst en siffra, men kunde innehålla hur många bokstäver som helst.

!preg_match("/\\D/", $str)

// Är samma sak som
!preg_match("/[^\\d]/", $str)

Vi söker alltså efter ett tecken som INTE är siffra i detta fall, och hittar vi ingen blir resultatet true.

Medlem sedan mars 20034 471 inlägg
#15

Tack för påpekandet! :)

Men... konstigt!

preg_match("/\\D/", $str)

Fungerar inte, det leder till fel på: 1
medan

!preg_match("/[^\\d]/", $str)

funkar....

321 ms totalt · 4 externa anrop · v20260731065814-full.a51de22e
136 ms — deklarationer (db)
0 ms — hämta statistik (cache)
183 ms — hämta tråd, inlägg och bilagor (db)
135 ms — ändringar (db)