1
0

Improved support for whitespace in prices
Some checks failed
Python Ruff Code Quality / ruff (push) Failing after 22s
Run Python tests (through Pytest) / Test (push) Failing after 24s
Verify Python project can be installed, loaded and have version checked / Test (push) Successful in 21s

This commit is contained in:
Jon Michael Aanes 2025-05-17 15:45:23 +02:00
parent 84042615d6
commit ff4a975c79
Signed by: Jmaa
SSH Key Fingerprint: SHA256:Ab0GfHGCblESJx7JRE4fj4bFy/KRpeLhi41y4pF3sNA
2 changed files with 19 additions and 6 deletions

View File

@ -12,16 +12,14 @@ from .data import (
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
RE_PRICE_RAW = r'\b(?:dkk|sek|usd|nok|eur)?\s*([1-9][\d.]*[\d](?:,\d+)?)\s*(?:,-|:-|.-|;-)?\s*(?:(?:kr|kroner|krone|dkk|sek|usd|eur|nok)\b)?\.?' RE_PRODUCT_PRICE_DK = r'-?[1-9]\d{0,2}(?:[\.\s]?\d{3})*(?:,\d\d\.?)?'
RE_PRODUCT_PRICE_EN = r'-?[1-9]\d{0,2}(?:[,\s]?\d{3})*(?:\.\d\d)?'
RE_PRICE = re.compile(RE_PRICE_RAW, flags=re.IGNORECASE)
RE_PRODUCT_PRICE_DK = r'-?[1-9]\d{0,2}(?:\.?\d{3})*(?:,\d\d\.?)?'
RE_PRODUCT_PRICE_EN = r'-?[1-9]\d{0,2}(?:,?\d{3})*(?:\.\d\d)?'
RE_PRODUCT_PRICE_AMOUNT = r'(?P<amount>' + RE_PRODUCT_PRICE_DK + '|' + RE_PRODUCT_PRICE_EN + ')' RE_PRODUCT_PRICE_AMOUNT = r'(?P<amount>' + RE_PRODUCT_PRICE_DK + '|' + RE_PRODUCT_PRICE_EN + ')'
assert re.fullmatch(RE_PRODUCT_PRICE_DK, '1 000 000')
def parse_amount(price: str) -> Decimal: def parse_amount(price: str) -> Decimal:
price = re.sub(r'\s', '', price, flags=re.IGNORECASE)
if re.fullmatch(RE_PRODUCT_PRICE_DK, price): if re.fullmatch(RE_PRODUCT_PRICE_DK, price):
price = price.replace('.', '').replace(',', '.') price = price.replace('.', '').replace(',', '.')
else: else:
@ -109,6 +107,7 @@ def parse_price(text: str, default_currency: Asset) -> AssetAmount | None:
elif m := (RE_KR_AMOUNT.fullmatch(text) or RE_AMOUNT_KR.fullmatch(text) or RE_AMOUNT_SUFFIX.fullmatch(text)): elif m := (RE_KR_AMOUNT.fullmatch(text) or RE_AMOUNT_KR.fullmatch(text) or RE_AMOUNT_SUFFIX.fullmatch(text)):
code, amount_text = 'DKK', m.group('amount') code, amount_text = 'DKK', m.group('amount')
else: else:
logger.debug('Unknown format: %s', text)
return None return None
currency = ( currency = (

View File

@ -17,6 +17,11 @@ PRICES_PARSABLE = [
(' 100 kr ', dkk(100)), (' 100 kr ', dkk(100)),
('349.-', dkk(349)), ('349.-', dkk(349)),
('3.000 kr.', dkk(3000)), ('3.000 kr.', dkk(3000)),
('3.000.000 kr.', dkk(3_000_000)),
('3.000.000,25 kr.', dkk(3_000_000.25)),
('3,000 kr.', dkk(3000)),
('3,000,000 kr.', dkk(3_000_000)),
('3,000,000.25 kr.', dkk(3_000_000.25)),
('25,00 kr.', dkk(25)), ('25,00 kr.', dkk(25)),
('300,00 kr.', dkk(300)), ('300,00 kr.', dkk(300)),
('300kr.', dkk(300)), ('300kr.', dkk(300)),
@ -25,6 +30,15 @@ PRICES_PARSABLE = [
('9,99 dkk', dkk('9.99')), ('9,99 dkk', dkk('9.99')),
('17900 kr', dkk(17900)), ('17900 kr', dkk(17900)),
('650 kr.', dkk(650)), ('650 kr.', dkk(650)),
('3 650 kr.', dkk(3_650)),
('3 650 DKK', dkk(3_650)),
('3 650 650 kr.', dkk(3_650_650)),
('3 650 650 DKK', dkk(3_650_650)),
('3 650 kr.', dkk(3_650)),
('3 650 DKK', dkk(3_650)),
('3 650 650 kr.', dkk(3_650_650)),
('3 650 650 DKK', dkk(3_650_650)),
('2998 kr', dkk(2998)),
] ]
PRICES_UNPARSABLE = [ PRICES_UNPARSABLE = [