php - разрешить использование отрицательного десятичного знака с помощью preg_replace - PullRequest
0 голосов
/ 19 декабря 2018

У меня есть маска ввода в такой переменной 200.000,54

Это мой php-код

<?php

class MoneyHelper
{
    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);

        return [
          'cleanString' => $cleanString,
          'onlyNumbersString' => $onlyNumbersString,
          'separatorsCountToBeErased' => $separatorsCountToBeErased,
          'stringWithCommaOrDot' => $stringWithCommaOrDot,
          'removedThousandSeparator' => $removedThousandSeparator,
          'result' => (float) str_replace(',', '.', $removedThousandSeparator)

        ];

    }
}


$obj = new MoneyHelper;
echo var_dump($obj->getAmount('200.000,54')) ;

Результат:

array (size=6)
 'cleanString' => string '200.000,54' (length=10)
 'onlyNumbersString' => string '20000054' (length=8)
 'separatorsCountToBeErased' => int 1
 'stringWithCommaOrDot' => string '200000,54' (length=9)
 'removedThousandSeparator' => string '200000,54' (length=9)
 'result' => float 200000.54

Все естьхорошо, пока я не проверю этот код с отрицательным числом.Допустим, - 200.000,54

Тогда результат все тот же,

array (size=6)
  'cleanString' => string '200.000,54' (length=10)
  'onlyNumbersString' => string '20000054' (length=8)
  'separatorsCountToBeErased' => int 1
  'stringWithCommaOrDot' => string '200000,54' (length=9)
  'removedThousandSeparator' => string '200000,54' (length=9)
  'result' => float 200000.54

Как я могу получить отрицательное число в результате?Пожалуйста, сообщите ...

Обновление

Вы не сообщили нам точный желаемый результат

Мне нужно: 'result' => float -200000.54

1 Ответ

0 голосов
/ 19 декабря 2018

Вам просто нужно добавить отрицательные символы к вашим классам отрицанных символов.Я могу также внести некоторые другие корректировки.

Фрагмент: ( Полная демонстрация )

$cleanString = preg_replace('/[^\d.,-]/', '', $money);
$onlyNumbersString = preg_replace('/[^\d-]/', '', $money);

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

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

Вывод:

array(6) {
  ["cleanString"]=>
  string(11) "-200.000,54"
  ["onlyNumbersString"]=>
  string(9) "-20000054"
  ["separatorsCountToBeErased"]=>
  int(1)
  ["stringWithCommaOrDot"]=>
  string(10) "-200000,54"
  ["removedThousandSeparator"]=>
  string(10) "-200000,54"
  ["result"]=>
  float(-200000.54)
}
...