Autor Zpráva
sowhatchawant
Profil *
Zdravim,

už jsem opravdu nešťastný, zkoušel jsem snad všechno a pořád mi to nejde...

Načítám nějaký data ze souboru (.csv),potřebuji kontrolovat, zda soubor obsahuje na určitých místech číselné hodnoty - od 1 do 9999...

Nějakým způpsobem pomocí explode() atd. vybírám tato čísla (zatím jsou uložené jako string) a ty bych potřeboval kontrolovat. Bohužel, is_numeric() si tím neví moc rady... Vrací false u čísel >= 10.

Zkoušel jsem používat :
$value = trim($value)
if ( ctype_digit ( $value ) )
{
     ....
}
tohle funguje jen pro čísla do 10, jakmile je dvojciferné vrací FALSE

asi po 2 hodinách, co jsem se tím mořil, jsem udělal vlastní is_numeric :

    public function custom_is_numeric ( $str ) 
    {
         $num = intval ( $str ) ;
         print_r ( $num . " |VS| " .$str );
         if ( $num > 0 )
         {
            return 1;
         }
         return 0;
    }

tohle mi fungovalo krásně až do doby, než jsem se podíval, co porovnává. intval ( $str ) převede opět jenom první znak na čislici a zbytek neřeší, takže mi to string "10" převede na číslo 1, což nechci.

Nevíte někdo jak to vyřešit? Už mě to opravdu nebaví.

Díky, Martin
Jan Tvrdík
Profil
sowhatchawant:
is_numeric rozhodně vrátí např. pro "10" true. To že ti to vrátí false znamená, že ten řetězec obsahuje nutně něco jiného. Proveď schválně hex dump toho řetězce, např. pomocí

for ($i = 0; $i < strlen($string); $i++) {
    echo dechex(ord($string[$i])) . " ";
}
sowhatchawant
Profil *
Jj mělo mě to napadnout dřív, dává to za každý znak 0, např: 13 = 31 0 33

Koukám, že ten čtený soubor je v UCS-2 Big Endian a já to zpracovávám v UTF-8, to bude asi nejspíš tím, že ? :D

Díky
Jan Tvrdík
Profil
sowhatchawant:
Ano, to bude tím. Bude stačit převést řetězec z UCS-2 Big Endian do UTF-8.
$s = iconv('UCS-2BE', 'UTF-8', $s); // snad takto



Ještě doplním: pozor na trim()! Výstup pro 13 má být 0 31 0 33. Tím, že řetězec proženeš přes trim je odstraněn počáteční NULL byte a kódování je tak poškozeno. Konverzi je tedy potřeba provést ideálně hned po načtení toho souboru.
sowhatchawant
Profil *
Já mám trochu problém, že nevím v jakém kódování mi soubor přijde, může to být téměř cokoli, asi spíš odstraním ty nulové znaky z toho stringu...

Rozhodně děkuji za rady :)

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0