2012-02-17 11 views
37

W PHP mam tablicę zmiennych, które są WSZYSTKIMI łańcuchami znaków. Niektóre zapisane wartości to ciągi liczbowe z przecinkami.PHP usuwa przecinki ze znaków numerycznych

Co potrzebne:

Droga do wykończenia przecinki od strun i to zrobić tylko dla ciągów liczbowych. To nie jest tak proste, jak to wygląda. Głównym powodem jest to, że nie następuje:

$a = "1,435"; 

if(is_numeric($a)) 
    $a = str_replace(',', '', $a); 

To nie działa, ponieważ $a = "1435" jest numeryczne. Ale $a = "1,435" nie jest numeryczne. Ponieważ niektóre z łańcuchów, które otrzymuję, będą zwykłymi zdaniami z przecinkami, nie mogę uruchomić łańcucha zastępującego każdy ciąg znaków.

+0

używanie preg_replace do selektywnego zastąpić przecinki zamknięte po obu stronach [0-9]? – Daan

Odpowiedz

20

nie testowano, ale prawdopodobnie coś if(preg_match("/^[0-9,]+$/", $a)) $a = str_replace(...)

+0

Tak, to działa. Wypróbowałem wszystkie formaty smyczkowe, jakich oczekiwałbym, i to działa. Zostanie oznaczona jako zaakceptowana odpowiedź, gdy strona mi pozwoli. – user1082428

+0

Jeśli chcesz usunąć przecinki z liczb wewnątrz ciągu zawierającego słowa, użyj tego wzoru, jeśli chcesz uniknąć usuwania przecinków w słowach:/[0-9] + [,] + [0-9] +/ – Flaxious

77

Zrób to na odwrót:

$a = "1,435"; 
$b = str_replace(',', '', $a); 

if(is_numeric($b)) { 
    $a = $b; 
} 
+0

Dziękuję dla odpowiedzi to działa dla mnie. +1 – user1082428

+1

Potencjalne obciążenie związane z wywołaniem 'str_replace' za każdym razem, ale brak jakiegokolwiek wyrażenia regularnego jest dużym plusem. – KnightHawk

2
function cleanData($a) { 

    if(is_numeric($a)) { 

    $a = preg_replace('/[^0-9,]/s', '', $a); 
    } 

    return $a; 

} 
+0

To również działa, +1 – user1082428

8

Najłatwiej byłoby:

$var = intval(preg_replace('/[^\d.]/', '', $var)); 

lub jeśli potrzebujesz pływaka :

$var = floatval(preg_replace('/[^\d.]/', '', $var)); 
+0

plus 1 za ładną jedną wkładkę – Niroshan

0

spróbować tej ono pracował dla mnie

number_format(1235.369,2,'.','')

jeśli używasz Number_format jak ten number_format(1235.369,2) odpowiedź będzie 1,235.37

ale jeśli używasz jak poniżej

number_format(1235.369,2,'.','') odpowiedź będzie 1235.37

usuwa "," z "1,235.37"

0

Jeśli chcesz usunąć wewnątrz łańcucha, który również zawiera słowa przecinki z numerów, najprostszym sposobem myślę byłoby użyć preg_replace_callback:

Przykład:    

$str = "Hey hello, I've got 12,500 kudos for you, spend it well"

function cleannr($matches) 
{ 
    return str_replace("," , "" , $matches["nrs"]); 
} 

$str = preg_replace_callback ("/(?P<nrs>[0-9]+,[0-9]+)/" , "cleannr" , $str); 


wyjściowa:

"Hej cześć, mam 12500 uznanie dla ciebie, wydać je dobrze"


W tym przypadku wzór (regex) różni się od ten podany w zaakceptowanej odpowiedzi, ponieważ nie chcemy usuwać innych przecinków (interpunkcji).

Jeśli użyjemy /[0-9,]+/ tutaj zamiast /[0-9]+,[0-9]+/ wyjście byłoby:

„Hej cześć Mam 12500 uznanie dla spędzić go dobrze”

Powiązane problemy