Неформатировать деньги при разборе в PHP

php parsing floating-point currency

45979 просмотра

8 ответа

532 Репутация автора

Есть ли способ получить значение с плавающей запятой строки, как это:, 75,25 €кроме parsefloat(str_replace(',', '.', $var))?

Я хочу, чтобы это зависело от текущего языка сайта, и иногда запятую можно заменить точкой.

Автор: cili Источник Размещён: 28.02.2011 08:48

Ответы (8)


43 плюса

275043 Репутация автора

Решение

Вы можете использовать

Пример из руководства:

$formatter = new NumberFormatter('de_DE', NumberFormatter::CURRENCY);
var_dump($formatter->parseCurrency("75,25 €", $curr));

дает: float(75.25)

Обратите внимание, что расширение intl не включено по умолчанию. Пожалуйста, обратитесь к инструкции по установке .

Автор: Gordon Размещён: 28.02.2011 09:17

1 плюс

117041 Репутация автора

Кастинг твой друг

$int = (int) $string;

Обновление на основе оп :

Попробуйте что-то вроде этого:

<?php

function extract_numbers($string)
{
    return preg_replace("/[^0-9]/", '', $string);
}

echo extract_numbers('$100');

?>

Демо: http://codepad.org/QyrfS7WE

Автор: Neal Размещён: 13.09.2011 08:21

2 плюса

37019 Репутация автора

У PHP есть intval( вот документы ), который (насколько я могу судить) точно такой же, как у JavaScript parseInt.

Тем не менее, ни за что не думаю, что любая из этих функций поможет вам в том, что вы пытаетесь сделать. Поскольку первый символ не числовой, оба сходят с ума (PHP даст вам 0, JS даст вам NaN). Таким образом, на любом языке вам придется выполнять синтаксический анализ строк / регулярных выражений.

Автор: sdleihssirhc Размещён: 13.09.2011 08:24

9 плюса

179421 Репутация автора

Вам нужно удалить символ валюты из строки. PHP intvalостанавливается на первом нечисловом символе, который он находит.

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

Хотя, если у вас есть значение как $100.25, вы можете использовать floatvalвместо этого.

$float = floatval(preg_replace('/[^\d\.]/', '', '$100.25')); // 100.25
Автор: Rocket Hazmat Размещён: 13.09.2011 08:26

42 плюса

14254 Репутация автора

использовать ereg_replace

$string = "$100,000";
$int = ereg_replace("[^0-9]", "", $string); 
echo $int;

выходы

1000000

function toInt($str)
{
    return (int)preg_replace("/\..+$/i", "", preg_replace("/[^0-9\.]/i", "", $str));
}

Обновить


<?php
$string = array("$1,000,000.00","$1 000 000.00","1,000 000.00","$123","$123 456 789","0.15¢");
foreach($string as $s) {
    echo $s . " = " . toInt($s) . "\n"; 
}
function toInt($str)
{
    return preg_replace("/([^0-9\\.])/i", "", $str);
}
?>

Выходы

$1,000,000.00 = 1000000.00
$1 000 000.00 = 1000000.00
1,000 000.00 = 1000000.00
$123 = 123
$123 456 789 = 123456789
0.15¢ = 0.15

и если вы приведете его как целое число

<?php
$string = array("$1,000,000.00","$1 000 000.00","1,000 000.00","$123","$123 456 789","0.15¢");
foreach($string as $s) {
    echo $s . " = " . _toInt($s) . "\n";    
}
function _toInt($str)
{
    return (int)preg_replace("/([^0-9\\.])/i", "", $str);
}
?>

выходы

$1,000,000.00 = 1000000
$1 000 000.00 = 1000000
1,000 000.00 = 1000000
$123 = 123
$123 456 789 = 123456789
0.15¢ = 0

Так что у вас есть это. одна строка, одна замена. ты в порядке

Автор: rlemon Размещён: 13.09.2011 08:27

1 плюс

7523 Репутация автора

У меня была похожая проблема, когда я не получил символ валюты, только строки (то есть: 1 234 567,89 или 1,234,567,89).

Это помогло мне нормализовать оба случая в поплавки:

$val = str_replace(",", ".", $formatted);
$val = preg_replace("/[\,\.](\d{3})/", "$1", $val);

Но ответ Гордона намного чище.

Автор: Edson Medina Размещён: 27.03.2012 06:40

1 плюс

11 Репутация автора

Я новичок, так что, вероятно, есть очевидная (для других, а не для меня) обратная сторона подхода, описанного ниже, но я решил, что в любом случае поделюсь им. Мне было бы интересно узнать, работает ли он быстрее или медленнее, чем использование preg_replace, но не проводил никаких тестов скорости.

$badChars = array("$", ",", "(", ")");
$dirtyString = "($3,895.23)";
$cleanString = str_ireplace($badChars, "", $dirtyString);
echo "$dirtyString becomes $cleanString<p>";

$ dirtyString может быть массивом, поэтому:

$badChars = array("$", ",", "(", ")");
$dirtyStrings = array("($3,895.23)", "1,067.04", "$5683.22", "$9834.48");
$cleanStrings = str_ireplace($badChars, "", $dirtyStrings);

echo var_dump($cleanStrings);
Автор: user2840024 Размещён: 02.10.2013 07:19

45 плюса

3312 Репутация автора

Это более сложное / медленное решение, но оно работает со всеми локалями. Решение @ rlenom работает только с точками в качестве десятичного разделителя, а некоторые локали, такие как испанский, используют запятую в качестве десятичного разделителя.

<?php

public function getAmount($money)
{
    $cleanString = preg_replace('/([^0-9\.,])/i', '', $money);
    $onlyNumbersString = preg_replace('/([^0-9])/i', '', $money);

    $separatorsCountToBeErased = strlen($cleanString) - strlen($onlyNumbersString) - 1;

    $stringWithCommaOrDot = preg_replace('/([,\.])/', '', $cleanString, $separatorsCountToBeErased);
    $removedThousandSeparator = preg_replace('/(\.|,)(?=[0-9]{3,}$)/', '',  $stringWithCommaOrDot);

    return (float) str_replace(',', '.', $removedThousandSeparator);
}

тесты:

['1,10 USD', 1.10],
['1 000 000.00', 1000000.0],
['$1 000 000.21', 1000000.21],
['£1.10', 1.10],
['$123 456 789', 123456789.0],
['$123,456,789.12', 123456789.12],
['$123 456 789,12', 123456789.12],
['1.10', 1.1],
[',,,,.10', .1],
['1.000', 1000.0],
['1,000', 1000.0]

Предостережения: выдает ошибку, если десятичная часть содержит более двух цифр.

Это реализация из этой библиотеки: https://github.com/mcuadros/currency-detector

Автор: mcuadros Размещён: 04.11.2013 09:22
Вопросы из категории :
32x32