2011-01-13 9 views
8

Attualmente sto lavorando su un progetto in PHP e ho bisogno di qualche aiuto Regex. Mi piacerebbe essere in grado di prendere un valore monetario immesso dall'utente e rimuovere tutti i posti/centesimi non numerici e decimali.Regex - Strip non numerico e rimuovere eventuali centesimi

Es:

'2.000,00' a '2000'
'$ 2.000,00' a '2000'
'2abc000' a '2000'
'2.000' al 2000

(Sto utilizzando la formattazione di valuta non USA)

Come posso fare questo? Apprezzerei l'aiuto - Grazie

risposta

14

Si può fare:

$str = preg_replace('/[^0-9,]|,[0-9]*$/','',$str); 
10
$output = preg_replace('/[^0-9]/s', '', $input); 

che dovrebbe sostituire caratteri non numerici con stringhe vuote.

+0

Come potrei togliere i centesimi? In modo che 2.000,00 non diventi 200000? – RS7

+0

@ RS7: prima di fare ciò che mostra dqhendricks, devi solo ottenere "strpos" della virgola (,), quindi ottenere sottostringhe in quella posizione. –

+0

preg_replace ('/,.+$/ s', '', $ input) – dqhendricks

0

Questo dovrebbe fare quello che vuoi.

$your_string_without_letters = preg_replace('\w+', '', $your_string) 
preg_match('[0-9][0-9.]*', $your_string_without_letters, $matches); 
$clean_string = $matches[0]; 

La partita avrà inizio non appena viene trovato il primo numero, e fermarsi quando colpisce qualcosa che non è né un numero, né un punto (es. Una virgola o alla fine della stringa nei vostri esempi)

MODIFICA: si è dimenticato di rimuovere prima le lettere all'interno del valore.

(solo un parere personale, ma se un utente scrive chracters che non sono numeri, punti, virgole o simboli di valuta mi rifiuterei l'ingresso invece di cercare di pulirla)

0

sul lato client che uso lezioni sugli ingressi:

$("input.intgr").keyup(function (e) { // Filter non-digits from input value. 
    if (/\D/g.test($(this).val())) $(this).val($(this).val().replace(/\D/g, '')); 
}); 
$("input.nmbr").keyup(function (e) { // Filter non-numeric from input value. 
    var tVal=$(this).val(); 
    if (tVal!="" && isNaN(tVal)){ 
     tVal=(tVal.substr(0,1).replace(/[^0-9\.\-]/, '')+tVal.substr(1).replace(/[^0-9\.]/, '')); 
     var raVal=tVal.split(".") 
     if(raVal.length>2) 
      tVal=raVal[0]+"."+raVal.slice(1).join(""); 
     $(this).val(tVal); 
    } 
}); 
$("input.money").keyup(function(){ money($(this)) }) 
    .blur(function(){ money($(this),1); }); 
//----------- free-standing functions -------------- 
function money($inElem,inBlur,inDec){//enforces decimal - only digits and one decimal point. inBlur bool for final slicing to sets of 3 digits comma delimted 
    var isBlur=inBlur||0;//expects boolean (true/false/0/1 all work), default to 0 (false) 
    var dec=inDec || 2; 
    if(/[^,.0-9]/g.test($inElem.val()))//if illegal chars, remove and update 
     $inElem.val($inElem.val().replace(/[^,.0-9]/g, "")); 
    var ra=$inElem.val().split("."); 
    if(ra.length>2 || ra.length>1 && ra[ra.length-1].length>2){//if too more than 1 "." or last segment more than dec digit count, fix and update 
     if(ra[ra.length-1].length>2) ra[ra.length-1]=ra[ra.length-1].substr(0,dec);//shorten last element to only dec digit count 
     $inElem.val(ra.slice(0,ra.length-1).join("")+"."+ra[ra.length-1]);//glom all but last elem as single, concat dec pt and last elem 
    } 
    if(inBlur){ 
     ra=$inElem.val().split("."); 
     var rvsStr=zReverse(ra[0].replace(/,/g,"")); 
     var comDelim=""; 
     while(rvsStr.length>0){ 
      comDelim+=rvsStr.substr(0,3)+","; 
      rvsStr=rvsStr.substr(3); 
     } 
     $inElem.val(zReverse(comDelim).substr(1)+(ra.length==2?"."+ra[1]:"")); 
    } 
} 
function zReverse(inV){//only simple ASCII - breaks "foo bar mañana" 
    return inV.split("").reverse().join(""); 
}