Enter regular expression - obniżka procentowa

0

Witam Koleżanki i Koledzy,

Nie wiem czy w odpowiednim miejscu napisałem ale szukam rozwiązania. Chciałbym użyć podczas importu danych regular expression a dokładniej np. mamy liczbę 100 - i poprzez to wyrażenie importujemy o 50% mniejszą czyli importowana liczba ma wynieść 50.
Próbowałem tego:
^\d{0,2}(.\d{1,4})? *%?$

Ale nic z tego nie wychodzi... Pomożecie?
matches regular expression?

0

Napisz przykładowe dane wejściowe i oczekiwany wynik, bo ze 100 nijak nie wychodzi 50% obniżka.

0

Czyt ja dobrze widzę, żę Chcesz dzielić liczby regexami? Chyba nie tędy droga:) Jak wygladają dane i jaki jest format, to coś popatrzymy.

0
lion137 napisał(a):

Czyt ja dobrze widzę, żę Chcesz dzielić liczby regexami? Chyba nie tędy droga:) Jak wygladają dane i jaki jest format, to coś popatrzymy.

No własnie tylko w ten sposób obecnie mogę. Mam zbudowanego importera xml i poprzez regex muszę zaimportować 50% wartości z podanych liczb np. 150, 250 itd. i za fiksa nie wiem jak to rozgryźć jeżeli w ogóle się da - innej możliwości nie mam

0

A nie Mozesz, przed regexa, zaimportowac liczb, a potem obliczyc 50%?

0
lion137 napisał(a):

A nie Mozesz, przed regexa, zaimportowac liczb, a potem obliczyc 50%?

no tak ale jak to zrobić na automacie podczas importu? hmm

1

Pierw sprawdzasz regexem warunek jakiś, potem bierzesz liczbę zaimportowaną, dzielisz na dwa. Pamiętaj, że jeżeli nie jest to aplikacja dla samego siebie i np liczysz pieniądze, to wypada użyć biblioteki która Ci to na pewno obsłuży dobrze (A nie na floatach).

0

A nie możesz napisac prostego programiku w php, który zczytuje xmla, tworzy nową wartość - 50% a następnie zapisuje do pliku?

0

Myślę, że chodzi Ci o coś takiego:

<?php

$input = '<tag value="100.5 %">foo</tag>';

$translate = function($matches) {
    $half = floatval($matches[1]) / 2;
    return str_replace($matches[1], $half, $matches[0]);
};

$output = preg_replace_callback(
    '/\D(\d{1,3}(\.\d{1,4})?) %?/',
    $translate,
    $input
);

echo $output, PHP_EOL;

Tylko musisz sobie dopracować wyrażenie regularne.

Skoro robisz przeceny to prawdopodobnie jej wartość będziesz chciał zmieniać, więc lepsza będzie taka funkcja:

<?php

$input = '<tag value="100.5 %">foo</tag>';

function makeReduceCallback(float $reduceValue) {
    return function($matches) use ($reduceValue) {
        $newPrice = floatval($matches[1]) * $reduceValue;
        return str_replace($matches[1], $newPrice, $matches[0]);
    };
}

$output = preg_replace_callback(
    '/\D(\d{1,3}(\.\d{1,4})?) %?/',
    makeReduceCallback(0.5),
    $input
);

echo $output, PHP_EOL;
0

Albo mógłbyś użyć biblioteki T-Regx która ma trochę czystsze API:

$output = pattern('\D(\d{1,3}(\.\d{1,4})?) %?')->replace($input)->callback(makeReduceCallback(0.5));

1 użytkowników online, w tym zalogowanych: 0, gości: 1