Avatar billede dennism Nybegynder
01. november 2003 - 23:57 Der er 26 kommentarer og
2 løsninger

PHP: Tjek variabel; Kun tal

Hvordan kan jeg tjekke om variabel for om den kun indeholder tal (0-9 og , og .)?

Og hvordan kan jeg erstatte "," med "." i en variabel?
Avatar billede googolplex Novice
02. november 2003 - 00:01 #1
Erstatter ',' med '.':

str_replace(',', '.', $var);
Avatar billede bearhugx Nybegynder
02. november 2003 - 00:04 #2
Følgende er _ikke_ testet ....

$variabel = "9999,99";
$pat_kunTalOgKomma = "/[\d+,.]/";
if( preg_match($pat_kunTalOgKomma, $variabel) ) {
  // OK
} else {
  // IKKE OK
}
Avatar billede dennism Nybegynder
02. november 2003 - 00:08 #3
bearhugx >>

Det virker ikke.
Avatar billede bearhugx Nybegynder
02. november 2003 - 00:09 #4
Nope.. fandt jeg lige ud af :-/ .. arbejder lige på det :-/
Avatar billede dennism Nybegynder
02. november 2003 - 00:11 #5
Oki, tak
Avatar billede ztyxx Nybegynder
02. november 2003 - 00:15 #6
kan du ikke bruge denne lille stump javascript, så valideres det inden der sendes

<script type="text/javascript">
function testNum(str){
    if(isNaN(str.value)){
        alert("Feltet må kun indeholde tal")
        str.value=""
    }
}

</script>
<input type="text" id="test" onchange="testNum(this)">
Avatar billede bearhugx Nybegynder
02. november 2003 - 00:20 #7
vi prøver igen

if( is_numeric( str_replace(',', '.', $din_variabel) ) ) {
  print("OK");
} else {
  print("NOT!");
}

BEMÆRK. Dette vil kun virke hvis der er én delimiter (. eller ,) i tallet...

tallet 1.000.000,00 (en million - med . som tusindtals separator vil IKKE virke, da den så vil forsøge at finde talværdien af 1.000.000.00 :-/)

man kan evt. lave en version , hvor man først tester om der er ét og KUN et komma i strengen (dette vil så blive antaget som decimal-separator -- i de tilfælde skal alle punktummer fjernes (gøres med $string = str_replace(".", "", $streng) ) inden man så omformer kommaet til et punktkum og kalder is_numeric()
Avatar billede erikjacobsen Ekspert
02. november 2003 - 00:21 #8
test for tal og "," og "."

$var="7,9.13";
if (ereg('^[0-9,\.]+$',$var)) {
  //ok
} else {
  //fejl
}

$nyvar = str_replace(',' , '.' , $var);
Avatar billede bearhugx Nybegynder
02. november 2003 - 00:22 #9
som ztyxx også nævner, så er dette med validering af input noget som der i de fleste tilfælde bør foregå på klient-siden (og altså ikke via PHP)... Jo mere man (kan) validere på klient-siden, jo mindre trafik/belastning vil der være på serveren....
Avatar billede erikjacobsen Ekspert
02. november 2003 - 00:23 #10
Men bedre måske:

if (ereg('^[0-9]+([,\.][0-9]+)?',$var)) {
Avatar billede bearhugx Nybegynder
02. november 2003 - 00:23 #11
erik >> aha! så det er sådan at man laver den i regexp :-)
Avatar billede erikjacobsen Ekspert
02. november 2003 - 00:24 #12
bearhugx: uanset man *kan* validere på klienten, *skal* man alligevel
validere på serveren, da enhver hacker ellers potentielt vil kunne give
scriptet et forkert input.
Avatar billede ztyxx Nybegynder
02. november 2003 - 00:24 #13
bearhugx> tror at erik har øvet sig ;-)
Avatar billede erikjacobsen Ekspert
02. november 2003 - 00:25 #14
Selvfølgelig:

if (ereg('^[0-9]+([,\.][0-9]+)?$',$var)) {
Avatar billede bearhugx Nybegynder
02. november 2003 - 00:28 #15
erik>> der er vi helt enig- absolut! --- et server-side check er obligatorisk - men jo flere fejl man kan få luset fra allerede _inden_ informationerne sendes til serveren, jo færre gange vil serveren blive nød til at producere sider med ordinære fejlmeddelelser som "de glemt at udfylde deres navn" osv. og derved mindskes trafikken til og fra serveren, samt den belastning på serveren som ville komme når den skal udarbejde disse beskeder, som sagtens kunne have været ordnet client-side
Avatar billede ztyxx Nybegynder
02. november 2003 - 00:29 #16
og har man udfyldt en hel form, slipper man også for at udfylde det hele igen :-)
Avatar billede dennism Nybegynder
02. november 2003 - 00:33 #17
Hvordan kan jeg forhindre det med at 1.000.000,00 ikke bliver lavet om til 1.000.000.00 men 1000000.00?
Avatar billede ztyxx Nybegynder
02. november 2003 - 00:33 #18
men havde nu ikke førhen tænkt på at kombinere de to, så lærte man lidt idag også :-)
Avatar billede erikjacobsen Ekspert
02. november 2003 - 00:43 #19
dennism: hvilket input forventer du? Jeg troede det var 7913.89 eller 7913,89 -
men hvis du ved det er 7.913,89 kan vi selvfølgelig arbejde videre derfra.
(Men måske ikke i dag for mit vedkommende....)
Avatar billede erikjacobsen Ekspert
02. november 2003 - 00:43 #20
Jeg mener ikke 7,913,89 - men 7.913,89
Avatar billede erikjacobsen Ekspert
02. november 2003 - 00:45 #21
styxx: selv om man checker på serveren kan man jo godt levere brugeren
de data han har indtastet een gang til. Du har måske oplevet det sådan en
gang, men det gør man altså ikke (hvis man ellers ved hvad man gør eller tænker
sig om *g*)
Avatar billede ztyxx Nybegynder
02. november 2003 - 00:47 #22
erik> jo det er jeg klar over, men der skal man vel ud i noget session osv, eller trykke Back i browseren, som dog ikke vil virke hvis man ikke tillader at siden caches ??
Avatar billede bearhugx Nybegynder
02. november 2003 - 00:47 #23
$var = "1.000.000,00";
if( strpos($var, ',') == true ) {
  // allerede decimal-sep
  $var = str_replace(".", "", $var);
}
$var = str_replace(",", ".", $var);
if( is_numeric($var) ) {
  // ok
    print("ok");
} else {
  // not
    print("not");
}
Avatar billede bearhugx Nybegynder
02. november 2003 - 00:50 #24
Men jeg ville nok foretrække eriks version - den er mere simpel (og jeg tror også mere fejlsikret...)
Avatar billede erikjacobsen Ekspert
02. november 2003 - 09:09 #25
nej styxx - det er meget simplere ;)
Avatar billede googolplex Novice
02. november 2003 - 10:06 #26
Hvad med det her:

if (is_numeric(preg_replace('/\.(.*?)(?=\.)/', '$1', str_replace(',', '.', trim($pressure)))))
{
echo 'Numeric';
}
else
{
echo 'Not mumeric';
}
Avatar billede googolplex Novice
02. november 2003 - 10:08 #27
Så laver den ',' om til '.', fjerner eventuelle tusindtals-seperatorer og checker om det er numeric.
Avatar billede dennism Nybegynder
02. november 2003 - 10:11 #28
Jeg tror jeg har fået den hjælp jeg behøver. Mange tak!

Smider du lige et svar erik? Så kan I dele..
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester

IT-JOB

Politiets Efterretningstjeneste

Netværksspecialist til IT i PET

Capgemini Danmark A/S

AI/Data Engineer

Forsvarsministeriets Materiel- og Indkøbsstyrelse

Cyberdivisionen søger IT-supporter til lokal IT Korsør