Hapus karakter non-numerik (kecuali titik dan koma) dari string


150

Jika saya memiliki nilai berikut:

 $var1 = AR3,373.31

 $var2 = 12.322,11T

Bagaimana saya bisa membuat variabel baru dan mengaturnya ke salinan data yang karakter non-numeriknya dihapus, dengan pengecualian koma dan titik? Nilai-nilai di atas akan mengembalikan hasil berikut:

 $var1_copy = 3,373.31

 $var2_copy = 12.322,11

Jawaban:


335

Anda dapat menggunakan preg_replace untuk menukar semua karakter non numerik dan koma dan titik / penghentian penuh sebagai berikut:

<?php
    $testString = '12.322,11T';
    echo preg_replace('/[^0-9,.]/', '', $testString);
?>

6
lihat juga fungsi php money_function () ( php.net/manual/en/function.money-format.php )
horatio

5
[^ 0-9] akan cocok dengan karakter non-numerik apa pun, jadi tidak perlu menambahkan koma dan berhenti penuh. Ini cukup: echo preg_replace ('/ [^ 0-9] /', '', $ testString);
billrichards

6
@ Billillards Saya tidak berpikir itu benar. Ingat dia ingin mempertahankan koma dan berhenti penuh, bersama dengan karakter numerik, bukan menghapusnya.
Richt222

1
@ billrichards Seperti yang dinyatakan OP (penekanan milikku), "hindari huruf atau karakter kecuali koma dan titik ".
John Parker

bukankah periode itu membutuhkan backslash? titik berarti "karakter apa saja" bukan?
Scott

66

Saya terkejut tidak ada lagi filter_var di sini karena ini adalah pertanyaan lama ...

PHP memiliki metode bawaan untuk melakukan ini menggunakan filter sanitasi . Secara khusus, yang digunakan dalam situasi ini adalah FILTER_SANITIZE_NUMBER_FLOATdengan FILTER_FLAG_ALLOW_FRACTION | FILTER_FLAG_ALLOW_THOUSANDbendera. Seperti itu:

$numeric_filtered = filter_var("AR3,373.31", FILTER_SANITIZE_NUMBER_FLOAT,
    FILTER_FLAG_ALLOW_FRACTION | FILTER_FLAG_ALLOW_THOUSAND);
echo $numeric_filtered; // Will print "3,373.31"

Mungkin juga bermanfaat untuk dicatat bahwa karena built-in ke PHP, itu sedikit lebih cepat daripada menggunakan regex dengan pustaka PHP saat ini (meskipun secara harfiah dalam nanodetik).


2
IMO ini adalah jawaban terbaik.
Ogier Schelvis


4

Anda dapat menggunakan filter_varuntuk menghapus semua karakter ilegal kecuali angka, titik dan koma.

  • The FILTER_SANITIZE_NUMBER_FLOATfilter digunakan untuk menghapus semua karakter non-numerik dari string.
  • FILTER_FLAG_ALLOW_FRACTION memungkinkan pemisah fraksi " . "
  • Tujuan FILTER_FLAG_ALLOW_THOUSANDuntuk mendapatkan koma dari string.

Kode

$var1 = '12.322,11T';

echo filter_var($var1, FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_FRACTION | FILTER_FLAG_ALLOW_THOUSAND);

Keluaran

12.322,11

Untuk membaca lebih lanjut tentang filter_var () dan Sanitasi filter


2

Jika permintaan adalah untuk menghapus semua (dan tidak hanya satu) karakter non numerik, mungkin yang sebelumnya dapat ditulis seperti ini dengan cara yang sangat sederhana (tetapi Anda dapat menulis fungsi untuk meneruskan string dan membuatnya mengembalikan nilai yang dibutuhkan tanpa karakter .. pokoknya ..):

<?php
$String1 = 'AR3,373.31';
$String2 = '12.322,11T';

echo preg_replace('/[^0-9,.]+/i', '', $String1);
echo preg_replace('/[^0-9,.]+/i', '', $String2);
?>

1

Jika huruf selalu di awal atau di akhir, Anda cukup menggunakan trim ... tidak diperlukan regex

$string = trim($string, "a..zA..Z"); // this also take care of lowercase

"AR3,373.31" --> "3,373.31"
"12.322,11T" --> "12.322,11"
"12.322,11"  --> "12.322,11"

Penting: Ini hanya akan menghapus huruf dari string. Karakter lain, seperti spasi, tanda kurung, tanda kutip, dll disimpan dalam hasilnya. -> Hanya gunakan solusi ini, jika Anda tahu bahwa string input Anda hanya berisi huruf dan angka, dan tidak ada karakter lain!
Philipp

-1

Jawaban yang sama dengan middaparka tetapi hapus,.

$unformatted_phone = "phone 122-3222223.ext 442";
echo preg_replace("/[^0-9]/", "", $unformatted_phone);

Tolong jangan menambahkan tautan ke blog / situs Anda di posting. Itu bisa dianggap sebagai spam.
Tushar

Downvote: Karena jawaban middaparka sempurna. OP ingin menyimpan titik dan koma tetapi jawaban Anda menghapusnya.
Carlos2W
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.