2014-09-22 18 views
7

mam ciąg jak to 2 661,38 € i muszę echo 661,38 ale nie mogę dotrzeć do roztworuformatowania sznurkiem za pomocą php

ja zrobiłem następujący kod:

$connection=mysql_connect('localhost','root','****') or die(mysql_error()); 

mysql_select_db('DB',$connection) or die(mysql_error()); 

$sql = mysql_query("select distinct prod_price COL from TABLE") or die(mysql_error()); 

?> 

<?php 
    while($row=mysql_fetch_object($sql)):?> 

<?php 


if(mysql_num_rows($sql)>0){ 

$number = $row->COL; 
$temp=explode(' ',$number); 
$number = preg_replace("/[^0-9]/", '', $temp[0])/100; 
echo number_format($number, 2, ',', ' '). "<br />"; 
} 
?> 
    <?php endwhile;?> 

Can Czy ktoś pomógł mi usunąć 2 z pierwszego miejsca?

Rozwiązanie, które otrzymałem, nie pomaga mi, więc umieszczam cały kod, aby zrozumieć sytuację, w której utknąłem ... zobacz fragment kodu ... Powyższy kod daje mi następujące informacje. Uwaga:

Wskazówka: Undefined offset: 2 w /var/www/html/login/str.php na linii 26 0,00

+12

Skąd ciąg pochodzi? Wygląda na źle zinterpretowany ciąg znaków UTF-8 - może najpierw powinieneś rozwiązać problemy z kodowaniem. – georg

+0

jego nadejście z DB – user3305327

+0

Będziesz nakładał więcej obciążenia na warstwę aplikacji, nawet jeśli można to skutecznie obsłużyć w warstwie bazy danych! Musisz zmienić zestaw znaków bazy danych na utf-8 i porównać go z utf8_general_ci, a następnie unicode są obsługiwane przez twoją bazę danych, oszczędzając ci bólu głowy, co zamierzasz teraz zrobić. – freerunner

Odpowiedz

0

można podzielić ten ciąg z miejsca, dziesięć zastosować preg_replace()

<?php 
$number = "2 661,38 €"; 
$temp=explode(' ',$number); 
$number = preg_replace("/[^0-9]/", '', $temp[1])/100; 
echo number_format($number, 2, ',', ' '); 
?> 

DEMO

+1

Proszę wyjaśnić, w jaki sposób ten kod pomaga rozwiązać pierwotny problem. Celem odpowiedzi jest nie tylko rozwiązanie pierwotnego problemu, ale pomoc dalszych czytelników tego wątku w zrozumieniu zarówno problemu podstawowego, jak i rozwiązania. Tylko anonse typu code traktowane są jako posty niskiej jakości. – Pred

+0

@Pred Czy to nie rozwiązanie? – Shin

+1

Może to być rozwiązanie, ale jeśli ktoś przeczyta ten post w przyszłości z ograniczoną lub zerową wiedzą związaną z regexp lub php, sam kod prawdopodobnie nie pomoże. Krótkie wyjaśnienie, dlaczego i jak ta odpowiedź (sposób dostarczonego regexp i kod) może pomóc lub rozwiązać oryginalny problem, może być bardzo pomocna. – Pred

1

Jeśli przekonwertować ciąg 2 661,38 € ASCII cyfr szesnastkowych, wtedy zobaczysz następującą sekwencję: 32 C2 20 36 36 31 2C 33 38 C2 20 E2 82 AC

tę sekwencję w UTF-8 jest 2 661,38 € z dwóch znaków sterujących (\xC2).

Wydaje mi się, że jest to problem ściśle związany z kodowaniem, dlatego należy przekonwertować oryginalne ciągi znaków (z oryginalnym zestawem znaków) na UTF-8.

Można to zrobić w MySQL z następującym wyrażeniem:

CONVERT(CONVERT(YourColumn USING binary) USING utf8) 

Prawdopodobnie zwraca NULL, jeśli wartość początkowa nie może być zamieniony na UTF-8, ale jeśli jest to ważny ciąg UTF8, to will zostanie przekonwertowany.

Proszę również upewnij się, że kodowanie połączenia i pliku PHP jest również UTF-8. Różne kodowania mogą spowodować nieoczekiwane zachowanie.

0

Najpierw musisz zmienić tabelę DB. Przejdź do struktury tabeli i ustawienie sortowania zmieni się utf8_general_ci, wtedy trzeba ustawić nagłówek

0

To będzie pozbyć się wszystkiego z wyjątkiem numerów i przecinkami:

$number = preg_replace("/[^0-9,]*/", '', $your_weird_pattern); 
Powiązane problemy