Подтвердить что ты не робот

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

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

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

4b9b3361

Ответ 1

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

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

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

дает: float(75.25)

Обратите внимание, что расширение intl extension по умолчанию не включено. См. Инструкции по установке.

Ответ 2

использовать 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

Итак, у вас это есть. одна линия, одна замена. вам хорошо идти.

Ответ 3

Это немного более сложное/медленное решение, но работает со всеми локалями. Поскольку решение @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);
    $removedThousendSeparator = preg_replace('/(\.|,)(?=[0-9]{3,}$)/', '',  $stringWithCommaOrDot);

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

Тесты:

['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

Ответ 4

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

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

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

$float = floatval(preg_replace('/[^\d\.]/', '', '$100.25')); // 100.25

Ответ 5

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

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

Ответ 6

Кастинг - ваш друг:

$int = (int) $string;

Обновить на основе op:

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

<?php

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

echo extract_numbers('$100');

?>

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

Ответ 7

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

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

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

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

Ответ 8

Я новичок, поэтому, вероятно, очевидный (для других, а не я) недостаток подхода ниже, но думал, что я поделюсь им так или иначе. Мне было бы интересно узнать, быстрее или медленнее, чем при использовании 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);