как я могу поменять все нечисловые символы в валютный формат - PullRequest
2 голосов
/ 05 мая 2011

Мне нужна помощь, я был бы признателен и большое спасибо

Ниже, как несколько сэмплов слева, я хочу поменять на формат валюты / правую сторону

  • 123,00 до 123,00
  • 1.123,00 € до 1 123,00
  • $ 11,123,00 до 11 123,00
  • 12.123,00 ZH до 12 123,00
  • 12,123,00ч до 12 123,00
  • £ 1.123.123,00 до 1 123 123,00
  • 112312300 кН до 1 123 123,00

или, например,

  • 1 123,00 € до 1 123,00
  • $ 11,123,00 до 11 123,00
  • 12 123,00 ZH до 12 123,00
  • 12.123,00ч до 12 123.00
  • £ 1,123,123,00 до 1,123,123,00
  • 11,231230,0 кН до 1,123,123,00

это означает, что в левой части все должно быть заменено запятой на тысячу цифр и точкой на десятичную,

кажется, что это можно сделать с помощью preg_replace или str_replace , но что мне делать?

Ответы [ 4 ]

2 голосов
/ 06 мая 2011

Выделите нечисловые символы, а затем пропустите number_format().

$val = preg_replace("/[^0-9]/", "", "11,231230.0 KN") / 100;
$formatted = number_format($val, 2, ".", ",");

// Outputs 1,123,123.00

РЕДАКТИРОВАТЬ добавлено / 100, поскольку оно добавляло десятичные знаки после исходных нулей.

1 голос
/ 05 мая 2011

Самый простой способ сделать это - сначала удалить все нечисловые значения, а затем использовать number_format.

// assuming $str holds the original string
$str = preg_replace('/[^0-9]/', '', $str);  // now just a string of numbers
$str = number_format( $str, 2 ); // 2 decimal places
0 голосов
/ 06 мая 2011

Мне пришлось сделать то же самое из валюты, чтобы нормализовать формат для проекта, над которым я работаю.

Код обрабатывает любую строку для вывода, если отформатирован как #####.##, и поддерживает следующие входные данные:

// these are my unit test check
0.00 returned by filtering 0
0.20 returned by filtering 0.2
0.20 returned by filtering 0,2
0.22 returned by filtering 0.22
0.22 returned by filtering 0,22
18.20 returned by filtering 18.2
1000.00 returned by filtering 1 000
1000.00 returned by filtering 1,000
1000.00 returned by filtering 1,000.00
1000.00 returned by filtering 1000,00
1000.00 returned by filtering 1 000,00
1000.20 returned by filtering 1 000,2
1000.20 returned by filtering 1 000,20 $
1000.20 returned by filtering abc1def00test0dot.twenty20

и любая другая комбинация чередуются с любыми нечисловыми символами

    if (strpos($string, '.') === false
        && strpos($string, ',') === false
    ) {
        $string .= '.00';
    }

    $string = preg_replace('/[^0-9.,]/', '', $string);

    $string = preg_replace('/[.,]/', '.', $string);

    while (
        strpos($string, '.') != strrpos($string, '.')
        || strlen($string) - 1 - strrpos($string, '.') > 2
    ) {
        $pos = strpos($string, '.');
        if ($pos > 0) {
            $string = substr($string, 0, $pos) . substr($string, $pos +1);
        } else {
            break;
        }
    }

    return (float)$string;

И, наконец, используйте number_format() для переформатирования стандартизированного числа

0 голосов
/ 06 мая 2011

Вы можете попробовать

print number_format(preg_replace('/\D/', '', $number), 2, '.', ',');
...