[
  {
    "path": ".git-blame-ignore-revs",
    "content": "# applying pre-commit hooks to the project\nca42e4247d872a174afc539902e156282940ad5d\n"
  },
  {
    "path": ".github/workflows/main.yml",
    "content": "name: Tests\n\non: [push, pull_request]\n\njobs:\n  tests:\n    runs-on: ubuntu-latest\n    if: github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name != github.event.pull_request.base.repo.full_name\n    strategy:\n      fail-fast: false\n      matrix:\n        include:\n        - python-version: \"3.9\"\n          env:\n            TOXENV: py\n        - python-version: \"3.10\"\n          env:\n            TOXENV: py\n        - python-version: \"3.11\"\n          env:\n            TOXENV: py\n        - python-version: \"3.12\"\n          env:\n            TOXENV: py\n        - python-version: \"3.13\"\n          env:\n            TOXENV: py\n        - python-version: \"3.14.0-rc.3\"\n          env:\n            TOXENV: py\n        - python-version: \"3.13\"\n          env:\n            TOXENV: mypy\n    steps:\n    - uses: actions/checkout@v5\n    - name: Set up Python ${{ matrix.python-version }}\n      uses: actions/setup-python@v6\n      with:\n        python-version: ${{ matrix.python-version }}\n\n    - name: Run tests\n      env: ${{ matrix.env }}\n      run: |\n        pip install -U tox\n        tox\n\n    - name: Upload coverage report\n      uses: codecov/codecov-action@v5\n      with:\n        token: ${{ secrets.CODECOV_TOKEN }}\n\n  pre-commit:\n    runs-on: ubuntu-latest\n    steps:\n    - uses: actions/checkout@v5\n    - uses: pre-commit/action@v3.0.1\n"
  },
  {
    "path": ".github/workflows/publish.yml",
    "content": "name: Publish\non:\n  push:\n    tags:\n    - '[0-9]+.[0-9]+.[0-9]+'\njobs:\n  publish:\n    runs-on: ubuntu-latest\n    environment:\n      name: pypi\n      url: https://pypi.org/p/${{ github.event.repository.name }}\n    permissions:\n      id-token: write\n    steps:\n    - uses: actions/checkout@v5\n    - uses: actions/setup-python@v6\n      with:\n        python-version: 3.13\n    - run: |\n        python -m pip install --upgrade build\n        python -m build\n    - name: Publish to PyPI\n      uses: pypa/gh-action-pypi-publish@release/v1\n      with:\n          password: ${{ secrets.PYPI_TOKEN }}\n"
  },
  {
    "path": ".gitignore",
    "content": "# Python\n*.pyc\n*.pyo\n/build/\n/dist/\n*.egg-info\n\n# Mac OS\n*.DS_Store\n\n# IDE\n/.idea/\n/.vscode/\n\n.mypy_cache/\n.cache/\n.tox/\n.pytest_cache/\n.coverage\ncoverage.xml\n\n# python virtual env\n.venv/\nvenv/\n.env/\nenv/\n"
  },
  {
    "path": ".pre-commit-config.yaml",
    "content": "exclude: tests/test_webpages\nrepos:\n- repo: https://github.com/astral-sh/ruff-pre-commit\n  rev: v0.13.2\n  hooks:\n    - id: ruff-check\n      args: [ --fix ]\n    - id: ruff-format\n- repo: https://github.com/pre-commit/pre-commit-hooks\n  rev: v6.0.0\n  hooks:\n  - id: end-of-file-fixer\n  - id: trailing-whitespace\n"
  },
  {
    "path": "CHANGES.rst",
    "content": "Changes\n=======\n\n0.5.1 (2026-03-19)\n------------------\n\n* Added support for additional currencies: Egyptian pound (EGP), UAE dirham\n  (AED) and Saudi riyal (SAR).\n\n0.5.0 (2025-10-06)\n------------------\n\n* Added support for Python 3.14.\n* Added support for ``'`` as a thousands separator.\n* Migrated the build system to ``hatchling``.\n* Improved type hints.\n* CI improvements.\n\n0.4.0 (2025-02-05)\n------------------\n\n* Dropped support for Python 3.8 and lower, added support for Python 3.11-3.13.\n* Added a ``digit_group_separator`` parameter to ``Price.fromstring()``.\n\n0.3.4 (2020-11-25)\n------------------\n\n* Improved parsing of prices without digits before a decimal point ('.75'),\n  https://github.com/scrapinghub/price-parser/pull/42\n* Fix parsing of price with non-breaking spaces\n  https://github.com/scrapinghub/price-parser/pull/43\n\n0.3.3 (2020-02-05)\n------------------\n\n* Fixed installation issue on some Windows machines.\n\n0.3.2 (2020-01-28)\n------------------\n\n* Improved Korean and Japanese currency detection.\n* Declare Python 3.8 support.\n\n0.3.1 (2019-10-21)\n------------------\n\n* Redundant $ signs are no longer returned as a part of currency, e.g.\n  for ``SGD$ 100`` currency would be ``SGD``, not ``SGD$``.\n\n0.3.0 (2019-10-19)\n------------------\n\n* New ``Price.fromstring`` argument ``decimal_separator`` allows to override\n  decimal separator for the cases where it is known\n  (i.e. disable decimal separator detection);\n* NTD and RBM unofficial currency names are added;\n* quantifiers in regular expressions are made non-greedy, which provides\n  a small speedup;\n* test improvements.\n\n0.2.4 (2019-07-03)\n------------------\n\n* Declare price-parser as providing type annotations (pep-561). This enables\n  better type checking for projects using price-parser.\n* improved test coverage\n\n0.2.3 (2019-06-18)\n------------------\n\n* Follow-up for 0.2.2 release: improved parsing of prices with 4+ digits\n  after a decimal separator.\n\n0.2.2 (2019-06-18)\n------------------\n\n* Fixed parsing of prices with 4+ digits after a decimal separator.\n\n0.2.1 (2019-04-19)\n------------------\n\n* 23 additional currency symbols are added;\n* ``A$`` alias for Australian Dollar is added.\n\n0.2 (2019-04-12)\n----------------\n\nAdded support for currencies replaced by euro.\n\n0.1.1 (2019-04-12)\n------------------\n\nMinor packaging fixes.\n\n0.1 (2019-04-12)\n----------------\n\nInitial release.\n"
  },
  {
    "path": "LICENSE",
    "content": "Copyright (c) Scrapinghub\nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or without modification,\nare permitted provided that the following conditions are met:\n\n    1. Redistributions of source code must retain the above copyright notice,\n       this list of conditions and the following disclaimer.\n\n    2. Redistributions in binary form must reproduce the above copyright\n       notice, this list of conditions and the following disclaimer in the\n       documentation and/or other materials provided with the distribution.\n\n    3. Neither the name of ScrapingHub nor the names of its contributors may be used\n       to endorse or promote products derived from this software without\n       specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\nANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\nWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\nDISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR\nANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\nLOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON\nANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\nSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n"
  },
  {
    "path": "README.rst",
    "content": "============\nprice-parser\n============\n\n.. image:: https://img.shields.io/pypi/v/price-parser.svg\n   :target: https://pypi.python.org/pypi/price-parser\n   :alt: PyPI Version\n\n.. image:: https://img.shields.io/pypi/pyversions/price-parser.svg\n   :target: https://pypi.python.org/pypi/price-parser\n   :alt: Supported Python Versions\n\n.. image:: https://github.com/scrapinghub/price-parser/actions/workflows/main.yml/badge.svg?branch=master\n   :target: https://github.com/scrapinghub/price-parser/actions?workflow=Tests\n   :alt: Build Status\n\n.. image:: https://codecov.io/github/scrapinghub/price-parser/coverage.svg?branch=master\n   :target: https://codecov.io/gh/scrapinghub/price-parser\n   :alt: Coverage report\n\n\n``price-parser`` is a small library for extracting price and currency from\nraw text strings.\n\nFeatures:\n\n* robust price amount and currency symbol extraction\n* zero-effort handling of thousand and decimal separators\n\nThe main use case is parsing prices extracted from web pages.\nFor example, you can write a CSS/XPath selector which targets an element\nwith a price, and then use this library for cleaning it up,\ninstead of writing custom site-specific regex or Python code.\n\nLicense is BSD 3-clause.\n\nInstallation\n============\n\n::\n\n    pip install price-parser\n\nprice-parser requires Python 3.9+.\n\nUsage\n=====\n\nBasic usage\n-----------\n\n>>> from price_parser import Price\n>>> price = Price.fromstring(\"22,90 €\")\n>>> price\nPrice(amount=Decimal('22.90'), currency='€')\n>>> price.amount       # numeric price amount\nDecimal('22.90')\n>>> price.currency     # currency symbol, as appears in the string\n'€'\n>>> price.amount_text  # price amount, as appears in the string\n'22,90'\n>>> price.amount_float # price amount as float, not Decimal\n22.9\n\nIf you prefer, ``Price.fromstring`` has an alias ``price_parser.parse_price``,\nthey do the same:\n\n>>> from price_parser import parse_price\n>>> parse_price(\"22,90 €\")\nPrice(amount=Decimal('22.90'), currency='€')\n\nThe library has extensive tests (900+ real-world examples of price strings).\nSome of the supported cases are described below.\n\nSupported cases\n---------------\n\nUnclean price strings with various currencies are supported;\nthousand separators and decimal separators are handled:\n\n>>> Price.fromstring(\"Price: $119.00\")\nPrice(amount=Decimal('119.00'), currency='$')\n\n>>> Price.fromstring(\"15 130 Р\")\nPrice(amount=Decimal('15130'), currency='Р')\n\n>>> Price.fromstring(\"151,200 تومان\")\nPrice(amount=Decimal('151200'), currency='تومان')\n\n>>> Price.fromstring(\"Rp 1.550.000\")\nPrice(amount=Decimal('1550000'), currency='Rp')\n\n>>> Price.fromstring(\"Běžná cena 75 990,00 Kč\")\nPrice(amount=Decimal('75990.00'), currency='Kč')\n\n\nEuro sign is used as a decimal separator in a wild:\n\n>>> Price.fromstring(\"1,235€ 99\")\nPrice(amount=Decimal('1235.99'), currency='€')\n\n>>> Price.fromstring(\"99 € 95 €\")\nPrice(amount=Decimal('99'), currency='€')\n\n>>> Price.fromstring(\"35€ 999\")\nPrice(amount=Decimal('35'), currency='€')\n\n\nSome special cases are handled:\n\n>>> Price.fromstring(\"Free\")\nPrice(amount=Decimal('0'), currency=None)\n\n\nWhen price or currency can't be extracted, corresponding\nattribute values are set to None:\n\n>>> Price.fromstring(\"\")\nPrice(amount=None, currency=None)\n\n>>> Price.fromstring(\"Foo\")\nPrice(amount=None, currency=None)\n\n>>> Price.fromstring(\"50% OFF\")\nPrice(amount=None, currency=None)\n\n>>> Price.fromstring(\"50\")\nPrice(amount=Decimal('50'), currency=None)\n\n>>> Price.fromstring(\"R$\")\nPrice(amount=None, currency='R$')\n\n\nCurrency hints\n--------------\n\n``currency_hint`` argument allows to pass a text string which may (or may not)\ncontain currency information. This feature is most useful for automated price\nextraction.\n\n>>> Price.fromstring(\"34.99\", currency_hint=\"руб. (шт)\")\nPrice(amount=Decimal('34.99'), currency='руб.')\n\nNote that currency mentioned in the main price string may be\n**preferred** over currency specified in ``currency_hint`` argument;\nit depends on currency symbols found there. If you know the correct currency,\nyou can set it directly:\n\n>>> price = Price.fromstring(\"1 000\")\n>>> price.currency = 'EUR'\n>>> price\nPrice(amount=Decimal('1000'), currency='EUR')\n\n\nDecimal separator\n-----------------\n\nIf you know which symbol is used as a decimal separator in the input string,\npass that symbol in the ``decimal_separator`` argument to prevent price-parser\nfrom guessing the wrong decimal separator symbol.\n\n>>> Price.fromstring(\"Price: $140.600\", decimal_separator=\".\")\nPrice(amount=Decimal('140.600'), currency='$')\n\n>>> Price.fromstring(\"Price: $140.600\", decimal_separator=\",\")\nPrice(amount=Decimal('140600'), currency='$')\n\n\nContributing\n============\n\n* Source code: https://github.com/scrapinghub/price-parser\n* Issue tracker: https://github.com/scrapinghub/price-parser/issues\n\nUse tox_ to run tests with different Python versions::\n\n    tox\n\nThe command above also runs type checks; we use mypy.\n\n.. _tox: https://tox.readthedocs.io\n"
  },
  {
    "path": "codecov.yml",
    "content": "comment:\n  layout: \"header, diff, tree\"\n\ncoverage:\n  status:\n    project: false\n"
  },
  {
    "path": "price_parser/__init__.py",
    "content": "from .parser import Price, parse_price\n\n__all__ = [\"Price\", \"parse_price\"]\n"
  },
  {
    "path": "price_parser/_currencies.py",
    "content": "\"\"\"\nCurrency information.\n\n``CURRENCIES`` data is from https://github.com/StorePilot/coinify,\nwhich is supposed to provide combined data from\n\n* https://gist.github.com/Fluidbyte/2973986\n* https://en.wikipedia.org/wiki/ISO_4217\n* http://www.iotafinance.com/en/ISO-4217-Currency-Codes.html\n* http://www.xe.com/symbols.php\n\nField meaning:\n\n* s - currency main symbol\n* n - currency name  (currently unused)\n* sn - currency native symbol\n* d - decimal digits (currently unused)\n* r - rounding (currently unused)\n* np - currency name, plural (currently unused)\n* sn2 - other currency symbols\n\nSome extra abbreviations are added to the list (they are set below\n``CURRENCIES`` variable, scroll to the bottom).\n\"\"\"\n\nfrom __future__ import annotations\n\nfrom itertools import chain\nfrom typing import TYPE_CHECKING, TypedDict\n\nif TYPE_CHECKING:\n    # typing.NotRequired requires Python 3.11\n    from typing_extensions import NotRequired\n\n\nclass CurrencyInfo(TypedDict):\n    s: str\n    n: str\n    sn: str\n    d: int\n    r: float\n    np: str\n    sn2: NotRequired[list[str]]\n\n\nCURRENCIES: dict[str, CurrencyInfo] = {\n    \"AED\": {\n        \"s\": \"AED\",\n        \"n\": \"United Arab Emirates Dirham\",\n        \"sn\": \"د.إ.‏\",\n        \"d\": 2,\n        \"r\": 0,\n        \"np\": \"UAE dirhams\",\n    },\n    \"AFN\": {\n        \"s\": \"Af\",\n        \"n\": \"Afghan Afghani\",\n        \"sn\": \"؋\",\n        \"d\": 0,\n        \"r\": 0,\n        \"np\": \"Afghan Afghanis\",\n    },\n    \"ALL\": {\n        \"s\": \"ALL\",\n        \"n\": \"Albanian Lek\",\n        \"sn\": \"Lek\",\n        \"d\": 0,\n        \"r\": 0,\n        \"np\": \"Albanian lekë\",\n    },\n    \"AMD\": {\n        \"s\": \"AMD\",\n        \"n\": \"Armenian Dram\",\n        \"sn\": \"դր.\",\n        \"d\": 0,\n        \"r\": 0,\n        \"np\": \"Armenian drams\",\n    },\n    \"ANG\": {\n        \"s\": \"ƒ\",\n        \"n\": \"Netherlands Antilles Guilder\",\n        \"sn\": \"ƒ\",\n        \"d\": 2,\n        \"r\": 0,\n        \"np\": \"Netherlands Antilles Guilder\",\n    },\n    \"AOA\": {\n        \"s\": \"Kz\",\n        \"n\": \"Angolan kwanza\",\n        \"sn\": \"Kz\",\n        \"d\": 2,\n        \"r\": 0,\n        \"np\": \"Angolan kwanza\",\n    },\n    \"ARS\": {\n        \"s\": \"AR$\",\n        \"n\": \"Argentine Peso\",\n        \"sn\": \"$\",\n        \"d\": 2,\n        \"r\": 0,\n        \"np\": \"Argentine pesos\",\n    },\n    \"AUD\": {\n        \"s\": \"AU$\",\n        \"n\": \"Australian Dollar\",\n        \"sn\": \"$\",\n        \"d\": 2,\n        \"r\": 0,\n        \"np\": \"Australian dollars\",\n    },\n    \"AWG\": {\n        \"s\": \"ƒ\",\n        \"n\": \"Aruban Guilder\",\n        \"sn\": \"ƒ\",\n        \"d\": 2,\n        \"r\": 0,\n        \"np\": \"Aruban Guilders\",\n    },\n    \"AFL\": {\n        \"s\": \"Afl.\",\n        \"n\": \"Aruban Florin\",\n        \"sn\": \"Afl.\",\n        \"d\": 2,\n        \"r\": 0,\n        \"np\": \"Aruban Florins\",\n    },\n    \"AZN\": {\n        \"s\": \"man.\",\n        \"n\": \"Azerbaijani Manat\",\n        \"sn\": \"ман.\",\n        \"d\": 2,\n        \"r\": 0,\n        \"np\": \"Azerbaijani manats\",\n    },\n    \"BAM\": {\n        \"s\": \"KM\",\n        \"n\": \"Bosnia-Herzegovina Convertible Mark\",\n        \"sn\": \"KM\",\n        \"d\": 2,\n        \"r\": 0,\n        \"np\": \"Bosnia-Herzegovina convertible marks\",\n    },\n    \"BDT\": {\n        \"s\": \"Tk\",\n        \"n\": \"Bangladeshi Taka\",\n        \"sn\": \"৳\",\n        \"d\": 2,\n        \"r\": 0,\n        \"np\": \"Bangladeshi takas\",\n    },\n    \"BBD\": {\n        \"s\": \"Bds$\",\n        \"n\": \"Barbados dollar\",\n        \"sn\": \"$\",\n        \"d\": 2,\n        \"r\": 0,\n        \"np\": \"Barbados dollar\",\n    },\n    \"BGN\": {\n        \"s\": \"BGN\",\n        \"n\": \"Bulgarian Lev\",\n        \"sn\": \"лв.\",\n        \"d\": 2,\n        \"r\": 0,\n        \"np\": \"Bulgarian leva\",\n    },\n    \"BHD\": {\n        \"s\": \"BD\",\n        \"n\": \"Bahraini Dinar\",\n        \"sn\": \"د.ب.‏\",\n        \"d\": 3,\n        \"r\": 0,\n        \"np\": \"Bahraini dinars\",\n    },\n    \"BIF\": {\n        \"s\": \"FBu\",\n        \"n\": \"Burundian Franc\",\n        \"sn\": \"FBu\",\n        \"d\": 0,\n        \"r\": 0,\n        \"np\": \"Burundian francs\",\n    },\n    \"BSD\": {\n        \"s\": \"$\",\n        \"n\": \"Bahamas Dollar\",\n        \"sn\": \"$\",\n        \"d\": 2,\n        \"r\": 0,\n        \"np\": \"Bahamas Dollar\",\n    },\n    \"BMD\": {\n        \"s\": \"$\",\n        \"n\": \"Bermuda Dollar\",\n        \"sn\": \"$\",\n        \"d\": 2,\n        \"r\": 0,\n        \"np\": \"Bermuda Dollars\",\n    },\n    \"BND\": {\n        \"s\": \"BN$\",\n        \"n\": \"Brunei Dollar\",\n        \"sn\": \"$\",\n        \"d\": 2,\n        \"r\": 0,\n        \"np\": \"Brunei dollars\",\n    },\n    \"BOB\": {\n        \"s\": \"Bs\",\n        \"n\": \"Bolivian Boliviano\",\n        \"sn\": \"Bs\",\n        \"d\": 2,\n        \"r\": 0,\n        \"np\": \"Bolivian bolivianos\",\n    },\n    \"BOV\": {\n        \"s\": \"-\",\n        \"n\": \"Bolivian Mvdol\",\n        \"sn\": \"-\",\n        \"d\": 2,\n        \"r\": 0,\n        \"np\": \"Bolivian Mvdol\",\n    },\n    \"BRL\": {\n        \"s\": \"R$\",\n        \"n\": \"Brazilian Real\",\n        \"sn\": \"R$\",\n        \"d\": 2,\n        \"r\": 0,\n        \"np\": \"Brazilian reals\",\n    },\n    \"BTN\": {\n        \"s\": \"Nu.\",\n        \"n\": \"Bhutanese ngultrum\",\n        \"sn\": \"Nu.\",\n        \"d\": 2,\n        \"r\": 0,\n        \"np\": \"Bhutanese ngultrum\",\n    },\n    \"BWP\": {\n        \"s\": \"BWP\",\n        \"n\": \"Botswanan Pula\",\n        \"sn\": \"P\",\n        \"d\": 2,\n        \"r\": 0,\n        \"np\": \"Botswanan pulas\",\n    },\n    \"BYN\": {\n        \"s\": \"Br\",\n        \"n\": \"Belarusian Ruble\",\n        \"sn\": \"Br\",\n        \"d\": 0,\n        \"r\": 0,\n        \"np\": \"Belarusian rubles\",\n    },\n    \"BZD\": {\n        \"s\": \"BZ$\",\n        \"n\": \"Belize Dollar\",\n        \"sn\": \"$\",\n        \"d\": 2,\n        \"r\": 0,\n        \"np\": \"Belize dollars\",\n    },\n    \"CAD\": {\n        \"s\": \"CA$\",\n        \"n\": \"Canadian Dollar\",\n        \"sn\": \"$\",\n        \"d\": 2,\n        \"r\": 0,\n        \"np\": \"Canadian dollars\",\n    },\n    \"CDF\": {\n        \"s\": \"CDF\",\n        \"n\": \"Congolese Franc\",\n        \"sn\": \"FrCD\",\n        \"d\": 2,\n        \"r\": 0,\n        \"np\": \"Congolese francs\",\n    },\n    \"CHE\": {\n        \"s\": \"-\",\n        \"n\": \"WIR Euro (complementary currency)\",\n        \"sn\": \"-\",\n        \"d\": 2,\n        \"r\": 0,\n        \"np\": \"WIR Euros (complementary currency)\",\n    },\n    \"CHF\": {\n        \"s\": \"CHF\",\n        \"n\": \"Swiss Franc\",\n        \"sn\": \"CHF\",\n        \"d\": 2,\n        \"r\": 0.05,\n        \"np\": \"Swiss francs\",\n    },\n    \"CHW\": {\n        \"s\": \"-\",\n        \"n\": \"WIR Franc (complementary currency)\",\n        \"sn\": \"-\",\n        \"d\": 2,\n        \"r\": 0,\n        \"np\": \"WIR Franc (complementary currency)\",\n    },\n    \"CLF\": {\n        \"s\": \"UF\",\n        \"n\": \"Unidad de Fomento (funds code)\",\n        \"sn\": \"UF\",\n        \"d\": 4,\n        \"r\": 0,\n        \"np\": \"Unidad de Fomento (funds code)\",\n    },\n    \"CLP\": {\n        \"s\": \"CL$\",\n        \"n\": \"Chilean Peso\",\n        \"sn\": \"$\",\n        \"d\": 0,\n        \"r\": 0,\n        \"np\": \"Chilean pesos\",\n    },\n    \"CNY\": {\n        \"s\": \"CN¥\",\n        \"n\": \"Chinese Yuan\",\n        \"sn\": \"CN¥\",\n        \"d\": 2,\n        \"r\": 0,\n        \"np\": \"Chinese yuan\",\n    },\n    \"COP\": {\n        \"s\": \"CO$\",\n        \"n\": \"Colombian Peso\",\n        \"sn\": \"$\",\n        \"d\": 0,\n        \"r\": 0,\n        \"np\": \"Colombian pesos\",\n    },\n    \"COU\": {\n        \"s\": \"-\",\n        \"n\": \"Unidad de Valor Real (UVR) (funds code)\",\n        \"sn\": \"-\",\n        \"d\": 2,\n        \"r\": 0,\n        \"np\": \"Unidad de Valor Real (UVR) (funds code)\",\n    },\n    \"CRC\": {\n        \"s\": \"₡\",\n        \"n\": \"Costa Rican Colón\",\n        \"sn\": \"₡\",\n        \"d\": 0,\n        \"r\": 0,\n        \"np\": \"Costa Rican colóns\",\n    },\n    \"CUC\": {\n        \"s\": \"CUC$\",\n        \"n\": \"Cuban convertible peso\",\n        \"sn\": \"$\",\n        \"d\": 2,\n        \"r\": 0,\n        \"np\": \"Cuban convertible pesos\",\n    },\n    \"CUP\": {\n        \"s\": \"₱\",\n        \"n\": \"Cuba Peso\",\n        \"sn\": \"₱\",\n        \"d\": 0,\n        \"r\": 0,\n        \"np\": \"Cuba Pesos\",\n    },\n    \"CVE\": {\n        \"s\": \"CV$\",\n        \"n\": \"Cape Verdean Escudo\",\n        \"sn\": \"CV$\",\n        \"d\": 0,\n        \"r\": 0,\n        \"np\": \"Cape Verdean escudos\",\n    },\n    \"CZK\": {\n        \"s\": \"Kč\",\n        \"n\": \"Czech Republic Koruna\",\n        \"sn\": \"Kč\",\n        \"d\": 2,\n        \"r\": 0,\n        \"np\": \"Czech Republic korunas\",\n    },\n    \"DJF\": {\n        \"s\": \"Fdj\",\n        \"n\": \"Djiboutian Franc\",\n        \"sn\": \"Fdj\",\n        \"d\": 0,\n        \"r\": 0,\n        \"np\": \"Djiboutian francs\",\n    },\n    \"DKK\": {\n        \"s\": \"Dkr\",\n        \"n\": \"Danish Krone\",\n        \"sn\": \"kr\",\n        \"d\": 2,\n        \"r\": 0,\n        \"np\": \"Danish kroner\",\n    },\n    \"DOP\": {\n        \"s\": \"RD$\",\n        \"n\": \"Dominican Peso\",\n        \"sn\": \"RD$\",\n        \"d\": 2,\n        \"r\": 0,\n        \"np\": \"Dominican pesos\",\n    },\n    \"DZD\": {\n        \"s\": \"DA\",\n        \"n\": \"Algerian Dinar\",\n        \"sn\": \"د.ج.‏\",\n        \"d\": 2,\n        \"r\": 0,\n        \"np\": \"Algerian dinars\",\n    },\n    \"EEK\": {\n        \"s\": \"Ekr\",\n        \"n\": \"Estonian Kroon\",\n        \"sn\": \"kr\",\n        \"d\": 2,\n        \"r\": 0,\n        \"np\": \"Estonian kroons\",\n    },\n    \"EGP\": {\n        \"s\": \"EGP\",\n        \"n\": \"Egyptian Pound\",\n        \"sn\": \"ج.م.‏\",\n        \"d\": 2,\n        \"r\": 0,\n        \"np\": \"Egyptian pounds\",\n    },\n    \"ERN\": {\n        \"s\": \"Nfk\",\n        \"n\": \"Eritrean Nakfa\",\n        \"sn\": \"Nfk\",\n        \"d\": 2,\n        \"r\": 0,\n        \"np\": \"Eritrean nakfas\",\n    },\n    \"ETB\": {\n        \"s\": \"Br\",\n        \"n\": \"Ethiopian Birr\",\n        \"sn\": \"Br\",\n        \"d\": 2,\n        \"r\": 0,\n        \"np\": \"Ethiopian birrs\",\n    },\n    \"EUR\": {\"s\": \"€\", \"n\": \"Euro\", \"sn\": \"€\", \"d\": 2, \"r\": 0, \"np\": \"euros\"},\n    \"FJD\": {\n        \"s\": \"$\",\n        \"n\": \"Fiji Dollar\",\n        \"sn\": \"$\",\n        \"d\": 2,\n        \"r\": 0,\n        \"np\": \"Fiji Dollars\",\n    },\n    \"FKP\": {\n        \"s\": \"£\",\n        \"n\": \"Falkland Islands (Malvinas) Pound\",\n        \"sn\": \"£\",\n        \"d\": 2,\n        \"r\": 0,\n        \"np\": \"Falkland Islands (Malvinas) Pound\",\n    },\n    \"GBP\": {\n        \"s\": \"£\",\n        \"n\": \"British Pound Sterling\",\n        \"sn\": \"£\",\n        \"d\": 2,\n        \"r\": 0,\n        \"np\": \"British pounds sterling\",\n    },\n    \"GEL\": {\n        \"s\": \"GEL\",\n        \"n\": \"Georgian Lari\",\n        \"sn\": \"GEL\",\n        \"d\": 2,\n        \"r\": 0,\n        \"np\": \"Georgian laris\",\n    },\n    \"GGP\": {\n        \"s\": \"£\",\n        \"n\": \"Guernsey Pound\",\n        \"sn\": \"£\",\n        \"d\": 2,\n        \"r\": 0,\n        \"np\": \"Guernsey Pounds\",\n    },\n    \"GHS\": {\n        \"s\": \"GH₵\",\n        \"n\": \"Ghanaian Cedi\",\n        \"sn\": \"GH₵\",\n        \"d\": 2,\n        \"r\": 0,\n        \"np\": \"Ghanaian cedis\",\n    },\n    \"GIP\": {\n        \"s\": \"£\",\n        \"n\": \"Gibraltar Pound\",\n        \"sn\": \"£\",\n        \"d\": 2,\n        \"r\": 0,\n        \"np\": \"Gibraltar Pounds\",\n    },\n    \"GMD\": {\n        \"s\": \"D\",\n        \"n\": \"Gambian dalasi\",\n        \"sn\": \"D\",\n        \"d\": 2,\n        \"r\": 0,\n        \"np\": \"Gambian dalasi\",\n    },\n    \"GNF\": {\n        \"s\": \"FG\",\n        \"n\": \"Guinean Franc\",\n        \"sn\": \"FG\",\n        \"d\": 0,\n        \"r\": 0,\n        \"np\": \"Guinean francs\",\n    },\n    \"GTQ\": {\n        \"s\": \"GTQ\",\n        \"n\": \"Guatemalan Quetzal\",\n        \"sn\": \"Q\",\n        \"d\": 2,\n        \"r\": 0,\n        \"np\": \"Guatemalan quetzals\",\n    },\n    \"GYD\": {\n        \"s\": \"$\",\n        \"n\": \"Guyana Dollar\",\n        \"sn\": \"$\",\n        \"d\": 2,\n        \"r\": 0,\n        \"np\": \"Guyana Dollars\",\n    },\n    \"HKD\": {\n        \"s\": \"HK$\",\n        \"n\": \"Hong Kong Dollar\",\n        \"sn\": \"$\",\n        \"d\": 2,\n        \"r\": 0,\n        \"np\": \"Hong Kong dollars\",\n    },\n    \"HNL\": {\n        \"s\": \"HNL\",\n        \"n\": \"Honduran Lempira\",\n        \"sn\": \"L\",\n        \"d\": 2,\n        \"r\": 0,\n        \"np\": \"Honduran lempiras\",\n    },\n    \"HRK\": {\n        \"s\": \"kn\",\n        \"n\": \"Croatian Kuna\",\n        \"sn\": \"kn\",\n        \"d\": 2,\n        \"r\": 0,\n        \"np\": \"Croatian kunas\",\n    },\n    \"HTG\": {\n        \"s\": \"G\",\n        \"n\": \"Haitian gourde\",\n        \"sn\": \"G\",\n        \"d\": 2,\n        \"r\": 0,\n        \"np\": \"Haitian gourde\",\n    },\n    \"HUF\": {\n        \"s\": \"Ft\",\n        \"n\": \"Hungarian Forint\",\n        \"sn\": \"Ft\",\n        \"d\": 0,\n        \"r\": 0,\n        \"np\": \"Hungarian forints\",\n    },\n    \"IDR\": {\n        \"s\": \"Rp\",\n        \"n\": \"Indonesian Rupiah\",\n        \"sn\": \"Rp\",\n        \"d\": 0,\n        \"r\": 0,\n        \"np\": \"Indonesian rupiahs\",\n    },\n    \"ILS\": {\n        \"s\": \"₪\",\n        \"n\": \"Israeli New Sheqel\",\n        \"sn\": \"₪\",\n        \"d\": 2,\n        \"r\": 0,\n        \"np\": \"Israeli new sheqels\",\n    },\n    \"IMP\": {\n        \"s\": \"£\",\n        \"n\": \"Isle of Man Pound\",\n        \"sn\": \"£\",\n        \"d\": 2,\n        \"r\": 0,\n        \"np\": \"Isle of Man Pounds\",\n    },\n    \"INR\": {\n        \"s\": \"Rs\",\n        \"n\": \"Indian Rupee\",\n        \"sn\": \"টকা\",\n        \"d\": 2,\n        \"r\": 0,\n        \"np\": \"Indian rupees\",\n    },\n    \"IQD\": {\n        \"s\": \"IQD\",\n        \"n\": \"Iraqi Dinar\",\n        \"sn\": \"د.ع.‏\",\n        \"d\": 3,\n        \"r\": 0,\n        \"np\": \"Iraqi dinars\",\n    },\n    \"IRR\": {\n        \"s\": \"IRR\",\n        \"n\": \"Iranian Rial\",\n        \"sn\": \"﷼\",\n        \"d\": 0,\n        \"r\": 0,\n        \"np\": \"Iranian rials\",\n    },\n    \"ISK\": {\n        \"s\": \"Ikr\",\n        \"n\": \"Icelandic Króna\",\n        \"sn\": \"kr\",\n        \"d\": 0,\n        \"r\": 0,\n        \"np\": \"Icelandic krónur\",\n    },\n    \"JEP\": {\n        \"s\": \"£\",\n        \"n\": \"Jersey Pound\",\n        \"sn\": \"£\",\n        \"d\": 2,\n        \"r\": 0,\n        \"np\": \"Jersey Pounds\",\n    },\n    \"JMD\": {\n        \"s\": \"J$\",\n        \"n\": \"Jamaican Dollar\",\n        \"sn\": \"$\",\n        \"d\": 2,\n        \"r\": 0,\n        \"np\": \"Jamaican dollars\",\n    },\n    \"JOD\": {\n        \"s\": \"JD\",\n        \"n\": \"Jordanian Dinar\",\n        \"sn\": \"د.أ.‏\",\n        \"d\": 3,\n        \"r\": 0,\n        \"np\": \"Jordanian dinars\",\n    },\n    \"JPY\": {\n        \"s\": \"¥\",\n        \"n\": \"Japanese Yen\",\n        \"sn\": \"￥\",\n        \"sn2\": [\"円\"],\n        \"d\": 0,\n        \"r\": 0,\n        \"np\": \"Japanese yen\",\n    },\n    \"KES\": {\n        \"s\": \"Ksh\",\n        \"n\": \"Kenyan Shilling\",\n        \"sn\": \"Ksh\",\n        \"d\": 2,\n        \"r\": 0,\n        \"np\": \"Kenyan shillings\",\n    },\n    \"KGS\": {\n        \"s\": \"лв\",\n        \"n\": \"Kyrgyzstan Som\",\n        \"sn\": \"лв\",\n        \"d\": 2,\n        \"r\": 0,\n        \"np\": \"Kyrgyzstan Som\",\n    },\n    \"KHR\": {\n        \"s\": \"KHR\",\n        \"n\": \"Cambodian Riel\",\n        \"sn\": \"៛\",\n        \"d\": 2,\n        \"r\": 0,\n        \"np\": \"Cambodian riels\",\n    },\n    \"KMF\": {\n        \"s\": \"CF\",\n        \"n\": \"Comorian Franc\",\n        \"sn\": \"FC\",\n        \"d\": 0,\n        \"r\": 0,\n        \"np\": \"Comorian francs\",\n    },\n    \"KPW\": {\n        \"s\": \"₩\",\n        \"n\": \"North Korean Won\",\n        \"sn\": \"원\",\n        \"d\": 0,\n        \"r\": 0,\n        \"np\": \"North Korean Won\",\n    },\n    \"KRW\": {\n        \"s\": \"₩\",\n        \"n\": \"South Korean Won\",\n        \"sn\": \"원\",\n        \"d\": 0,\n        \"r\": 0,\n        \"np\": \"South Korean won\",\n    },\n    \"KWD\": {\n        \"s\": \"KD\",\n        \"n\": \"Kuwaiti Dinar\",\n        \"sn\": \"د.ك.‏\",\n        \"d\": 3,\n        \"r\": 0,\n        \"np\": \"Kuwaiti dinars\",\n    },\n    \"KYD\": {\n        \"s\": \"$\",\n        \"n\": \"Cayman Islands Dollar\",\n        \"sn\": \"$\",\n        \"d\": 2,\n        \"r\": 0,\n        \"np\": \"Cayman Islands Dollars\",\n    },\n    \"KZT\": {\n        \"s\": \"KZT\",\n        \"n\": \"Kazakhstani Tenge\",\n        \"sn\": \"тңг.\",\n        \"d\": 2,\n        \"r\": 0,\n        \"np\": \"Kazakhstani tenges\",\n    },\n    \"LAK\": {\n        \"s\": \"₭\",\n        \"n\": \"Laos Kip\",\n        \"sn\": \"₭\",\n        \"d\": 2,\n        \"r\": 0,\n        \"np\": \"Laos Kip\",\n    },\n    \"LBP\": {\n        \"s\": \"LB£\",\n        \"n\": \"Lebanese Pound\",\n        \"sn\": \"ل.ل.‏\",\n        \"d\": 0,\n        \"r\": 0,\n        \"np\": \"Lebanese pounds\",\n    },\n    \"LKR\": {\n        \"s\": \"SLRs\",\n        \"n\": \"Sri Lankan Rupee\",\n        \"sn\": \"SL Re\",\n        \"d\": 2,\n        \"r\": 0,\n        \"np\": \"Sri Lankan rupees\",\n    },\n    \"LRD\": {\n        \"s\": \"$\",\n        \"n\": \"Liberia Dollar\",\n        \"sn\": \"$\",\n        \"d\": 2,\n        \"r\": 0,\n        \"np\": \"Liberia Dollars\",\n    },\n    \"LSL\": {\n        \"s\": \"L\",\n        \"n\": \"Lesotho loti\",\n        \"sn\": \"L\",\n        \"d\": 2,\n        \"r\": 0,\n        \"np\": \"Lesotho loti\",\n    },\n    \"LTL\": {\n        \"s\": \"Lt\",\n        \"n\": \"Lithuanian Litas\",\n        \"sn\": \"Lt\",\n        \"d\": 2,\n        \"r\": 0,\n        \"np\": \"Lithuanian litai\",\n    },\n    \"LVL\": {\n        \"s\": \"Ls\",\n        \"n\": \"Latvian Lats\",\n        \"sn\": \"Ls\",\n        \"d\": 2,\n        \"r\": 0,\n        \"np\": \"Latvian lati\",\n    },\n    \"LYD\": {\n        \"s\": \"LD\",\n        \"n\": \"Libyan Dinar\",\n        \"sn\": \"د.ل.‏\",\n        \"d\": 3,\n        \"r\": 0,\n        \"np\": \"Libyan dinars\",\n    },\n    \"MAD\": {\n        \"s\": \"MAD\",\n        \"n\": \"Moroccan Dirham\",\n        \"sn\": \"د.م.‏\",\n        \"d\": 2,\n        \"r\": 0,\n        \"np\": \"Moroccan dirhams\",\n    },\n    \"MDL\": {\n        \"s\": \"MDL\",\n        \"n\": \"Moldovan Leu\",\n        \"sn\": \"MDL\",\n        \"d\": 2,\n        \"r\": 0,\n        \"np\": \"Moldovan lei\",\n    },\n    \"MGA\": {\n        \"s\": \"MGA\",\n        \"n\": \"Malagasy Ariary\",\n        \"sn\": \"MGA\",\n        \"d\": 0,\n        \"r\": 0,\n        \"np\": \"Malagasy Ariaries\",\n    },\n    \"MKD\": {\n        \"s\": \"MKD\",\n        \"n\": \"Macedonian Denar\",\n        \"sn\": \"MKD\",\n        \"d\": 2,\n        \"r\": 0,\n        \"np\": \"Macedonian denari\",\n    },\n    \"MMK\": {\n        \"s\": \"MMK\",\n        \"n\": \"Myanma Kyat\",\n        \"sn\": \"K\",\n        \"d\": 0,\n        \"r\": 0,\n        \"np\": \"Myanma kyats\",\n    },\n    \"MNT\": {\n        \"s\": \"₮\",\n        \"n\": \"Mongolia Tughrik\",\n        \"sn\": \"₮\",\n        \"d\": 2,\n        \"r\": 0,\n        \"np\": \"Mongolia Tughrik\",\n    },\n    \"MOP\": {\n        \"s\": \"MOP$\",\n        \"n\": \"Macanese Pataca\",\n        \"sn\": \"MOP$\",\n        \"d\": 2,\n        \"r\": 0,\n        \"np\": \"Macanese patacas\",\n    },\n    \"MRO\": {\n        \"s\": \"UM\",\n        \"n\": \"Mauritanian ouguiya\",\n        \"sn\": \"UM\",\n        \"d\": 1,\n        \"r\": 0,\n        \"np\": \"Mauritanian ouguiya\",\n    },\n    \"MUR\": {\n        \"s\": \"MURs\",\n        \"n\": \"Mauritian Rupee\",\n        \"sn\": \"MURs\",\n        \"d\": 0,\n        \"r\": 0,\n        \"np\": \"Mauritian rupees\",\n    },\n    \"MVR\": {\n        \"s\": \"MRf\",\n        \"n\": \"Maldivian rufiyaa\",\n        \"sn\": \"Rf\",\n        \"d\": 2,\n        \"r\": 0,\n        \"np\": \"Maldivian rufiyaa\",\n    },\n    \"MWK\": {\n        \"s\": \"MK\",\n        \"n\": \"Malawian kwacha\",\n        \"sn\": \"MK\",\n        \"d\": 2,\n        \"r\": 0,\n        \"np\": \"Malawian kwacha\",\n    },\n    \"MXN\": {\n        \"s\": \"MX$\",\n        \"n\": \"Mexican Peso\",\n        \"sn\": \"$\",\n        \"d\": 2,\n        \"r\": 0,\n        \"np\": \"Mexican pesos\",\n    },\n    \"MXV\": {\n        \"s\": \"-\",\n        \"n\": \"Mexican Unidad de Inversion (UDI) (funds code)\",\n        \"sn\": \"-\",\n        \"d\": 2,\n        \"r\": 0,\n        \"np\": \"Mexican Unidad de Inversion (UDI) (funds code)\",\n    },\n    \"MYR\": {\n        \"s\": \"RM\",\n        \"n\": \"Malaysian Ringgit\",\n        \"sn\": \"RM\",\n        \"d\": 2,\n        \"r\": 0,\n        \"np\": \"Malaysian ringgits\",\n    },\n    \"MZN\": {\n        \"s\": \"MTn\",\n        \"n\": \"Mozambican Metical\",\n        \"sn\": \"MTn\",\n        \"d\": 2,\n        \"r\": 0,\n        \"np\": \"Mozambican meticals\",\n    },\n    \"NAD\": {\n        \"s\": \"N$\",\n        \"n\": \"Namibian Dollar\",\n        \"sn\": \"N$\",\n        \"d\": 2,\n        \"r\": 0,\n        \"np\": \"Namibian dollars\",\n    },\n    \"NGN\": {\n        \"s\": \"₦\",\n        \"n\": \"Nigerian Naira\",\n        \"sn\": \"₦\",\n        \"d\": 2,\n        \"r\": 0,\n        \"np\": \"Nigerian nairas\",\n    },\n    \"NIO\": {\n        \"s\": \"C$\",\n        \"n\": \"Nicaraguan Córdoba\",\n        \"sn\": \"C$\",\n        \"d\": 2,\n        \"r\": 0,\n        \"np\": \"Nicaraguan córdobas\",\n    },\n    \"NOK\": {\n        \"s\": \"Nkr\",\n        \"n\": \"Norwegian Krone\",\n        \"sn\": \"kr\",\n        \"d\": 2,\n        \"r\": 0,\n        \"np\": \"Norwegian kroner\",\n    },\n    \"NPR\": {\n        \"s\": \"NPRs\",\n        \"n\": \"Nepalese Rupee\",\n        \"sn\": \"नेरू\",\n        \"d\": 2,\n        \"r\": 0,\n        \"np\": \"Nepalese rupees\",\n    },\n    \"PRB\": {\n        \"s\": \"руб\",\n        \"n\": \"Transnistrian ruble\",\n        \"sn\": \"руб\",\n        \"d\": 2,\n        \"r\": 0,\n        \"np\": \"Transnistrian rubles\",\n    },\n    \"NZD\": {\n        \"s\": \"NZ$\",\n        \"n\": \"New Zealand Dollar\",\n        \"sn\": \"$\",\n        \"d\": 2,\n        \"r\": 0,\n        \"np\": \"New Zealand dollars\",\n    },\n    \"OMR\": {\n        \"s\": \"OMR\",\n        \"n\": \"Omani Rial\",\n        \"sn\": \"ر.ع.‏\",\n        \"d\": 3,\n        \"r\": 0,\n        \"np\": \"Omani rials\",\n    },\n    \"PAB\": {\n        \"s\": \"B/.\",\n        \"n\": \"Panamanian Balboa\",\n        \"sn\": \"B/.\",\n        \"d\": 2,\n        \"r\": 0,\n        \"np\": \"Panamanian balboas\",\n    },\n    \"PEN\": {\n        \"s\": \"S/.\",\n        \"n\": \"Peruvian Nuevo Sol\",\n        \"sn\": \"S/.\",\n        \"d\": 2,\n        \"r\": 0,\n        \"np\": \"Peruvian nuevos soles\",\n    },\n    \"PGK\": {\n        \"s\": \"K\",\n        \"n\": \"Papua New Guinean kina\",\n        \"sn\": \"K\",\n        \"d\": 2,\n        \"r\": 0,\n        \"np\": \"Papua New Guinean kina\",\n    },\n    \"PHP\": {\n        \"s\": \"₱\",\n        \"n\": \"Philippine Peso\",\n        \"sn\": \"₱\",\n        \"d\": 2,\n        \"r\": 0,\n        \"np\": \"Philippine pesos\",\n    },\n    \"PKR\": {\n        \"s\": \"PKRs\",\n        \"n\": \"Pakistani Rupee\",\n        \"sn\": \"₨\",\n        \"d\": 0,\n        \"r\": 0,\n        \"np\": \"Pakistani rupees\",\n    },\n    \"PLN\": {\n        \"s\": \"zł\",\n        \"n\": \"Polish Zloty\",\n        \"sn\": \"zł\",\n        \"d\": 2,\n        \"r\": 0,\n        \"np\": \"Polish zlotys\",\n    },\n    \"PYG\": {\n        \"s\": \"₲\",\n        \"n\": \"Paraguayan Guarani\",\n        \"sn\": \"₲\",\n        \"d\": 0,\n        \"r\": 0,\n        \"np\": \"Paraguayan guaranis\",\n    },\n    \"QAR\": {\n        \"s\": \"QR\",\n        \"n\": \"Qatari Rial\",\n        \"sn\": \"ر.ق.‏\",\n        \"d\": 2,\n        \"r\": 0,\n        \"np\": \"Qatari rials\",\n    },\n    \"RON\": {\n        \"s\": \"RON\",\n        \"n\": \"Romanian Leu\",\n        \"sn\": \"RON\",\n        \"d\": 2,\n        \"r\": 0,\n        \"np\": \"Romanian lei\",\n    },\n    \"RSD\": {\n        \"s\": \"din.\",\n        \"n\": \"Serbian Dinar\",\n        \"sn\": \"дин.\",\n        \"d\": 0,\n        \"r\": 0,\n        \"np\": \"Serbian dinars\",\n    },\n    \"RUB\": {\n        \"s\": \"RUB\",\n        \"n\": \"Russian Ruble\",\n        \"sn\": \"руб.\",\n        \"d\": 2,\n        \"r\": 0,\n        \"np\": \"Russian rubles\",\n    },\n    \"RWF\": {\n        \"s\": \"RWF\",\n        \"n\": \"Rwandan Franc\",\n        \"sn\": \"FR\",\n        \"d\": 0,\n        \"r\": 0,\n        \"np\": \"Rwandan francs\",\n    },\n    \"SAR\": {\n        \"s\": \"SR\",\n        \"n\": \"Saudi Riyal\",\n        \"sn\": \"ر.س.‏\",\n        \"d\": 2,\n        \"r\": 0,\n        \"np\": \"Saudi riyals\",\n    },\n    \"SBD\": {\n        \"s\": \"$\",\n        \"n\": \"Solomon Islands Dollar\",\n        \"sn\": \"$\",\n        \"d\": 2,\n        \"r\": 0,\n        \"np\": \"Solomon Islands Dollars\",\n    },\n    \"SCR\": {\n        \"s\": \"₨\",\n        \"n\": \"Seychelles Rupee\",\n        \"sn\": \"₨\",\n        \"d\": 2,\n        \"r\": 0,\n        \"np\": \"Seychelles Rupees\",\n    },\n    \"SDG\": {\n        \"s\": \"SDG\",\n        \"n\": \"Sudanese Pound\",\n        \"sn\": \"SDG\",\n        \"d\": 2,\n        \"r\": 0,\n        \"np\": \"Sudanese pounds\",\n    },\n    \"SEK\": {\n        \"s\": \"Skr\",\n        \"n\": \"Swedish Krona\",\n        \"sn\": \"kr\",\n        \"d\": 2,\n        \"r\": 0,\n        \"np\": \"Swedish kronor\",\n    },\n    \"SGD\": {\n        \"s\": \"S$\",\n        \"n\": \"Singapore Dollar\",\n        \"sn\": \"$\",\n        \"d\": 2,\n        \"r\": 0,\n        \"np\": \"Singapore dollars\",\n    },\n    \"SHP\": {\n        \"s\": \"£\",\n        \"n\": \"Saint Helena Pound\",\n        \"sn\": \"£\",\n        \"d\": 2,\n        \"r\": 0,\n        \"np\": \"Saint Helena Pounds\",\n    },\n    \"SLL\": {\n        \"s\": \"Le\",\n        \"n\": \"Sierra Leonean leone\",\n        \"sn\": \"Le\",\n        \"d\": 2,\n        \"r\": 0,\n        \"np\": \"Sierra Leonean leone\",\n    },\n    \"SOS\": {\n        \"s\": \"Ssh\",\n        \"n\": \"Somali Shilling\",\n        \"sn\": \"Ssh\",\n        \"d\": 0,\n        \"r\": 0,\n        \"np\": \"Somali shillings\",\n    },\n    \"SRD\": {\n        \"s\": \"$\",\n        \"n\": \"Suriname Dollar\",\n        \"sn\": \"$\",\n        \"d\": 2,\n        \"r\": 0,\n        \"np\": \"Suriname Dollars\",\n    },\n    \"SSP\": {\n        \"s\": \"SSP\",\n        \"n\": \"South Sudanese pound\",\n        \"sn\": \"SSP\",\n        \"d\": 2,\n        \"r\": 0,\n        \"np\": \"South Sudanese pound\",\n    },\n    \"STD\": {\n        \"s\": \"Db\",\n        \"n\": \"São Tomé and Príncipe dobra\",\n        \"sn\": \"Db\",\n        \"d\": 2,\n        \"r\": 0,\n        \"np\": \"São Tomé and Príncipe dobra\",\n    },\n    \"SVC\": {\n        \"s\": \"$\",\n        \"n\": \"El Salvador Colon\",\n        \"sn\": \"$\",\n        \"d\": 0,\n        \"r\": 0,\n        \"np\": \"El Salvador Colon\",\n    },\n    \"SYP\": {\n        \"s\": \"SY£\",\n        \"n\": \"Syrian Pound\",\n        \"sn\": \"ل.س.‏\",\n        \"d\": 0,\n        \"r\": 0,\n        \"np\": \"Syrian pounds\",\n    },\n    \"SZL\": {\n        \"s\": \"L\",\n        \"n\": \"Swazi lilangeni\",\n        \"sn\": \"L\",\n        \"d\": 2,\n        \"r\": 0,\n        \"np\": \"Swazi lilangeni\",\n    },\n    \"THB\": {\n        \"s\": \"฿\",\n        \"n\": \"Thai Baht\",\n        \"sn\": \"฿\",\n        \"d\": 2,\n        \"r\": 0,\n        \"np\": \"Thai baht\",\n    },\n    \"TJS\": {\n        \"s\": \"-\",\n        \"n\": \"Tajikistani somoni\",\n        \"sn\": \"-\",\n        \"d\": 2,\n        \"r\": 0,\n        \"np\": \"Tajikistani somoni\",\n    },\n    \"TMT\": {\n        \"s\": \"T\",\n        \"n\": \"Turkmenistan manat\",\n        \"sn\": \"T\",\n        \"d\": 2,\n        \"r\": 0,\n        \"np\": \"Turkmenistan manat\",\n    },\n    \"TND\": {\n        \"s\": \"DT\",\n        \"n\": \"Tunisian Dinar\",\n        \"sn\": \"د.ت.‏\",\n        \"d\": 3,\n        \"r\": 0,\n        \"np\": \"Tunisian dinars\",\n    },\n    \"TOP\": {\n        \"s\": \"T$\",\n        \"n\": \"Tongan Paʻanga\",\n        \"sn\": \"T$\",\n        \"d\": 2,\n        \"r\": 0,\n        \"np\": \"Tongan paʻanga\",\n    },\n    \"TRY\": {\n        \"s\": \"TL\",\n        \"n\": \"Turkish Lira\",\n        \"sn\": \"TL\",\n        \"d\": 2,\n        \"r\": 0,\n        \"np\": \"Turkish Lira\",\n    },\n    \"TTD\": {\n        \"s\": \"TT$\",\n        \"n\": \"Trinidad and Tobago Dollar\",\n        \"sn\": \"$\",\n        \"d\": 2,\n        \"r\": 0,\n        \"np\": \"Trinidad and Tobago dollars\",\n    },\n    \"TVD\": {\n        \"s\": \"$\",\n        \"n\": \"Tuvalu Dollar\",\n        \"sn\": \"$\",\n        \"d\": 2,\n        \"r\": 0,\n        \"np\": \"Tuvalu Dollars\",\n    },\n    \"TWD\": {\n        \"s\": \"NT$\",\n        \"n\": \"New Taiwan Dollar\",\n        \"sn\": \"NT$\",\n        \"d\": 2,\n        \"r\": 0,\n        \"np\": \"New Taiwan dollars\",\n    },\n    \"TZS\": {\n        \"s\": \"TSh\",\n        \"n\": \"Tanzanian Shilling\",\n        \"sn\": \"TSh\",\n        \"d\": 0,\n        \"r\": 0,\n        \"np\": \"Tanzanian shillings\",\n    },\n    \"UAH\": {\n        \"s\": \"₴\",\n        \"n\": \"Ukrainian Hryvnia\",\n        \"sn\": \"₴\",\n        \"d\": 2,\n        \"r\": 0,\n        \"np\": \"Ukrainian hryvnias\",\n    },\n    \"UGX\": {\n        \"s\": \"USh\",\n        \"n\": \"Ugandan Shilling\",\n        \"sn\": \"USh\",\n        \"d\": 0,\n        \"r\": 0,\n        \"np\": \"Ugandan shillings\",\n    },\n    \"USD\": {\n        \"s\": \"$\",\n        \"n\": \"US Dollar\",\n        \"sn\": \"$\",\n        \"d\": 2,\n        \"r\": 0,\n        \"np\": \"US dollars\",\n    },\n    \"USN\": {\n        \"s\": \"$\",\n        \"n\": \"United States dollar (next day) (funds code)\",\n        \"sn\": \"$\",\n        \"d\": 2,\n        \"r\": 0,\n        \"np\": \"United States dollars (next day) (funds code)\",\n    },\n    \"UYI\": {\n        \"s\": \"UYI\",\n        \"n\": \"Uruguay Peso en Unidades Indexadas (URUIURUI) (funds code)\",\n        \"sn\": \"UYI\",\n        \"d\": 0,\n        \"r\": 0,\n        \"np\": \"Uruguay Peso en Unidades Indexadas (URUIURUI) (funds code)\",\n    },\n    \"UYU\": {\n        \"s\": \"$U\",\n        \"n\": \"Uruguayan Peso\",\n        \"sn\": \"$\",\n        \"d\": 2,\n        \"r\": 0,\n        \"np\": \"Uruguayan pesos\",\n    },\n    \"UZS\": {\n        \"s\": \"UZS\",\n        \"n\": \"Uzbekistan Som\",\n        \"sn\": \"UZS\",\n        \"d\": 0,\n        \"r\": 0,\n        \"np\": \"Uzbekistan som\",\n    },\n    \"VEF\": {\n        \"s\": \"Bs.F.\",\n        \"n\": \"Venezuelan Bolívar\",\n        \"sn\": \"Bs.F.\",\n        \"d\": 2,\n        \"r\": 0,\n        \"np\": \"Venezuelan bolívars\",\n    },\n    \"VND\": {\n        \"s\": \"₫\",\n        \"n\": \"Vietnamese Dong\",\n        \"sn\": \"₫\",\n        \"d\": 0,\n        \"r\": 0,\n        \"np\": \"Vietnamese dong\",\n    },\n    \"VUV\": {\n        \"s\": \"VT\",\n        \"n\": \"Vanuatu vatu\",\n        \"sn\": \"VT\",\n        \"d\": 0,\n        \"r\": 0,\n        \"np\": \"Vanuatu vatu\",\n    },\n    \"WST\": {\n        \"s\": \"WS$\",\n        \"n\": \"Samoan tala\",\n        \"sn\": \"$\",\n        \"d\": 2,\n        \"r\": 0,\n        \"np\": \"Samoan tala\",\n    },\n    \"XAF\": {\n        \"s\": \"FCFA\",\n        \"n\": \"CFA Franc BEAC\",\n        \"sn\": \"FCFA\",\n        \"d\": 0,\n        \"r\": 0,\n        \"np\": \"CFA francs BEAC\",\n    },\n    \"XAG\": {\n        \"s\": \"XAG\",\n        \"n\": \"Silver (one troy ounce)\",\n        \"sn\": \"XAG\",\n        \"d\": 0,\n        \"r\": 0,\n        \"np\": \"Silver (one troy ounce)\",\n    },\n    \"XAU\": {\n        \"s\": \"XAU\",\n        \"n\": \"Gold (one troy ounce)\",\n        \"sn\": \"XAU\",\n        \"d\": 0,\n        \"r\": 0,\n        \"np\": \"Gold (one troy ounce)\",\n    },\n    \"XBA\": {\n        \"s\": \"XBA\",\n        \"n\": \"European Composite Unit (EURCO) (bond market unit)\",\n        \"sn\": \"XBA\",\n        \"d\": 0,\n        \"r\": 0,\n        \"np\": \"European Composite Unit (EURCO) (bond market unit)\",\n    },\n    \"XBB\": {\n        \"s\": \"XBB\",\n        \"n\": \"European Monetary Unit (E.M.U.-6) (bond market unit)\",\n        \"sn\": \"XBB\",\n        \"d\": 0,\n        \"r\": 0,\n        \"np\": \"European Monetary Unit (E.M.U.-6) (bond market unit)\",\n    },\n    \"XBC\": {\n        \"s\": \"XBC\",\n        \"n\": \"European Unit of Account 9 (E.U.A.-9) (bond market unit)\",\n        \"sn\": \"XBC\",\n        \"d\": 0,\n        \"r\": 0,\n        \"np\": \"European Unit of Account 9 (E.U.A.-9) (bond market unit)\",\n    },\n    \"XBD\": {\n        \"s\": \"XBD\",\n        \"n\": \"European Unit of Account 17 (E.U.A.-17) (bond market unit)\",\n        \"sn\": \"XBD\",\n        \"d\": 0,\n        \"r\": 0,\n        \"np\": \"European Unit of Account 17 (E.U.A.-17) (bond market unit)\",\n    },\n    \"XCD\": {\n        \"s\": \"$\",\n        \"n\": \"East Caribbean Dollar\",\n        \"sn\": \"$\",\n        \"d\": 0,\n        \"r\": 0,\n        \"np\": \"East Caribbean Dollars\",\n    },\n    \"XDR\": {\n        \"s\": \"XDR\",\n        \"n\": \"Special drawing rights\",\n        \"sn\": \"XDR\",\n        \"d\": 0,\n        \"r\": 0,\n        \"np\": \"Special drawing rights\",\n    },\n    \"XOF\": {\n        \"s\": \"CFA\",\n        \"n\": \"CFA Franc BCEAO\",\n        \"sn\": \"CFA\",\n        \"d\": 0,\n        \"r\": 0,\n        \"np\": \"CFA francs BCEAO\",\n    },\n    \"XPD\": {\n        \"s\": \"XPD\",\n        \"n\": \"Palladium (one troy ounce)\",\n        \"sn\": \"XPD\",\n        \"d\": 0,\n        \"r\": 0,\n        \"np\": \"Palladium (one troy ounce)\",\n    },\n    \"XPF\": {\n        \"s\": \"CFP\",\n        \"n\": \"CFP franc (franc Pacifique)\",\n        \"sn\": \"CFP\",\n        \"d\": 0,\n        \"r\": 0,\n        \"np\": \"CFP franc (franc Pacifique)\",\n    },\n    \"XPT\": {\n        \"s\": \"XPT\",\n        \"n\": \"Platinum (one troy ounce)\",\n        \"sn\": \"XPT\",\n        \"d\": 0,\n        \"r\": 0,\n        \"np\": \"Platinum (one troy ounce)\",\n    },\n    \"XSU\": {\n        \"s\": \"Sucre\",\n        \"n\": \"SUCRE\",\n        \"sn\": \"Sucre\",\n        \"d\": 0,\n        \"r\": 0,\n        \"np\": \"SUCRE\",\n    },\n    \"XTS\": {\n        \"s\": \"XTS\",\n        \"n\": \"Code reserved for testing purposes\",\n        \"sn\": \"XTS\",\n        \"d\": 0,\n        \"r\": 0,\n        \"np\": \"Code reserved for testing purposes\",\n    },\n    \"XUA\": {\n        \"s\": \"XUA\",\n        \"n\": \"ADB Unit of Account\",\n        \"sn\": \"XUA\",\n        \"d\": 0,\n        \"r\": 0,\n        \"np\": \"ADB Unit of Account\",\n    },\n    \"XXX\": {\n        \"s\": \"XXX\",\n        \"n\": \"No currency\",\n        \"sn\": \"XXX\",\n        \"d\": 0,\n        \"r\": 0,\n        \"np\": \"No currency\",\n    },\n    \"YER\": {\n        \"s\": \"YR\",\n        \"n\": \"Yemeni Rial\",\n        \"sn\": \"ر.ي.‏\",\n        \"d\": 0,\n        \"r\": 0,\n        \"np\": \"Yemeni rials\",\n    },\n    \"ZAR\": {\n        \"s\": \"R\",\n        \"n\": \"South African Rand\",\n        \"sn\": \"R\",\n        \"d\": 2,\n        \"r\": 0,\n        \"np\": \"South African rand\",\n    },\n    \"ZMK\": {\n        \"s\": \"ZK\",\n        \"n\": \"Zambian Kwacha\",\n        \"sn\": \"ZK\",\n        \"d\": 0,\n        \"r\": 0,\n        \"np\": \"Zambian kwachas\",\n    },\n    \"ZMW\": {\n        \"s\": \"ZK\",\n        \"n\": \"Zambian kwacha\",\n        \"sn\": \"ZK\",\n        \"d\": 2,\n        \"r\": 0,\n        \"np\": \"Zambian kwacha\",\n    },\n    \"ZWD\": {\n        \"s\": \"Z$\",\n        \"n\": \"Zimbabwe Dollar\",\n        \"sn\": \"Z$\",\n        \"d\": 2,\n        \"r\": 0,\n        \"np\": \"Zimbabwe Dollars\",\n    },\n    \"ZWL\": {\n        \"s\": \"$\",\n        \"n\": \"Zimbabwean dollar A/10\",\n        \"sn\": \"$\",\n        \"d\": 2,\n        \"r\": 0,\n        \"np\": \"Zimbabwean dollars A/10\",\n    },\n}\n\n\n# Commonly used unofficial names.\n# See also: https://en.wikipedia.org/wiki/ISO_4217#Unofficial_currency_codes\nCURRENCIES[\"NTD\"] = CURRENCIES[\"TWD\"]\nCURRENCIES[\"RMB\"] = CURRENCIES[\"CNY\"]\n\n\nREPLACED_BY_EURO: dict[str, CurrencyInfo] = {\n    \"ATS\": {\n        \"s\": \"öS\",\n        \"n\": \"Austrian schilling\",\n        \"sn\": \"öS\",\n        \"d\": 2,\n        \"r\": 0,\n        \"np\": \"Austrian schilling\",\n    },\n    \"BEF\": {\n        \"s\": \"fr.\",\n        \"n\": \"Belgian franc\",\n        \"sn\": \"fr.\",\n        \"d\": 2,\n        \"r\": 0,\n        \"np\": \"Belgian francs\",\n    },\n    \"CYP\": {\n        \"s\": \"CYP\",\n        \"n\": \"Cypriot pound\",\n        \"sn\": \"£\",\n        \"d\": 2,\n        \"r\": 0,\n        \"np\": \"Cypriot pounds\",\n    },\n    \"DEM\": {\n        \"s\": \"DM\",\n        \"n\": \"Deutsche Mark\",\n        \"sn\": \"D-Mark\",\n        \"d\": 2,\n        \"r\": 0,\n        \"np\": \"Deutsche marks\",\n    },\n    \"NLG\": {\n        \"s\": \"fl.\",\n        \"n\": \"Dutch guilder\",\n        \"sn\": \"ƒ\",\n        \"d\": 2,\n        \"r\": 0,\n        \"np\": \"Dutch guilders\",\n    },\n    \"EEK\": {\n        \"s\": \"kr\",\n        \"n\": \"Estonian kroon\",\n        \"sn\": \"kroon\",\n        \"d\": 2,\n        \"r\": 0,\n        \"np\": \"Estonian krooni\",\n    },\n    \"FIM\": {\n        \"s\": \"FIM\",\n        \"n\": \"Finnish markka\",\n        \"sn\": \"mk.\",\n        \"d\": 2,\n        \"r\": 0,\n        \"np\": \"Finnish markkaa\",\n    },\n    \"FRF\": {\n        \"s\": \"F\",\n        \"n\": \"French franc\",\n        \"sn\": \"₣\",\n        \"d\": 2,\n        \"r\": 0,\n        \"np\": \"French francs\",\n    },\n    \"GRD\": {\n        \"s\": \"GRD\",\n        \"n\": \"Greek drachma\",\n        \"sn\": \"Δρχ.\",\n        \"sn2\": [\"Δρ.\", \"₯\"],\n        \"d\": 2,\n        \"r\": 0,\n        \"np\": \"Greek drachmae\",\n    },\n    \"IEP\": {\n        \"s\": \"IR£\",\n        \"n\": \"Irish pound\",\n        \"sn\": \"£\",\n        \"d\": 2,\n        \"r\": 0,\n        \"np\": \"Irish pounds\",\n    },\n    \"ITL\": {\n        \"s\": \"L\",\n        \"n\": \"Italian lira\",\n        \"sn\": \"₤\",\n        \"d\": 0,\n        \"r\": 0,\n        \"np\": \"Italian lire\",\n    },\n    \"LVL\": {\n        \"s\": \"Ls\",\n        \"n\": \"Latvian lats\",\n        \"sn\": \"LVL\",\n        \"d\": 2,\n        \"r\": 0,\n        \"np\": \"Latvian lati\",\n    },\n    \"LTL\": {\n        \"s\": \"Lt\",\n        \"n\": \"Lithuanian litas\",\n        \"sn\": \"LTL\",\n        \"sn2\": [\"litų\"],\n        \"d\": 2,\n        \"r\": 0,\n        \"np\": \"Lithuanian litai\",\n    },\n    \"LUF\": {\n        \"s\": \"F\",\n        \"n\": \"Luxembourgish franc\",\n        \"sn\": \"LUF\",\n        \"d\": 2,\n        \"r\": 0,\n        \"np\": \"Luxembourgish francs\",\n    },\n    \"MTL\": {\n        \"s\": \"Lm\",\n        \"n\": \"Maltese lira\",\n        \"sn\": \"₤\",\n        \"d\": 2,\n        \"r\": 0,\n        \"np\": \"Maltese liri\",\n    },\n    \"PTE\": {\n        \"s\": \"$\",\n        \"n\": \"Portuguese escudo\",\n        \"sn\": \"$\",\n        \"d\": 2,\n        \"r\": 0,\n        \"np\": \"Portuguese escudos\",\n    },\n    \"SKK\": {\n        \"s\": \"SKK\",\n        \"n\": \"Slovak koruna\",\n        \"sn\": \"Sk\",\n        \"d\": 2,\n        \"r\": 0,\n        \"np\": \"Slovak Koruny\",\n    },\n    \"SIT\": {\n        \"s\": \"SIT\",\n        \"n\": \"Slovenian tolar\",\n        \"sn\": \"SIT\",\n        \"sn2\": [\"tolarjev\"],\n        \"d\": 2,\n        \"r\": 0,\n        \"np\": \"Slovenian tolar\",\n    },\n    \"ESP\": {\n        \"s\": \"Pta\",\n        \"n\": \"Spanish peseta\",\n        \"sn\": \"Ptas\",\n        \"sn2\": [\"₧\", \"Pts\", \"Pt\"],\n        \"d\": 0,\n        \"r\": 0,\n        \"np\": \"Spanish pesetas\",\n    },\n    \"VAL\": {\n        \"s\": \"£\",\n        \"n\": \"Vatican lira\",\n        \"sn\": \"₤\",\n        \"d\": 0,\n        \"r\": 0,\n        \"np\": \"Vatican liri\",\n    },\n}\n\n# updates\nCURRENCIES.update(REPLACED_BY_EURO)\nCURRENCIES[\"VND\"][\"sn2\"] = [\"đ\"]\nCURRENCIES[\"RON\"][\"sn2\"] = [\"lei\", \"leu\", \"Lei\", \"LEI\"]\nCURRENCIES[\"CHF\"][\"sn2\"] = [\"Fr.\"]\nCURRENCIES[\"PLN\"][\"sn2\"] = [\"pln\"]\nCURRENCIES[\"INR\"][\"sn2\"] = [\"₹\", \"र\"]\nCURRENCIES[\"IRR\"][\"sn2\"] = [\"ریال\"]\n\n\nCURRENCY_CODES: list[str] = list(CURRENCIES.keys())\nCURRENCY_SYMBOLS: list[str] = list({c[\"s\"] for c in CURRENCIES.values()})\nCURRENCY_NATIONAL_SYMBOLS: list[str] = list(\n    {c[\"sn\"] for c in CURRENCIES.values()}\n    | set(chain.from_iterable(c[\"sn2\"] for c in CURRENCIES.values() if \"sn2\" in c))\n)\n"
  },
  {
    "path": "price_parser/parser.py",
    "content": "import re\nimport string\nfrom decimal import Decimal, InvalidOperation\nfrom re import Pattern\nfrom typing import Callable, Optional\n\nimport attr\n\nfrom ._currencies import CURRENCY_CODES, CURRENCY_NATIONAL_SYMBOLS, CURRENCY_SYMBOLS\n\n\n@attr.s(auto_attribs=True)\nclass Price:\n    amount: Optional[Decimal]  # price numeric value, as Decimal\n    currency: Optional[str]  # currency symbol (as appeared in text)\n\n    # price value, as a raw string\n    amount_text: Optional[str] = attr.ib(repr=False)\n\n    @property\n    def amount_float(self) -> Optional[float]:\n        \"\"\"price numeric value, as float\"\"\"\n        if self.amount is not None:\n            return float(self.amount)\n        return None\n\n    @classmethod\n    def fromstring(\n        cls,\n        price: Optional[str],\n        currency_hint: Optional[str] = None,\n        decimal_separator: Optional[str] = None,\n        digit_group_separator: Optional[str] = None,\n    ) -> \"Price\":\n        \"\"\"\n        Given price and currency text extracted from HTML elements, return\n        ``Price`` instance, which provides a clean currency symbol and\n        price amount as a Decimal number.\n\n        ``currency_hint`` is optional; you can pass value of some element\n        which may contain currency, as a hint. If currency is present in\n        ``price`` string, it could be **preferred** over a value extracted\n        from ``currency_hint`` string.\n\n        ``decimal_separator`` is optional; it is used to determine the\n        decimal separator in price. If ``decimal_separator`` is ``None``,\n        then it is guessed from ``price`` string. If ``decimal_separator``\n        is ``\".\"``, then ``1.000`` is parsed as ``1``. If it is ``,```,\n        then ``1.000`` is parsed as ``1000``.\n\n        ``digit_group_separator`` is optional; it is used to determine the\n        digit group separator in price. If ``digit_group_separator`` is\n        ``None``, then it is guessed from ``price`` string. If\n        ``digit_group_separator`` is ``\".\"``, then ``1.000`` is parsed as\n        ``1000``. If it is ``,``, then ``1.000`` is parsed as ``1``.\n        \"\"\"\n        currency = extract_currency_symbol(price, currency_hint)\n        if currency is not None:\n            currency = currency.strip()\n        if digit_group_separator is not None and price is not None:\n            price = price.replace(digit_group_separator, \"\")\n        amount_text = extract_price_text(price) if price is not None else None\n        amount_num = (\n            parse_number(amount_text, decimal_separator)\n            if amount_text is not None\n            else None\n        )\n        return Price(\n            amount=amount_num,\n            currency=currency,\n            amount_text=amount_text,\n        )\n\n\nparse_price = Price.fromstring\n\n\ndef or_regex(symbols: list[str]) -> Pattern[str]:\n    \"\"\"Return a regex which matches any of ``symbols``\"\"\"\n    return re.compile(\"|\".join(re.escape(s) for s in symbols))\n\n\n# If one of these symbols is found either in price or in currency,\n# it is considered currency symbol, and returned as a currency, regardless\n# of its position in text.\nSAFE_CURRENCY_SYMBOLS = [\n    # Variants of $, etc. They need to be before $.\n    \"Bds$\",\n    \"CUC$\",\n    \"MOP$\",\n    \"AR$\",\n    \"AU$\",\n    \"BN$\",\n    \"BZ$\",\n    \"CA$\",\n    \"CL$\",\n    \"CO$\",\n    \"CV$\",\n    \"HK$\",\n    \"MX$\",\n    \"NT$\",\n    \"NZ$\",\n    \"TT$\",\n    \"RD$\",\n    \"WS$\",\n    \"US$\",\n    \"$U\",\n    \"C$\",\n    \"J$\",\n    \"N$\",\n    \"R$\",\n    \"S$\",\n    \"T$\",\n    \"Z$\",\n    \"A$\",\n    \"SY£\",\n    \"LB£\",\n    \"CN¥\",\n    \"GH₵\",\n    # unique currency symbols\n    \"$\",\n    \"€\",\n    \"£\",\n    \"zł\",\n    \"Zł\",\n    \"Kč\",\n    \"₽\",\n    \"¥\",\n    \"￥\",\n    \"฿\",\n    \"դր.\",\n    \"դր\",\n    \"₦\",\n    \"₴\",\n    \"₱\",\n    \"৳\",\n    \"₭\",\n    \"₪\",\n    \"﷼\",\n    \"៛\",\n    \"₩\",\n    \"₫\",\n    \"₡\",\n    \"টকা\",\n    \"ƒ\",\n    \"₲\",\n    \"؋\",\n    \"₮\",\n    \"नेरू\",\n    \"₨\",\n    \"₶\",\n    \"₾\",\n    \"֏\",\n    \"ރ\",\n    \"৲\",\n    \"૱\",\n    \"௹\",\n    \"₠\",\n    \"₢\",\n    \"₣\",\n    \"₤\",\n    \"₧\",\n    \"₯\",\n    \"₰\",\n    \"₳\",\n    \"₷\",\n    \"₸\",\n    \"₹\",\n    \"₺\",\n    \"₼\",\n    \"₾\",\n    \"₿\",\n    \"ℳ\",\n    \"ر.ق.\\u200f\",\n    \"د.ك.\\u200f\",\n    \"د.ع.\\u200f\",\n    \"ر.ع.\\u200f\",\n    \"ر.ي.\\u200f\",\n    \"ر.س.\\u200f\",\n    \"د.ج.\\u200f\",\n    \"د.م.\\u200f\",\n    \"د.إ.\\u200f\",\n    \"د.ت.\\u200f\",\n    \"د.ل.\\u200f\",\n    \"ل.س.\\u200f\",\n    \"د.ب.\\u200f\",\n    \"د.أ.\\u200f\",\n    \"ج.م.\\u200f\",\n    \"ل.ل.\\u200f\",\n    \" تومان\",\n    \"تومان\",\n    \"درهم\",\n    \"ريال\",\n    \"جنيه\",\n    # other common symbols, which we consider unambiguous\n    \"EUR\",\n    \"euro\",\n    \"eur\",\n    \"CHF\",\n    \"DKK\",\n    \"Rp\",\n    \"lei\",\n    \"руб.\",\n    \"руб\",\n    \"грн.\",\n    \"грн\",\n    \"дин.\",\n    \"Dinara\",\n    \"динар\",\n    \"лв.\",\n    \"лв\",\n    \"р.\",\n    \"тңг\",\n    \"тңг.\",\n    \"ман.\",\n]\n\n# \"D\" in some abbreviations means \"dollar\", and so currency\n# can be written as SGD$123 or NZD $123. Currency code should take priority\n# over $ symbol in this case.\nDOLLAR_CODES = [k for k in CURRENCY_CODES if k.endswith(\"D\")]\n_DOLLAR_REGEX = re.compile(\n    r\"\"\"\n        \\b\n        (?:{})  # currency code like NZD\n        (?=\n            \\$?  # dollar sign to ignore if attached to the currency code\n            (?:[\\W\\d]|$)  # not a letter\n        )\n    \"\"\".format(\"|\".join(re.escape(k) for k in DOLLAR_CODES)),\n    re.VERBOSE,\n)\n\n\n# Other common currency symbols: 3-letter codes, less safe abbreviations\nOTHER_CURRENCY_SYMBOLS_SET = (\n    set(\n        CURRENCY_CODES\n        + CURRENCY_SYMBOLS\n        + CURRENCY_NATIONAL_SYMBOLS\n        +\n        # even if they appear in text, currency is likely to be rouble\n        [\"р\", \"Р\"]\n    )\n    - set(SAFE_CURRENCY_SYMBOLS)  # already handled\n    - {\"-\", \"XXX\"}  # placeholder values\n    - set(string.ascii_uppercase)  # very unreliable on their own\n)\nOTHER_CURRENCY_SYMBOLS = sorted(OTHER_CURRENCY_SYMBOLS_SET, key=len, reverse=True)\n\n_search_dollar_code = _DOLLAR_REGEX.search\n_search_safe_currency = or_regex(SAFE_CURRENCY_SYMBOLS).search\n_search_unsafe_currency = or_regex(OTHER_CURRENCY_SYMBOLS).search\n\n\ndef extract_currency_symbol(\n    price: Optional[str], currency_hint: Optional[str]\n) -> Optional[str]:\n    \"\"\"\n    Guess currency symbol from extracted price and currency strings.\n    Return an empty string if symbol is not found.\n    \"\"\"\n    methods: list[tuple[Callable[[str], Optional[re.Match[str]]], Optional[str]]] = [\n        (_search_safe_currency, price),\n        (_search_safe_currency, currency_hint),\n        (_search_unsafe_currency, price),\n        (_search_unsafe_currency, currency_hint),\n    ]\n\n    if currency_hint and \"$\" in currency_hint:\n        methods.insert(0, (_search_dollar_code, currency_hint))\n\n    if price and \"$\" in price:\n        methods.insert(0, (_search_dollar_code, price))\n\n    for meth, value in methods:\n        m = meth(value) if value else None\n        if m:\n            return m.group(0)\n\n    return None\n\n\ndef extract_price_text(price: str) -> Optional[str]:\n    r\"\"\"\n    Extract text of a price from a string which contains price and\n    maybe some other text. If multiple price-looking substrings are present,\n    the first is returned (FIXME: it is better to return a number\n    which is near a currency symbol).\n\n    >>> extract_price_text(\"price: $12.99\")\n    '12.99'\n    >>> extract_price_text(\"Free\")\n    '0'\n    >>> extract_price_text(\"Foo\")\n    >>> extract_price_text(\"1,235 USD\")\n    '1,235'\n\n    In addition to numbers, it has a limited support for a case where\n    currency symbol (currently only euro) is a decimal separator:\n\n    >>> extract_price_text(\"99 €, 79 €\")\n    '99'\n    >>> extract_price_text(\"99 € 79 €\")\n    '99'\n    >>> extract_price_text(\"35€ 99\")\n    '35€99'\n    >>> extract_price_text(\"35€ 999\")\n    '35'\n    >>> extract_price_text(\"1,235€ 99\")\n    '1,235€99'\n    >>> extract_price_text(\"50% OFF\")\n    >>> extract_price_text(\"50%\")\n    >>> extract_price_text(\"50\")\n    '50'\n    >>> extract_price_text(\"$1\\xa0298,00\")\n    '1 298,00'\n    >>> extract_price_text(\"$.75\")\n    '.75'\n    \"\"\"\n    price = re.sub(\n        r\"\\s+\", \" \", price\n    )  # clean initial text from non-breaking and extra spaces\n\n    if price.count(\"€\") == 1:\n        m = re.search(\n            r\"\"\"\n        [\\d\\s.,']*?\\d    # number, probably with thousand separators\n        \\s*?€(\\s*?)?    # euro, probably separated by whitespace\n        \\d(?(1)\\d|\\d*?)  # if separated by whitespace - search one digit,\n                         # multiple digits otherwise\n        (?:$|[^\\d])     # something which is not a digit\n        \"\"\",\n            price,\n            re.VERBOSE,\n        )\n        if m:\n            return m.group(0).replace(\" \", \"\")\n\n    m = re.search(\n        r\"\"\"\n        ([.]?\\d[\\d\\s.,']*)   # number, probably with thousand separators\n        \\s*?                # skip whitespace\n        (?:[^%\\d]|$)        # capture next symbol - it shouldn't be %\n        \"\"\",\n        price,\n        re.VERBOSE,\n    )\n\n    if m:\n        price_text = m.group(1).rstrip(\",.\")\n        price_text = price_text.replace(\"'\", \"\")\n        return (\n            price_text.strip()\n            if price_text.count(\".\") == 1\n            else price_text.lstrip(\",.\").strip()\n        )\n    if \"free\" in price.lower():\n        return \"0\"\n    return None\n\n\n# NOTE: Keep supported separators in sync with parse_number()\n_search_decimal_sep = re.compile(\n    r\"\"\"\n\\d*          # null or more digits (there can be more before it)\n([.,€])      # decimal separator\n(?:          # 1,2 or 4+ digits. 3 digits is likely to be a thousand separator.\n   \\d{1,2}?|\n   \\d{4}\\d*?\n)\n$\n\"\"\",\n    re.VERBOSE,\n).search\n\n\ndef get_decimal_separator(price: str) -> Optional[str]:\n    \"\"\"Return decimal separator symbol or None if there\n    is no decimal separator.\n\n    >>> get_decimal_separator(\"1000\")\n    >>> get_decimal_separator(\"12.99\")\n    '.'\n    >>> get_decimal_separator(\"12,99\")\n    ','\n    >>> get_decimal_separator(\"12.999\")\n    >>> get_decimal_separator(\"3,0000\")\n    ','\n    >>> get_decimal_separator(\"1,235€99\")\n    '€'\n    >>> get_decimal_separator(\".75\")\n    '.'\n    \"\"\"\n    m = _search_decimal_sep(price)\n    if m:\n        return m.group(1)\n    return None\n\n\ndef parse_number(\n    num: str, decimal_separator: Optional[str] = None\n) -> Optional[Decimal]:\n    \"\"\"Parse a string with a number to a Decimal, guessing its format:\n    decimal separator, thousand separator. Return None if parsing fails.\n\n    >>> parse_number(\"1,234\")\n    Decimal('1234')\n    >>> parse_number(\"12,34\")\n    Decimal('12.34')\n    >>> parse_number(\"12,345\")\n    Decimal('12345')\n    >>> parse_number(\"1,1\")\n    Decimal('1.1')\n    >>> parse_number(\"1.1\")\n    Decimal('1.1')\n    >>> parse_number(\"1234\")\n    Decimal('1234')\n    >>> parse_number(\"12€34\")\n    Decimal('12.34')\n    >>> parse_number(\"12€ 34\")\n    Decimal('12.34')\n    >>> parse_number(\"1 234.99\")\n    Decimal('1234.99')\n    >>> parse_number(\"1,235€99\")\n    Decimal('1235.99')\n    >>> parse_number(\"1 235€99\")\n    Decimal('1235.99')\n    >>> parse_number(\"1.235€99\")\n    Decimal('1235.99')\n    >>> parse_number(\"140.000\", decimal_separator=\",\")\n    Decimal('140000')\n    >>> parse_number(\"140.000\", decimal_separator=\".\")\n    Decimal('140.000')\n    >>> parse_number(\"\")\n    >>> parse_number(\"foo\")\n    \"\"\"\n    if not num:\n        return None\n    num = num.strip().replace(\" \", \"\")\n    decimal_separator = decimal_separator or get_decimal_separator(num)\n    # NOTE: Keep supported separators in sync with _search_decimal_sep\n    if decimal_separator is None:\n        num = num.replace(\".\", \"\").replace(\",\", \"\")\n    elif decimal_separator == \".\":\n        num = num.replace(\",\", \"\")\n    elif decimal_separator == \",\":\n        num = num.replace(\".\", \"\").replace(\",\", \".\")\n    else:\n        assert decimal_separator == \"€\"\n        num = num.replace(\".\", \"\").replace(\",\", \"\").replace(\"€\", \".\")\n    try:\n        return Decimal(num)\n    except InvalidOperation:\n        return None\n"
  },
  {
    "path": "price_parser/py.typed",
    "content": ""
  },
  {
    "path": "pyproject.toml",
    "content": "[build-system]\nrequires = [\"hatchling>=1.27.0\"]\nbuild-backend = \"hatchling.build\"\n\n[project]\nname = \"price-parser\"\nversion = \"0.5.1\"\ndescription = \"Extract price and currency from a raw string\"\nreadme = \"README.rst\"\nlicense = \"BSD-3-Clause\"\nlicense-files = [\"LICENSE\"]\nauthors = [\n    { name = \"Mikhail Korobov\", email = \"kmike84@gmail.com\" },\n]\nclassifiers = [\n    \"Development Status :: 4 - Beta\",\n    \"Intended Audience :: Developers\",\n    \"Natural Language :: English\",\n    \"Operating System :: OS Independent\",\n    \"Programming Language :: Python :: 3\",\n    \"Programming Language :: Python :: 3.9\",\n    \"Programming Language :: Python :: 3.10\",\n    \"Programming Language :: Python :: 3.11\",\n    \"Programming Language :: Python :: 3.12\",\n    \"Programming Language :: Python :: 3.13\",\n    \"Programming Language :: Python :: 3.14\",\n]\ndependencies = [\n    \"attrs >= 17.3.0\",\n]\nrequires-python = \">=3.9\"\n\n[project.urls]\nHomepage = \"https://github.com/scrapinghub/price-parser\"\nSource = \"https://github.com/scrapinghub/price-parser\"\nTracker = \"https://github.com/scrapinghub/price-parser/issues\"\n\n[tool.bumpversion]\ncommit = true\ntag = true\ntag_name = \"{new_version}\"\n\n[[tool.bumpversion.files]]\nfilename = 'CHANGES.rst'\nsearch = \"\\\\(unreleased\\\\)$\"\nreplace = \"({now:%Y-%m-%d})\"\nregex = true\n\n[tool.coverage.run]\nbranch = true\n\n[tool.hatch.build.targets.sdist]\ninclude = [\n    \"/price_parser\",\n    \"/tests\",\n    \"/CHANGES.rst\",\n    \"/tox.ini\",\n]\n\n[tool.mypy]\nstrict = true\n\n[tool.ruff.lint]\nextend-select = [\n    # flake8-builtins\n    \"A\",\n    # flake8-async\n    \"ASYNC\",\n    # flake8-bugbear\n    \"B\",\n    # flake8-comprehensions\n    \"C4\",\n    # flake8-commas\n    \"COM\",\n    # pydocstyle\n    \"D\",\n    # flake8-future-annotations\n    \"FA\",\n    # flynt\n    \"FLY\",\n    # refurb\n    \"FURB\",\n    # isort\n    \"I\",\n    # flake8-implicit-str-concat\n    \"ISC\",\n    # flake8-logging\n    \"LOG\",\n    # Perflint\n    \"PERF\",\n    # pygrep-hooks\n    \"PGH\",\n    # flake8-pie\n    \"PIE\",\n    # pylint\n    \"PL\",\n    # flake8-pytest-style\n    \"PT\",\n    # flake8-use-pathlib\n    \"PTH\",\n    # flake8-pyi\n    \"PYI\",\n    # flake8-quotes\n    \"Q\",\n    # flake8-return\n    \"RET\",\n    # flake8-raise\n    \"RSE\",\n    # Ruff-specific rules\n    \"RUF\",\n    # flake8-bandit\n    \"S\",\n    # flake8-simplify\n    \"SIM\",\n    # flake8-slots\n    \"SLOT\",\n    # flake8-debugger\n    \"T10\",\n    # flake8-type-checking\n    \"TC\",\n    # pyupgrade\n    \"UP\",\n    # pycodestyle warnings\n    \"W\",\n    # flake8-2020\n    \"YTT\",\n]\nignore = [\n    # Trailing comma missing\n    \"COM812\",\n    # Missing docstring in public module\n    \"D100\",\n    # Missing docstring in public class\n    \"D101\",\n    # Missing docstring in public method\n    \"D102\",\n    # Missing docstring in public function\n    \"D103\",\n    # Missing docstring in public package\n    \"D104\",\n    # Missing docstring in magic method\n    \"D105\",\n    # Missing docstring in public nested class\n    \"D106\",\n    # Missing docstring in __init__\n    \"D107\",\n    # One-line docstring should fit on one line with quotes\n    \"D200\",\n    # No blank lines allowed after function docstring\n    \"D202\",\n    # 1 blank line required between summary line and description\n    \"D205\",\n    # Multi-line docstring closing quotes should be on a separate line\n    \"D209\",\n    # First line should end with a period\n    \"D400\",\n    # First line should be in imperative mood; try rephrasing\n    \"D401\",\n    # First line should not be the function's \"signature\"\n    \"D402\",\n    # First word of the first line should be properly capitalized\n    \"D403\",\n    # No blank lines allowed between a section header and its content\n    \"D412\",\n    # Contains control characters that can permit obfuscated code\n    \"PLE2502\",\n    # Too many return statements\n    \"PLR0911\",\n    # Too many branches\n    \"PLR0912\",\n    # Too many arguments in function definition\n    \"PLR0913\",\n    # Too many statements\n    \"PLR0915\",\n    # Magic value used in comparison\n    \"PLR2004\",\n    # String contains ambiguous {}.\n    \"RUF001\",\n    # Docstring contains ambiguous {}.\n    \"RUF002\",\n    # Comment contains ambiguous {}.\n    \"RUF003\",\n    # Mutable class attributes should be annotated with `typing.ClassVar`\n    \"RUF012\",\n    # Use of `assert` detected\n    \"S101\",\n]\n\n[tool.ruff.lint.flake8-type-checking]\nruntime-evaluated-decorators = [\"attr.s\"]\n\n[tool.ruff.lint.isort]\nsplit-on-trailing-comma = false\n\n[tool.ruff.lint.per-file-ignores]\n# To not introduce annotations potentially not resolvable at the run time\n\"price_parser/parser.py\" = [\"FA100\"]\n\n[tool.ruff.lint.pydocstyle]\nconvention = \"pep257\"\n"
  },
  {
    "path": "tests/test_price_parsing.py",
    "content": "\"\"\"\nPrice extractor was developed mostly using PRICE_PARSING_EXAMPLES,\nthen evaluated on PRICE_PARSING_EXAMPLES_2, then improved to work better on\nPRICE_PARSING_EXAMPLES_3, PRICE_PARSING_EXAMPLES_NO_PRICE\nand PRICE_PARSING_EXAMPLES_NO_CURRENCY.\n\nThis data is collected from a random sample of pages from different domains.\n\nPRICE_PARSING_EXAMPLES_BUGS_CAUGHT are manually added examples for the bugs\nwe've found in a wild; PRICE_PARSING_EXAMPLES_NEW is a list of tests for\nnew features. New tests should probably go these two lists.\n\"\"\"\n\nfrom __future__ import annotations\n\nfrom decimal import Decimal\n\nimport pytest\n\nfrom price_parser import Price\n\n\nclass Example(Price):  # noqa: PLW1641\n    \"\"\"A Price wrapper for tests\"\"\"\n\n    def __init__(\n        self,\n        currency_raw: str | None,\n        price_raw: str | None,\n        currency: str | None,\n        amount_text: str | None,\n        amount_float: float | Decimal | None,\n        decimal_separator: str | None = None,\n        digit_group_separator: str | None = None,\n    ) -> None:\n        self.currency_raw = currency_raw\n        self.price_raw = price_raw\n        self.decimal_separator = decimal_separator\n        amount_decimal: Decimal | None = None\n        if isinstance(amount_float, Decimal):\n            amount_decimal = amount_float\n        elif amount_float is not None:\n            # don't use Decimal(amount_float), as this is not what\n            # one usually means, because of float precision\n            amount_decimal = Decimal(str(amount_float))\n        super().__init__(\n            amount=amount_decimal,\n            currency=currency,\n            amount_text=amount_text,\n        )\n\n    def __eq__(self, other: object) -> bool:\n        if not isinstance(other, Price):\n            return super().__eq__(other)\n        return (\n            self.amount == other.amount\n            and self.currency == other.currency\n            and self.amount_text == other.amount_text\n        )\n\n\ndef idfn(val: object) -> str | None:\n    if isinstance(val, Example):\n        return f\"{val.currency_raw}, {val.price_raw!r}\"\n    return None\n\n\nPRICE_PARSING_EXAMPLES_BUGS_CAUGHT = [\n    Example(None, \"US$:12.99\", \"US$\", \"12.99\", 12.99),\n    Example(\"GBP\", \"34.992001\", \"GBP\", \"34.992001\", 34.992001),\n    Example(\"GBP\", \"29.1583\", \"GBP\", \"29.1583\", 29.1583),\n    Example(\n        None,\n        \"1.11000000000000009770\",\n        None,\n        \"1.11000000000000009770\",\n        Decimal(\"1.11000000000000009770\"),\n    ),\n    Example(None, \" 423.923 KD\", \"KD\", \"423.923\", 423.923, decimal_separator=\".\"),\n    Example(\n        None,\n        \" 123,456.789 OMR\",\n        \"OMR\",\n        \"123,456.789\",\n        123456.789,\n        decimal_separator=\".\",\n        digit_group_separator=\",\",\n    ),\n]\n\n\nPRICE_PARSING_EXAMPLES_NEW = [\n    Example(None, \"PTE 120 000 000\", \"PTE\", \"120 000 000\", 120000000),\n    Example(None, \"DEM 170 000\", \"DEM\", \"170 000\", 170000),\n    Example(None, \"₤1700.\", \"₤\", \"1700\", 1700),\n    Example(None, \"$ 1.144.000\", \"$\", \"1.144.000\", 1144000),\n    Example(None, \"A$190.00\", \"A$\", \"190.00\", 190),\n    Example(None, \"205,68 € 205.68\", \"€\", \"205,68\", 205.68),\n    Example(None, \"AED 8000 (USD 2179)\", \"AED\", \"8000\", 8000),\n    Example(None, \"13800 ₶\", \"₶\", \"13800\", 13800),\n    Example(None, \"12,000원\", \"원\", \"12,000\", 12000),\n    Example(None, \"3,500円\", \"円\", \"3,500\", 3500),\n    Example(None, \"CHF 1'049,95\", \"CHF\", \"1049,95\", 1049.95),\n    Example(None, \"€1'049,95\", \"€\", \"1049,95\", 1049.95),\n    Example(None, \"644.00 جنيه\", \"جنيه\", \"644.00\", 644.0),  # Egyptian pound (EGP)\n    Example(None, \"3,439.00 درهم\", \"درهم\", \"3,439.00\", 3439.0),  # UAE dirham (AED)\n    Example(None, \"106.61 ريال\", \"ريال\", \"106.61\", 106.61),  # Saudi riyal (SAR)\n]\n\n\nPRICE_PARSING_EXAMPLES = [\n    Example(\n        \"90 728.00 руб 103 100.00 руб\",\n        \"399 167.00 руб 420 176.16 руб\",\n        \"руб\",\n        \"399 167.00\",\n        399167,\n    ),\n    Example(\"45,00 zł\", \"45,00 zł\", \"zł\", \"45,00\", 45),\n    Example(\"$\", \"$ 22.00\", \"$\", \"22.00\", 22),\n    Example(\"$3.99\", \"$14.99\", \"$\", \"14.99\", 14.99),\n    Example(\"Price:\", \"$11.95\", \"$\", \"11.95\", 11.95),\n    Example(\"$19.95\", \"$19.95\", \"$\", \"19.95\", 19.95),\n    Example(\"Price From £ 39.95\", \"39.95\", \"£\", \"39.95\", 39.95),\n    Example(\"comprar\", \"R$260,00\", \"R$\", \"260,00\", 260),\n    Example(\"$79.00\", \"$79.00\", \"$\", \"79.00\", 79),\n    Example(\"34,50 € *\", \"34,50 € *\", \"€\", \"34,50\", 34.5),\n    Example(\"35,70 €\", \"35,70 €\", \"€\", \"35,70\", 35.7),\n    Example(\"Price\", \"$147.44\", \"$\", \"147.44\", 147.44),\n    Example(\"Up to\", \"$4.70\", \"$\", \"4.70\", 4.7),\n    Example(\"$999.99\", \"$924.99\", \"$\", \"924.99\", 924.99),\n    Example(\"€\", \"690,00\", \"€\", \"690,00\", 690),\n    Example(\"Cena\", \"Běžná cena 9 800 Kč\", \"Kč\", \"9 800\", 9800),\n    Example(\"729,00 €\", \"479,00 €\", \"€\", \"479,00\", 479),\n    Example(\"naše cena\", \"běžná cena 590 Kč\", \"Kč\", \"590\", 590),\n    Example(\"Statt 249,00 EUR **\", \"249,00 EUR\", \"EUR\", \"249,00\", 249),\n    Example(\"€13.95\", \"€13.95\", \"€\", \"13.95\", 13.95),\n    Example(\"€36\", \"€89\", \"€\", \"89\", 89),\n    Example(\"171900 руб.\", \"171900 руб.\", \"руб.\", \"171900\", 171900),\n    Example(\"$1.06\", \"$0.31\", \"$\", \"0.31\", 0.31),\n    Example(\"$45.49\", \"$45.49\", \"$\", \"45.49\", 45.49),\n    Example(\"$\", \"28\", \"$\", \"28\", 28),\n    Example(\"4.81 16 von 5\", \"4.81\", None, \"4.81\", 4.81),\n    Example(\"CHF 86.00 *\", \"CHF 47.00 *\", \"CHF\", \"47.00\", 47),\n    Example(\"320 руб. 400 руб.\", \"419 руб.\", \"руб.\", \"419\", 419),\n    Example(\"129,99 €\", \"129,99 €\", \"€\", \"129,99\", 129.99),\n    Example(\"Cena\", \"1,10 €\", \"€\", \"1,10\", 1.1),\n    Example(\"Price:\", \"$559.00\", \"$\", \"559.00\", 559),\n    Example(\"$49.99\", \"$49.99\", \"$\", \"49.99\", 49.99),\n    Example(\"Price: $32.00\", \"$32.00\", \"$\", \"32.00\", 32),\n    Example(\"Price (high to low)\", \"$699,000\", \"$\", \"699,000\", 699000),\n    Example(\"€ 11.69\", \"€ 11.69\", \"€\", \"11.69\", 11.69),\n    Example(\"100,00 руб.\", \"100,00\", \"руб.\", \"100,00\", 100),\n    Example(\"€ 1\", \"17,35\", \"€\", \"17,35\", 17.35),\n    Example(\"$19.95\", \"$19.95\", \"$\", \"19.95\", 19.95),\n    Example(\"-\", \"£11.95\", \"£\", \"11.95\", 11.95),\n    Example(\"грн.\", \"5 870\", \"грн.\", \"5 870\", 5870),\n    Example(\"Price\", \"80 Kč\", \"Kč\", \"80\", 80),\n    Example(\"€ 640,\", \"€ 610,\", \"€\", \"610\", 610),\n    Example(\"Cena\", \"299 Kč\", \"Kč\", \"299\", 299),\n    Example(\"1128240 рублей\", \"1128240 рублей\", \"руб\", \"1128240\", 1128240),\n    Example(\n        \"Now £9.99 $13.71 11,16 € £8.33 $13.71 9,30 €\",\n        \"£9.99\",\n        \"£\",\n        \"9.99\",\n        9.99,\n    ),\n    Example(\"Free!\", \"Free!\", None, \"0\", 0),\n    Example(\"49,96€\", \"49,96€\", \"€\", \"49,96\", 49.96),\n    Example(\"SKU:\", \"$9.00\", \"$\", \"9.00\", 9),\n    Example(\"£ 8.29\", \"8.29\", \"£\", \"8.29\", 8.29),\n    Example(\"Р\", \"6 300 Р\", \"Р\", \"6 300\", 6300),\n    Example(\"99,99 EUR (-30,00%) 69,99 EUR\", \"99,99 EUR\", \"EUR\", \"99,99\", 99.99),\n    Example(\"Р\", \"1 890 Р\", \"Р\", \"1 890\", 1890),\n    Example(\"Disposable Arts\", \"15,95 €\", \"€\", \"15,95\", 15.95),\n    Example(\"zł\", \"16.00\", \"zł\", \"16.00\", 16),\n    Example(\"£ 4.99\", \"4.99\", \"£\", \"4.99\", 4.99),\n    Example(\"Price\", \"$119. 95\", \"$\", \"119. 95\", 119.95),\n    Example(\"269 Kč\", \"269 Kč\", \"Kč\", \"269\", 269),\n    Example(\">\", \"13,30 €\", \"€\", \"13,30\", 13.3),\n    Example(\"₪ 115\", \"₪98\", \"₪\", \"98\", 98),\n    Example(\"80,00 €\", \"80,00 €\", \"€\", \"80,00\", 80),\n    Example(\"33,95 €\", \"29,95 €\", \"€\", \"29,95\", 29.95),\n    Example(\"£ 80.00\", \"80.00\", \"£\", \"80.00\", 80),\n    Example(\"EUR\", \"€16.95\", \"€\", \"16.95\", 16.95),\n    Example(\"DKK\", \"23,40\", \"DKK\", \"23,40\", 23.4),\n    Example(\"Price: $ 34.44\", \"34.44\", \"$\", \"34.44\", 34.44),\n    Example(\"Rp 31.500\", \"Rp 31.500\", \"Rp\", \"31.500\", 31500),\n    Example(\"běžná cena 6,00 Kč\", \"běžná cena 6,00 Kč\", \"Kč\", \"6,00\", 6),\n    Example(\"€\", \"19,59\", \"€\", \"19,59\", 19.59),\n    Example(\"Out of stock\", \"2 285,81 грн.\", \"грн.\", \"2 285,81\", 2285.81),\n    Example(\"$ 119,999\", \"$ 119,999\", \"$\", \"119,999\", 119999),\n    Example(\"1,20 €\", \"1,20 €\", \"€\", \"1,20\", 1.2),\n    Example(\"€ 1.99\", \"1.99\", \"€\", \"1.99\", 1.99),\n    Example(\"Cena 283,50 PLN\", \"Cena 283,50 PLN\", \"PLN\", \"283,50\", 283.5),\n    Example(\"SKU:\", \"99.99\", None, \"99.99\", 99.99),\n    Example(\"$\", \"$ 979.00\", \"$\", \"979.00\", 979),\n    Example(\"Cena 169,00 Kč\", \"169,00 Kč\", \"Kč\", \"169,00\", 169),\n    Example(\"Р\", \"94,456 Р\", \"Р\", \"94,456\", 94456),\n    Example(\"€\", \"180\", \"€\", \"180\", 180),\n    Example(\"Savings: $0.90\", \"2.85\", \"$\", \"2.85\", 2.85),\n    Example(\"฿ 3.3900\", \"฿ 3.3900\", \"฿\", \"3.3900\", 3.39),\n    Example(\"5,90 €\", \"5,90 €\", \"€\", \"5,90\", 5.90),\n    Example(\"1 930 р.\", \"1 030 р.\", \"р.\", \"1 030\", 1030),\n    Example(\"$\", \"$ 22.00\", \"$\", \"22.00\", 22),\n    Example(\"HUF\", \"39900\", \"HUF\", \"39900\", 39900),\n    Example(\"59,00 €\", \"79,00 €\", \"€\", \"79,00\", 79),\n    Example(\"(-38,23%)\", \"429,00 EUR\", \"EUR\", \"429,00\", 429),\n    Example(\"302,44€ Χωρίς ΦΠΑ: 243,90€\", \"302,44€\", \"€\", \"302,44\", 302.44),\n    Example(\"RENAULT\", \"129.900\", None, \"129.900\", 129900),\n    Example(\"USD\", \"£54.17\", \"£\", \"54.17\", 54.17),\n    Example(\"$3.00\", \"$3.00\", \"$\", \"3.00\", 3),\n    Example(\"3,49 zł 1,75 zł\", \"3,49 zł 1,75 zł\", \"zł\", \"3,49\", 3.49),\n    Example(\"59,90 EUR 599,00 EUR pro Kilogramm\", \"59,90 EUR\", \"EUR\", \"59,90\", 59.9),\n    Example(\"Vanaf € 49.95\", \"Vanaf € 49.95\", \"€\", \"49.95\", 49.95),\n    Example(\"$299.00\", \"$299.00\", \"$\", \"299.00\", 299),\n    Example(\"€\", \"€30,40 **\", \"€\", \"30,40\", 30.4),\n    Example(\"$59.99\", \"$59.99\", \"$\", \"59.99\", 59.99),\n    Example(\"EUR\", \"2800\", \"EUR\", \"2800\", 2800),\n    Example(\"225,00 € *\", \"225,00 € *\", \"€\", \"225,00\", 225),\n    Example(\"17 940,00 руб\", \"17 940,00 руб\", \"руб\", \"17 940,00\", 17940),\n    Example(\"159,50 €\", \"159,50 €\", \"€\", \"159,50\", 159.5),\n    Example(\"£18.99\", \"£18.99\", \"£\", \"18.99\", 18.99),\n    Example(\"2.999,00 EUR (-10,00%) 2.699,00 EUR\", \"699,00 EUR\", \"EUR\", \"699,00\", 699),\n    Example(\"$\", \"45.33\", \"$\", \"45.33\", 45.33),\n    Example(\"грн.\", \"33\", \"грн.\", \"33\", 33),\n    Example(\"EUR\", \"16,50 €\", \"€\", \"16,50\", 16.5),\n    Example(\"₫\", \"880,000 ₫\", \"₫\", \"880,000\", 880000),\n    Example(\"руб.\", \"13.50\", \"руб.\", \"13.50\", 13.5),\n    Example(\"336 р.\", \"336 р.\", \"р.\", \"336\", 336),\n    Example(\"....\", \"200\", None, \"200\", 200),\n    Example(\"Our Price:\", \"$860.00\", \"$\", \"860.00\", 860),\n    Example(\"10 €\", \"10 €\", \"€\", \"10\", 10),\n    Example(\"€\", \"13\", \"€\", \"13\", 13),\n    Example(\"60,00 DKK\", \"60,00 DKK\", \"DKK\", \"60,00\", 60),\n    Example(\"63,90 EUR\", \"63,90 EUR\", \"EUR\", \"63,90\", 63.9),\n    Example(\"$\", \"$ 11.99\", \"$\", \"11.99\", 11.99),\n    Example(\"25,00 €\", \"25,00 €\", \"€\", \"25,00\", 25),\n    Example(\"Cena\", \"106,40 €\", \"€\", \"106,40\", 106.4),\n    Example(\"EA\", \"$426.20/EA\", \"$\", \"426.20\", 426.2),\n    Example(\"zł\", \"5.76\", \"zł\", \"5.76\", 5.76),\n    Example(\"$4.50\", \"$4.50\", \"$\", \"4.50\", 4.5),\n    Example(\"51090 M Фильтроэлемент OMEGA\", \"2 660 руб\", \"руб\", \"2 660\", 2660),\n    Example(\"Р\", \"5 000 Р\", \"Р\", \"5 000\", 5000),\n    Example(\"Add to Cart\", \"$4.60\", \"$\", \"4.60\", 4.6),\n    Example(\"£14.99\", \"£14.99\", \"£\", \"14.99\", 14.99),\n    Example(\"SKU:\", \"$150.00\", \"$\", \"150.00\", 150),\n    Example(\"€\", \"70,31\", \"€\", \"70,31\", 70.31),\n    Example(\"/\", \"$379\", \"$\", \"379\", 379),\n    Example(\"€\", \"139,95\", \"€\", \"139,95\", 139.95),\n    Example(\"Add to cart\", \"22,90 €\", \"€\", \"22,90\", 22.9),\n    Example(\"94,99 zł\", \"94,99 zł\", \"zł\", \"94,99\", 94.99),\n    Example(\"Price\", \"89.99\", None, \"89.99\", 89.99),\n    Example(\"USD\", \"$4.00\", \"$\", \"4.00\", 4),\n    Example(\"$\", \"Type of Transfer *\", \"$\", None, None),\n    Example(\"Add to Order\", \"$892.00\", \"$\", \"892.00\", 892),\n    Example(\"грн\", \"60800\", \"грн\", \"60800\", 60800),\n    Example(\"zł\", \"1849.00\", \"zł\", \"1849.00\", 1849),\n    Example(\"OK\", \"0,00 EUR\", \"EUR\", \"0,00\", 0),\n    Example(\"руб.\", \"5 450 руб.\", \"руб.\", \"5 450\", 5450),\n    Example(\"Price: $15.95/mo\", \"Price: $15.95/mo\", \"$\", \"15.95\", 15.95),\n    Example(\"MX924 IX\", \"850 руб.\", \"руб.\", \"850\", 850),\n    Example(\n        \"6,000.00 руб. 5,500.00 руб.\",\n        \"6,000.00 руб. 5,500.00 руб.\",\n        \"руб.\",\n        \"6,000.00\",\n        6000,\n    ),\n    Example(\"5.590,00 € *\", \"9.990,00 €\", \"€\", \"9.990,00\", 9990),\n    Example(\n        \"1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26\"\n        \" 27 28 29 30\",\n        \"$175.00\",\n        \"$\",\n        \"175.00\",\n        175,\n    ),\n    Example(\"Price\", \"$99.99\", \"$\", \"99.99\", 99.99),\n    Example(\"€\", \"119,00\", \"€\", \"119,00\", 119),\n    Example(\"$\", \"$ 11.96\", \"$\", \"11.96\", 11.96),\n    Example(\"€\", \"9,94\", \"€\", \"9,94\", 9.94),\n    Example(\"$69.00\", \"$69.00\", \"$\", \"69.00\", 69),\n    Example(\"AQUAFINESSE\", \"AQUAFINESSE\", None, None, None),\n    Example(\"£55.00\", \"£50.00\", \"£\", \"50.00\", 50),\n    Example(\"$39.99\", \"$39.99\", \"$\", \"39.99\", 39.99),\n    Example(\"65 000 руб. 75 000 руб.\", \"75 000 руб.\", \"руб.\", \"75 000\", 75000),\n    Example(\"DKK/stk\", \"17,95\", \"DKK\", \"17,95\", 17.95),\n    Example(\"841,00 zł\", \"841,00 zł – 995,00 zł\", \"zł\", \"841,00\", 841),\n    Example(\"$\", \"$ 18.95\", \"$\", \"18.95\", 18.95),\n    Example(\"9.0\", \"434\", None, \"434\", 434),\n    Example(\"£14.50\", \"£21.00\", \"£\", \"21.00\", 21),\n    Example(\"ab\", \"19,90 €\", \"€\", \"19,90\", 19.9),\n    Example(\"30 руб\", \"30 руб\", \"руб\", \"30\", 30),\n    Example(\"€\", \"684,25\", \"€\", \"684,25\", 684.25),\n    Example(\"€ 125.00\", \"€ 45.00\", \"€\", \"45.00\", 45),\n    Example(\"ht / L'unité\", \"17.90\", None, \"17.90\", 17.9),\n    Example(\"$0.00\", \"$0.00\", \"$\", \"0.00\", 0),\n    Example(\"49 Kč\", \"49 Kč\", \"Kč\", \"49\", 49),\n    Example(\"Cena 685,00 Kč\", \"1 995,00 Kč\", \"Kč\", \"1 995,00\", 1995),\n    Example(\"€ 2,99\", \"€ 2,99\", \"€\", \"2,99\", 2.99),\n    Example(\"Cкидка до 10% от цены купона\", \"475 руб.\", \"руб.\", \"475\", 475),\n    Example(\"€\", \"11,76\", \"€\", \"11,76\", 11.76),\n    Example(\"$99.99\", \"$99.99\", \"$\", \"99.99\", 99.99),\n    Example(\"1\\xa0298,00 €\", \"1\\xa0298,00 €\", \"€\", \"1 298,00\", 1298.00),\n    Example(\"$1\\xa0298,00\", \"$1\\xa0298,00\", \"$\", \"1 298,00\", 1298.00),\n    Example(\"1\\xa0298,00\", \"1\\xa0298,00\", None, \"1 298,00\", 1298.00),\n    Example(None, \".75 €\", \"€\", \".75\", 0.75),\n    Example(\"$.75\", \"$.75\", \"$\", \".75\", 0.75),\n    Example(\"$..75\", \"$..75\", \"$\", \".75\", 0.75),\n    Example(\"$.75,333\", \"$.75,333\", \"$\", \".75,333\", 75333),\n    Example(\"$.750.30\", \"$.750.30\", \"$\", \"750.30\", 750.30),\n    Example(\"i\", \"i\", None, None, None),\n]\n\n\nPRICE_PARSING_EXAMPLES_2 = [\n    Example(\"7,99 €\", \"7,99 €\", \"€\", \"7,99\", 7.99),\n    Example(\"2 Piece - $6.75 2 Piece - $6.75\", \"$6.75\", \"$\", \"6.75\", 6.75),\n    Example(\"£7\", \"£24.99\", \"£\", \"24.99\", 24.99),\n    Example(\"23,00 €\", \"23,00 €\", \"€\", \"23,00\", 23.00),\n    Example(\"€\", \"bežná cena 12,96 €\", \"€\", \"12,96\", 12.96),\n    Example(\"$\", \"3,20 €\", \"€\", \"3,20\", 3.2),\n    Example(\"€ 2.109,00\", \"€ 2.109,00\", \"€\", \"2.109,00\", 2109),\n    Example(\"руб.\", \"32690\", \"руб.\", \"32690\", 32690),\n    Example(\": 3 250 000 €\", \": 3 250 000 €\", \"€\", \"3 250 000\", 3250000),\n    Example(\"$20.00\", \"$20.00\", \"$\", \"20.00\", 20),\n    Example(\"Цена:\", \"950 грн.\", \"грн.\", \"950\", 950),\n    Example(\"TTC\", \"149,00\", None, \"149,00\", 149.00),\n    Example(\"A partire da 9,08 €\", \"166,81 € iva inclusa\", \"€\", \"166,81\", 166.81),\n    # Example('Ref:', '4229',\n    #         None, None, ),\n    Example(\"EUR\", \"679.00\", \"EUR\", \"679.00\", 679.00),\n    Example(\"10,50 € 10,50 €\", \"10,50 €\", \"€\", \"10,50\", 10.50),\n    Example(\"2,20 € *\", \"2,20 € *\", \"€\", \"2,20\", 2.2),\n    Example(\"€\", \"€ 10.00 € 8.00 – € 10.00\", \"€\", \"10.00\", 10),\n    Example(\"Bestellen\", \"€16,95\", \"€\", \"16,95\", 16.95),\n    Example(\"$\", \"$ 95.00\", \"$\", \"95.00\", 95.00),\n    Example(\"Р\", \"1 400 Р\", \"Р\", \"1 400\", 1400),\n    Example(\"£\", \"£ 15.00\", \"£\", \"15.00\", 15),\n    Example(\"Price: $119.00\", \"$119.00\", \"$\", \"119.00\", 119),\n    Example(\"50,- Kč\", \"50,- Kč\", \"Kč\", \"50\", 50),\n    Example(\"What is this?\", \"$25.95\", \"$\", \"25.95\", 25.95),\n    Example(\"$29.99 Excluding Sales Tax in Illinois\", \"$29.99\", \"$\", \"29.99\", 29.99),\n    Example(\"ID:\", \"125,00 zł\", \"zł\", \"125,00\", 125),\n    Example(\"Offer Price: Rs 1,306.14\", \"Rs 3,600.00\", \"Rs\", \"3,600.00\", 3600),\n    Example(\"29 RON\", \"29 RON\", \"RON\", \"29\", 29),\n    Example(\"Р\", \"2 690 Р\", \"Р\", \"2 690\", 2690),\n    Example(\"$134.96\", \"$134.96\", \"$\", \"134.96\", 134.96),\n    Example(\"362,68 € χωρίς Φ.Π.Α\", \"449,72 €\", \"€\", \"449,72\", 449.72),\n    Example(\"MSRP: $588.00\", \"499.80\", \"$\", \"499.80\", 499.80),\n    Example(\"15.00 €\", \"15.00 €\", \"€\", \"15.00\", 15),\n    Example(\"Цена: от 2 750 руб.\", \"2 750 руб.\", \"руб.\", \"2 750\", 2750),\n    Example(\"P.V.P. 4,56 €\", \"P.V.P. 4,56 €\", \"€\", \"4,56\", 4.56),\n    Example(\"SPECIAL Add to Cart for Price\", \"$40.00\", \"$\", \"40.00\", 40),\n    Example(\"2,90 €\", \"2,90\", \"€\", \"2,90\", 2.9),\n    Example(\"Цена: 19 000 руб.\", \"Цена: 19 000 руб.\", \"руб.\", \"19 000\", 19000),\n    Example(\"COMMANDER\", \"184,20 €HT\", \"€\", \"184,20\", 184.2),\n    Example(\"Цена: 1 849 руб.\", \"1 849 руб.\", \"руб.\", \"1 849\", 1849),\n    Example(\"€\", \"12,00\", \"€\", \"12,00\", 12),\n    Example(\"Discounted Price £ 205.99\", \"205.99\", \"£\", \"205.99\", 205.99),\n    Example(\"SKU\", \"No longer available\", None, None, None),\n    Example(\"€14.90\", \"€69.90\", \"€\", \"69.90\", 69.9),\n    Example(\"руб.\", \"876 руб.\", \"руб.\", \"876\", 876),\n    Example(\"$79.95\", \"$79.95\", \"$\", \"79.95\", 79.95),\n    Example(\"3,990 Ft 2,990 Ft\", \"3,990 Ft\", \"Ft\", \"3,990\", 3990),\n    Example(\"Cena 298,00 Kč\", \"288,00 Kč\", \"Kč\", \"288,00\", 288),\n    Example(\"Pris NOK 899,00\", \"899,00\", \"NOK\", \"899,00\", 899),\n    Example(\"50,00 €\", \"50,00 €\", \"€\", \"50,00\", 50),\n    Example(\"59,99 €\", \"54,99 €\", \"€\", \"54,99\", 54.99),\n    Example(\"EAN\", \"139,00 € *\", \"€\", \"139,00\", 139),\n    Example(\"Now\", \"238.00\", None, \"238.00\", 238),\n    Example(\"(You save $15.01)\", \"$119.99\", \"$\", \"119.99\", 119.99),\n    Example(\"Item #:\", \"$ 99.95\", \"$\", \"99.95\", 99.95),\n    Example(\"UK:\", \"£14.99\", \"£\", \"14.99\", 14.99),\n    Example(\"р.\", \"150\", \"р.\", \"150\", 150),\n    Example(\"12x de R$ 44,00 sem juros\", \"R$ 528,00\", \"R$\", \"528,00\", 528),\n    Example(\"€\", \"14,90\", \"€\", \"14,90\", 14.9),\n    Example(\"5 290 Kč s DPH\", \"5 290 Kč\", \"Kč\", \"5 290\", 5290),\n    Example(\"(Out of Stock)\", \"39.95\", None, \"39.95\", 39.95),\n    Example(\"₪370\", \"₪370\", \"₪\", \"370\", 370),\n    Example(\"HUF\", \"39000\", \"HUF\", \"39000\", 39000),\n    Example(\"Kč\", \"1 995 Kč\", \"Kč\", \"1 995\", 1995),\n    Example(\"C$5.95\", \"C$5.95\", \"C$\", \"5.95\", 5.95),\n    Example(\"руб.\", \"22800.00\", \"руб.\", \"22800.00\", 22800),\n    Example(\"Cena\", \"359 Kč\", \"Kč\", \"359\", 359),\n    Example(\"Nuestro precio\", \"189,00 €\", \"€\", \"189,00\", 189),\n    Example(\"PLN\", \"179.62\", \"PLN\", \"179.62\", 179.62),\n    Example(\"€\", \"145,79\", \"€\", \"145,79\", 145.79),\n    Example(\"$\", \"$ 695.00\", \"$\", \"695.00\", 695),\n    Example(\"Р\", \"2 999 Р\", \"Р\", \"2 999\", 2999),\n    Example(\"6,50 € *\", \"6,50\", \"€\", \"6,50\", 6.50),\n    Example(\"Price: $61.00\", \"$61.00\", \"$\", \"61.00\", 61.00),\n    Example(\"Pris NOK 1 999,00\", \"5 799,00\", \"NOK\", \"5 799,00\", 5799),\n    Example(\"7,31 €\", \"7,31 €\", \"€\", \"7,31\", 7.31),\n    Example(\"53,20 €\", \"53,20 €\", \"€\", \"53,20\", 53.20),\n    Example(\"Cena\", \"668 Kč\", \"Kč\", \"668\", 668),\n    Example(\"€ 28,25\", \"€ 27,95\", \"€\", \"27,95\", 27.95),\n    Example(\"From\", \"From $109.90\", \"$\", \"109.90\", 109.9),\n    Example(\"Unit Price: $4.75\", \"$4.75\", \"$\", \"4.75\", 4.75),\n    Example(\"Więcej\", \"14,90 zł\", \"zł\", \"14,90\", 14.90),\n    Example(\"$23.00\", \"$23.00\", \"$\", \"23.00\", 23),\n    Example(\"€ 0.00\", \"€ 33.00\", \"€\", \"33.00\", 33),\n    Example(\"Zľava 36 €\", \"78 €\", \"€\", \"78\", 78),\n    Example(\"£\", \"5.00\", \"£\", \"5.00\", 5),\n    Example(\"€\", \"29,90\", \"€\", \"29,90\", 29.9),\n    Example(\"Р\", \"860 Р\", \"Р\", \"860\", 860),\n    Example(\"60,55 €\", \"60,55 €\", \"€\", \"60,55\", 60.55),\n    Example(\"€\", \"129.00\", \"€\", \"129.00\", 129),\n    Example(\"£13.50\", \"£13.50\", \"£\", \"13.50\", 13.50),\n    Example(\"SKU:\", \"$39.99\", \"$\", \"39.99\", 39.99),\n    Example(\n        \"Disponibilidade: Pronta entrega R$60,00 até 2x de R$30,00\",\n        \"R$60,00\",\n        \"R$\",\n        \"60,00\",\n        60,\n    ),\n    Example(\"67,99 €\", \"64,59 €\", \"€\", \"64,59\", 64.59),\n    Example(\"€ 9,90\", \"€ 13,50\", \"€\", \"13,50\", 13.50),\n    Example(\"Р\", \"30 Р\", \"Р\", \"30\", 30),\n    Example(\"€\", \"€ 139.00\", \"€\", \"139.00\", 139),\n    Example(\"There are 163 products.\", \"From 26 to 50 €\", \"€\", \"26\", 26),\n    Example(\"Pris NOK 1 999,00\", \"139,00\", \"NOK\", \"139,00\", 139),\n    Example(\"/sqft\", \"1.52\", None, \"1.52\", 1.52),\n    Example(\"$4.95\", \"$4.95\", \"$\", \"4.95\", 4.95),\n    Example(\"$38\", \"$12\", \"$\", \"12\", 12),\n    Example(\"Cena 4.10 €\", \"4.10\", \"€\", \"4.10\", 4.1),\n    Example(\"руб.\", \"590\", \"руб.\", \"590\", 590),\n    Example(\"€\", \"99,90\", \"€\", \"99,90\", 99.9),\n    Example(\"9,50 EUR\", \"9,50 EUR\", \"EUR\", \"9,50\", 9.50),\n    Example(\"$74.99\", \"$74.99\", \"$\", \"74.99\", 74.99),\n    Example(\"$\", \"$ 3.22\", \"$\", \"3.22\", 3.22),\n    Example(\"£\", \"3,301.00 £\", \"£\", \"3,301.00\", 3301),\n    Example(\"41,78 EUR\", \"41,78 EUR\", \"EUR\", \"41,78\", 41.78),\n    Example(\"44,50 EUR\", \"44,50 EUR\", \"EUR\", \"44,50\", 44.50),\n    Example(\"£4.00\", \"£4.00\", \"£\", \"4.00\", 4),\n    Example(\"Р\", \"7 390 Р\", \"Р\", \"7 390\", 7390),\n    Example(\"eMail\", \"34.99€\", \"€\", \"34.99\", 34.99),\n    Example(\"€\", \"12,99\", \"€\", \"12,99\", 12.99),\n    Example(\"RRP: £ 180.00\", \"149.00\", \"£\", \"149.00\", 149),\n    Example(\"9.00 руб.\", \"27.00 руб.\", \"руб.\", \"27.00\", 27),\n    Example(\"Price: $19.95\", \"$7.95\", \"$\", \"7.95\", 7.95),\n    Example(\"$16,500\", \"$16,500\", \"$\", \"16,500\", 16500),\n    Example(\"•\", \"$59.99\", \"$\", \"59.99\", 59.99),\n    Example(\"USD\", \"349.95\", \"USD\", \"349.95\", 349.95),\n    Example(\"35€ 99 dont 0,02 € d'éco-part\", \"35€ 99\", \"€\", \"35€99\", 35.99),\n    Example(\"5,72 €\", \"5,72 €\", \"€\", \"5,72\", 5.72),\n    Example(\"199,00 грн.\", \"199,00 грн.\", \"грн.\", \"199,00\", 199),\n    Example(\"£4.07\", \"£4.07\", \"£\", \"4.07\", 4.07),\n    Example(\"$15.00\", \"$15.00\", \"$\", \"15.00\", 15),\n    Example(\"€\", \"20.00\", \"€\", \"20.00\", 20),\n    Example(\"€\", \"14.50\", \"€\", \"14.50\", 14.5),\n    Example(\"DKK\", \"59,00\", \"DKK\", \"59,00\", 59),\n    Example(\"9 472 Ft\", \"9 472 Ft\", \"Ft\", \"9 472\", 9472),\n    Example(\"Cena\", \"95 Kč\", \"Kč\", \"95\", 95),\n    Example(\"tax excl.\", \"€ 0,00\", \"€\", \"0,00\", 0),\n    Example(\"TL\", \"69,50\", \"TL\", \"69,50\", 69.5),\n    Example(\"Price\", \"Rp 169.000\", \"Rp\", \"169.000\", 169000),\n    Example(\"En stock\", \"4,50 €\", \"€\", \"4,50\", 4.50),\n    Example(\"$183.00\", \"$145.00\", \"$\", \"145.00\", 145),\n    Example(\"£\", \"11.70\", \"£\", \"11.70\", 11.7),\n    Example(\"25,13 €\", \"25,13 €\", \"€\", \"25,13\", 25.13),\n    Example(\"58,00 zł\", \"58,00 zł\", \"zł\", \"58,00\", 58),\n    Example(\"€\", \"15,55\", \"€\", \"15,55\", 15.55),\n    Example(\"Prezzo SVB: 19,95 €\", \"Prezzo SVB: 19,95 €\", \"€\", \"19,95\", 19.95),\n    Example(\"In stock\", \"$185.00\", \"$\", \"185.00\", 185),\n    Example(\"18 €\", \"18 €\", \"€\", \"18\", 18),\n    Example(\"0€\", \"0 €\", \"€\", \"0\", 0),\n    Example(\"*\", \"9,41 €\", \"€\", \"9,41\", 9.41),\n    Example(\"грн.\", \"1 075\", \"грн.\", \"1 075\", 1075),\n    Example(\"More\", \"$22.99\", \"$\", \"22.99\", 22.99),\n    Example(\"Р\", \"9 282 Р\", \"Р\", \"9 282\", 9282),\n    Example(\"RM5\", \"RM50\", \"RM\", \"50\", 50),\n    Example(\"7,60 €\", \"7,60 €\", \"€\", \"7,60\", 7.6),\n    Example(\"$\", \"0.00\", \"$\", \"0.00\", 0),\n    Example(\". AMOSTRA .\", \"R$ 6,00\", \"R$\", \"6,00\", 6),\n    Example(\n        \"5 833,00 € -5% 6 140,00 € Tasse incl. IVA 4%\",\n        \"5 833,00 €\",\n        \"€\",\n        \"5 833,00\",\n        5833,\n    ),\n    Example(\"€ 26,95\", \"€ 26,95\", \"€\", \"26,95\", 26.95),\n    Example(\"35,00 €\", \"35,00 €\", \"€\", \"35,00\", 35),\n    Example(\"Р\", \"2 500 Р\", \"Р\", \"2 500\", 2500),\n    Example(\"499,00 €\", \"499,00 €\", \"€\", \"499,00\", 499),\n    Example(\"руб.\", \"1 120 900\", \"руб.\", \"1 120 900\", 1120900),\n    Example(\"125,00 125,00 €\", \"125,00\", \"€\", \"125,00\", 125),\n    Example(\"₽\", \"7362\", \"₽\", \"7362\", 7362),\n    Example(\"SKU:\", \"€12.99\", \"€\", \"12.99\", 12.99),\n    Example(\"р.\", \"600\", \"р.\", \"600\", 600),\n    Example(\"79,50 €\", \"29,90€\", \"€\", \"29,90\", 29.9),\n    Example(\"$150.00\", \"$150.00\", \"$\", \"150.00\", 150),\n    Example(\"Р\", \"1 987 Р\", \"Р\", \"1 987\", 1987),\n    Example(\"€69.00\", \"€69.00\", \"€\", \"69.00\", 69),\n    Example(\"USD\", \"280\", \"USD\", \"280\", 280),\n    Example(\"Rabatt\", \"6 450,00\", None, \"6 450,00\", 6450),\n    Example(\"SKU:\", \"$178.00\", \"$\", \"178.00\", 178),\n    Example(\"$\", \"$ 300.00\", \"$\", \"300.00\", 300),\n    Example(\"0€\", \"19,1€\", \"€\", \"19,1\", 19.1),\n    Example(\"R$49,90\", \"R$49,90\", \"R$\", \"49,90\", 49.9),\n    Example(\"En stock\", \"790,00 € HT\", \"€\", \"790,00\", 790),\n    Example(\"Cena\", \"Cena 14,79 €\", \"€\", \"14,79\", 14.79),\n    Example(\"For Sale\", \"$395,000\", \"$\", \"395,000\", 395000),\n    Example(\"€\", \"10.14\", \"€\", \"10.14\", 10.14),\n    Example(\"₫\", \"5.00 trên 5\", \"₫\", \"5.00\", 5),\n    Example(\"$ 599.00\", \"549.00\", \"$\", \"549.00\", 549),\n    Example(\"$19\", \"$19\", \"$\", \"19\", 19),\n    Example(\"$210\", \"$210\", \"$\", \"210\", 210),\n    Example(\"$\", \"$ 79.95\", \"$\", \"79.95\", 79.95),\n    Example(\"руб.\", \"279 000\", \"руб.\", \"279 000\", 279000),\n    Example(\"2 390 €\", \"2 390 €\", \"€\", \"2 390\", 2390),\n    Example(\"$\", \"$ 281.40 $ 265.70\", \"$\", \"281.40\", 281.4),\n    Example(\"3200 руб. 1500 руб.\", \"3200 руб. 1500 руб.\", \"руб.\", \"3200\", 3200),\n    Example(\"$1,299.00\", \"$999.00\", \"$\", \"999.00\", 999),\n    Example(\"15,00 Kč\", \"15,00 Kč\", \"Kč\", \"15,00\", 15),\n    Example(\"€\", \"€ 20.70\", \"€\", \"20.70\", 20.7),\n    Example(\"out of stock\", \"30.00\", None, \"30.00\", 30),\n    Example(\"220,00 €\", \"398,00 €\", \"€\", \"398,00\", 398),\n    Example(\"£94.50 GBP\", \"£94.50 GBP\", \"£\", \"94.50\", 94.5),\n    Example(\"5 427 Kč\", \"5 427 Kč\", \"Kč\", \"5 427\", 5427),\n    Example(\"$ 24.99\", \"$ 24.99\", \"$\", \"24.99\", 24.99),\n    Example(\"£ 2.00\", \"2.00\", \"£\", \"2.00\", 2),\n    Example(\">\", \"10,00 €\", \"€\", \"10,00\", 10),\n    Example(\"32,50 EUR\", \"32,50 EUR\", \"EUR\", \"32,50\", 32.5),\n    Example(\"In stock\", \"Rs1,599.00\", \"Rs\", \"1,599.00\", 1599),\n    Example(\"$\", \"14.95\", \"$\", \"14.95\", 14.95),\n    Example(\"RRP: £ 49.99\", \"42.90\", \"£\", \"42.90\", 42.9),\n    Example(\"Rs206.00 Rs164.00 SAVE 20%\", \"Rs164.00\", \"Rs\", \"164.00\", 164),\n    Example(\"Price:\", \"$6,200.00\", \"$\", \"6,200.00\", 6200),\n    Example(\"PLN\", \"69.99\", \"PLN\", \"69.99\", 69.99),\n    Example(\"€\", \"48,39\", \"€\", \"48,39\", 48.39),\n    Example(\"1.350.000\", \"320.000\", None, \"320.000\", 320000),\n    Example(\"1.650,00 € *\", \"2.130,00 €\", \"€\", \"2.130,00\", 2130),\n    Example(\"£537.00\", \"£179.00\", \"£\", \"179.00\", 179),\n    Example(\"SKU:\", \"$39.99\", \"$\", \"39.99\", 39.99),\n    Example(\"SGD$4.90\", \"SGD$4.90\", \"SGD\", \"4.90\", 4.9),\n    Example(\"SGD4.90 $\", \"SGD4.90 $\", \"SGD\", \"4.90\", 4.9),\n    Example(\"$ SGD4.90\", \"$ SGD4.90\", \"SGD\", \"4.90\", 4.9),\n]\n\n\nPRICE_PARSING_EXAMPLES_NO_PRICE = [\n    Example(\"EUR\", None, \"EUR\", None, None),\n    Example(\"Kč\", None, \"Kč\", None, None),\n    Example(\"50\", None, None, None, None),\n    Example(\">\", None, None, None, None),\n    Example(\"REI\", None, None, None, None),\n    Example(\"rate\", None, None, None, None),\n]\n\n\nPRICE_PARSING_EXAMPLES_NO_CURRENCY = [\n    Example(None, \"67\", None, \"67\", 67),\n    Example(None, \"naša cena 67,30 €\", \"€\", \"67,30\", 67.30),\n    Example(\n        None,\n        \"EUR29.66 (inc VAT 20% - UK & EEC) EUR24.71 (exc VAT 20% - UK & EEC)\",\n        \"EUR\",\n        \"29.66\",\n        29.66,\n    ),\n    Example(None, \"17,00 €\", \"€\", \"17,00\", 17),\n    Example(None, \"0,29 € + iva\", \"€\", \"0,29\", 0.29),\n    Example(None, \"39,00 €\", \"€\", \"39,00\", 39),\n    Example(None, \"24,00 Kč\", \"Kč\", \"24,00\", 24),\n    Example(None, \"běžná cena 7 940 Kč\", \"Kč\", \"7 940\", 7940),\n    Example(None, \"$46.00\", \"$\", \"46.00\", 46.00),\n    Example(None, \"$9.99 & Under\", \"$\", \"9.99\", 9.99),\n    Example(None, \"běžná cena 459,00 Kč\", \"Kč\", \"459,00\", 459),\n    Example(None, \"$60.00\", \"$\", \"60.00\", 60),\n    Example(None, \"0,82 €\", \"€\", \"0,82\", 0.82),\n    Example(None, \"599 Kč\", \"Kč\", \"599\", 599),\n    Example(None, \"€10.90\", \"€\", \"10.90\", 10.90),\n    Example(None, \"299,00 EUR\", \"EUR\", \"299,00\", 299),\n    Example(None, \"naša cena 21,95 €\", \"€\", \"21,95\", 21.95),\n    Example(None, \"343,05 €\", \"€\", \"343,05\", 343.05),\n    Example(None, \"1 139,00 €\", \"€\", \"1 139,00\", 1139),\n    Example(None, \"157,000 تومان\", \"تومان\", \"157,000\", 157000),\n    Example(None, \"35.00\", None, \"35.00\", 35),\n    Example(None, \"8.000.000 ₫\", \"₫\", \"8.000.000\", 8000000),\n    Example(None, \"6790 Dinara\", \"Dinara\", \"6790\", 6790),\n    Example(None, \"3.99\", None, \"3.99\", 3.99),\n    Example(None, \"£ 165.00\", \"£\", \"165.00\", 165.00),\n    Example(None, \"$844,900\", \"$\", \"844,900\", 844900),\n    Example(None, \"140,00 pln\", \"pln\", \"140,00\", 140),\n    Example(None, \"2,99 €\", \"€\", \"2,99\", 2.99),\n    Example(None, \"145,00 lei\", \"lei\", \"145,00\", 145),\n    Example(None, \"3,90 €\", \"€\", \"3,90\", 3.90),\n    Example(None, \"$149.99\", \"$\", \"149.99\", 149.99),\n    Example(None, \"4,30 €\", \"€\", \"4,30\", 4.30),\n    Example(None, \"$36.95\", \"$\", \"36.95\", 36.95),\n    Example(None, \"2 499,00 zł\", \"zł\", \"2 499,00\", 2499),\n    Example(None, \"800 руб.\", \"руб.\", \"800\", 800),\n    Example(None, \"89.00\", None, \"89.00\", 89),\n    Example(None, \"3 100р.\", \"р.\", \"3 100\", 3100),\n    Example(None, \"0,85 €\", \"€\", \"0,85\", 0.85),\n    Example(None, \"35,95 €\", \"€\", \"35,95\", 35.95),\n    Example(None, \"$0.42\", \"$\", \"0.42\", 0.42),\n    Example(None, \"80,000 تومان\", \"تومان\", \"80,000\", 80000),\n    Example(None, \"550,00 € *\", \"€\", \"550,00\", 550),\n    Example(None, \"25,00 zł\", \"zł\", \"25,00\", 25),\n    Example(None, \"17,45 EUR\", \"EUR\", \"17,45\", 17.45),\n    Example(None, \"49,00 €\", \"€\", \"49,00\", 49),\n    Example(None, \"169.00\", None, \"169.00\", 169),\n    Example(None, \"8,99 €\", \"€\", \"8,99\", 8.99),\n    Example(None, \"1 099 Kč\", \"Kč\", \"1 099\", 1099),\n    Example(None, \"17.99\", None, \"17.99\", 17.99),\n    Example(None, \"$274.95\", \"$\", \"274.95\", 274.95),\n    Example(None, \"70,20 €\", \"€\", \"70,20\", 70.20),\n    Example(None, \"289,00 zł\", \"zł\", \"289,00\", 289),\n    Example(None, \"18,00 €\", \"€\", \"18,00\", 18),\n    Example(None, \"12,00 €\", \"€\", \"12,00\", 12),\n    Example(None, \"$19.97\", \"$\", \"19.97\", 19.97),\n    # Example(None, '(save $2.95)',\n    #         '$', None, None),\n    Example(None, \"749,00 euro\", \"euro\", \"749,00\", 749),\n    Example(None, \"$48.25\", \"$\", \"48.25\", 48.25),\n    Example(None, \"5.00\", None, \"5.00\", 5.00),\n    Example(None, \"18,00 € *\", \"€\", \"18,00\", 18),\n    Example(None, \"$3.00\", \"$\", \"3.00\", 3.00),\n    Example(None, \"1,85 EUR\", \"EUR\", \"1,85\", 1.85),\n    Example(None, \"4.25\", None, \"4.25\", 4.25),\n    Example(None, \"£1.20\", \"£\", \"1.20\", 1.20),\n    Example(None, \"$196.50\", \"$\", \"196.50\", 196.50),\n    Example(None, \"Price: $129.00\", \"$\", \"129.00\", 129.00),\n    Example(None, \"179,00 €\", \"€\", \"179,00\", 179.00),\n    Example(None, \"$80.00\", \"$\", \"80.00\", 80.00),\n    Example(None, \"14.50\", None, \"14.50\", 14.50),\n    Example(None, \"From $ 24.95\", \"$\", \"24.95\", 24.95),\n    Example(None, \"$5.11\", \"$\", \"5.11\", 5.11),\n    Example(None, \"EUR 6,99\", \"EUR\", \"6,99\", 6.99),\n    Example(None, \"40% OFF\", None, None, None),\n    Example(None, \"29.99\", None, \"29.99\", 29.99),\n    Example(None, \"14.00€\", \"€\", \"14.00\", 14.00),\n    Example(None, \"22.00\", None, \"22.00\", 22.00),\n    Example(None, \"$1000.00\", \"$\", \"1000.00\", 1000.00),\n    Example(None, \"$12.95\", \"$\", \"12.95\", 12.95),\n    Example(None, \"běžná cena 987,20 Kč\", \"Kč\", \"987,20\", 987.20),\n    Example(None, \"104,64 zł\", \"zł\", \"104,64\", 104.64),\n    Example(None, \"163,80 €\", \"€\", \"163,80\", 163.80),\n    Example(None, \"$89.00\", \"$\", \"89.00\", 89.00),\n    Example(None, \"1 600 руб.\", \"руб.\", \"1 600\", 1600),\n    Example(None, \"20,95 € *\", \"€\", \"20,95\", 20.95),\n    Example(None, \"9,50 €\", \"€\", \"9,50\", 9.50),\n    Example(None, \"170,00 €\", \"€\", \"170,00\", 170),\n    Example(None, \"170,00€\", \"€\", \"170,00\", 170),\n    Example(None, \"6.00\", None, \"6.00\", 6.00),\n    Example(None, \"$24.00\", \"$\", \"24.00\", 24.00),\n    Example(None, \"9.95\", None, \"9.95\", 9.95),\n    Example(None, \"34.12 (40.94 inc VAT)\", None, \"34.12\", 34.12),\n    Example(None, \"Rp 350.000\", \"Rp\", \"350.000\", 350000),\n    Example(None, \"$55.00\", \"$\", \"55.00\", 55.00),\n    Example(None, \"$595.00\", \"$\", \"595.00\", 595.00),\n    Example(None, \"7,00 €\", \"€\", \"7,00\", 7),\n    Example(None, \"119.95\", None, \"119.95\", 119.95),\n    Example(None, \"1.95\", None, \"1.95\", 1.95),\n    Example(None, \"390,00 €\", \"€\", \"390,00\", 390),\n    Example(None, \"3.24\", None, \"3.24\", 3.24),\n    Example(None, \"12 590 Kč\", \"Kč\", \"12 590\", 12590),\n    Example(None, \"330 Kč\", \"Kč\", \"330\", 330),\n    Example(None, \"8 500 руб.\", \"руб.\", \"8 500\", 8500),\n    Example(None, \"589,00 €\", \"€\", \"589,00\", 589),\n    Example(None, \"1,099.99\", None, \"1,099.99\", 1099.99),\n    Example(None, \"14 196 Р\", \"Р\", \"14 196\", 14196),\n    Example(None, \"19.00\", None, \"19.00\", 19.00),\n    Example(None, \"870 Kč\", \"Kč\", \"870\", 870),\n    Example(None, \"59,00 €\", \"€\", \"59,00\", 59),\n    Example(None, \"Pris från 172 kr\", \"kr\", \"172\", 172),\n    Example(None, \"1 573 Kč\", \"Kč\", \"1 573\", 1573),\n    Example(None, \"$2.99\", \"$\", \"2.99\", 2.99),\n    Example(None, \"13,90 €\", \"€\", \"13,90\", 13.90),\n    Example(None, \"29.95\", None, \"29.95\", 29.95),\n    Example(None, \"/\", None, None, None),\n    Example(None, \"16,90 €\", \"€\", \"16,90\", 16.90),\n    Example(None, \"149.95\", None, \"149.95\", 149.95),\n    Example(None, \"8.90\", None, \"8.90\", 8.90),\n    Example(None, \"419\", None, \"419\", 419),\n    Example(None, \"$50.00\", \"$\", \"50.00\", 50.00),\n    Example(None, \"3 291,00 €\", \"€\", \"3 291,00\", 3291),\n    Example(None, \"13,00 €\", \"€\", \"13,00\", 13),\n    Example(None, \"DKK 449,00\", \"DKK\", \"449,00\", 449),\n    Example(None, \"$20.00\", \"$\", \"20.00\", 20.00),\n    Example(None, \"$154\", \"$\", \"154\", 154),\n    Example(None, \"22.48\", None, \"22.48\", 22.48),\n    Example(None, \"20,00 EUR\", \"EUR\", \"20,00\", 20),\n    Example(None, \"73,460 €\", \"€\", \"73,460\", 73460),\n    Example(None, \"850 руб\", \"руб\", \"850\", 850),\n    Example(None, \"$14.99\", \"$\", \"14.99\", 14.99),\n    Example(None, \"$79.95\", \"$\", \"79.95\", 79.95),\n    Example(None, \"40,00 €\", \"€\", \"40,00\", 40),\n    Example(None, \"149,98 €\", \"€\", \"149,98\", 149.98),\n    Example(None, \"1 150 грн.\", \"грн.\", \"1 150\", 1150),\n    Example(None, \"399.00\", None, \"399.00\", 399.00),\n    Example(None, \"33,90 €\", \"€\", \"33,90\", 33.90),\n    Example(None, \"79,50 €\", \"€\", \"79,50\", 79.50),\n    Example(None, \"40 130\", None, \"40 130\", 40130),\n    Example(None, \"$69.99\", \"$\", \"69.99\", 69.99),\n    Example(None, \"1 090 Kč\", \"Kč\", \"1 090\", 1090),\n    Example(None, \"395 Kč\", \"Kč\", \"395\", 395),\n    Example(None, \"53,95 €\", \"€\", \"53,95\", 53.95),\n    Example(None, \"£0.99\", \"£\", \"0.99\", 0.99),\n    Example(None, \"5,60 € *\", \"€\", \"5,60\", 5.60),\n    Example(None, \"29,50 zł\", \"zł\", \"29,50\", 29.50),\n    Example(None, \"2 990\", None, \"2 990\", 2990),\n    Example(None, \"0,00\", None, \"0,00\", 0),\n    Example(None, \"$24.99 with card\", \"$\", \"24.99\", 24.99),\n    Example(None, \"18,00€\", \"€\", \"18,00\", 18),\n    Example(None, \"€600,00\", \"€\", \"600,00\", 600),\n    Example(None, \"£25.00 (tax incl.)\", \"£\", \"25.00\", 25),\n    Example(None, \"8,55 €\", \"€\", \"8,55\", 8.55),\n    Example(None, \"1,422.50\", None, \"1,422.50\", 1422.50),\n    Example(None, \"244,00 €\", \"€\", \"244,00\", 244.00),\n    Example(None, \"12,90 €\", \"€\", \"12,90\", 12.90),\n    Example(None, \"12 900,00 руб\", \"руб\", \"12 900,00\", 12900),\n    Example(None, \"1.727 Ft\", \"Ft\", \"1.727\", 1727),\n    Example(None, \"79,00 €\", \"€\", \"79,00\", 79),\n    Example(None, \"NZD $100.70\", \"NZD\", \"100.70\", 100.70),\n    Example(None, \"479.00\", None, \"479.00\", 479.00),\n    Example(None, \"$ 69.00\", \"$\", \"69.00\", 69.00),\n    Example(None, \"135,00 €\", \"€\", \"135,00\", 135.00),\n    Example(None, \"25.00\", None, \"25.00\", 25.0),\n    Example(None, \"94,90 €\", \"€\", \"94,90\", 94.90),\n    Example(None, \"149.99\", None, \"149.99\", 149.99),\n    Example(None, \"44,00 €\", \"€\", \"44,00\", 44.00),\n    Example(None, \"$24.99\", \"$\", \"24.99\", 24.99),\n    Example(None, \"22,00 EUR\", \"EUR\", \"22,00\", 22.00),\n    Example(None, \"89,90 €\", \"€\", \"89,90\", 89.90),\n    Example(None, \"$24.95\", \"$\", \"24.95\", 24.95),\n    Example(None, \"£ 1.99\", \"£\", \"1.99\", 1.99),\n    Example(None, \"1 099,00 zł\", \"zł\", \"1 099,00\", 1099),\n    Example(None, \"běžná cena 28 270,00 Kč\", \"Kč\", \"28 270,00\", 28270),\n    Example(None, \"da € 72.00\", \"€\", \"72.00\", 72.00),\n    Example(None, \"$15.95\", \"$\", \"15.95\", 15.95),\n    Example(None, \"تومان56,000\", \"تومان\", \"56,000\", 56000),\n    Example(None, \"$1,695.00\", \"$\", \"1,695.00\", 1695.00),\n    Example(None, \"£595.00\", \"£\", \"595.00\", 595.00),\n    Example(None, \"$11.95\", \"$\", \"11.95\", 11.95),\n    Example(None, \"290,00 Kč\", \"Kč\", \"290,00\", 290),\n    Example(None, \"199.90 Fr.\", \"Fr.\", \"199.90\", 199.90),\n    Example(None, \"197 PLN\", \"PLN\", \"197\", 197),\n    Example(None, \"9.99\", None, \"9.99\", 9.99),\n    Example(None, \"$56.00\", \"$\", \"56.00\", 56.00),\n    Example(None, \"4 980 Kč\", \"Kč\", \"4 980\", 4980),\n    Example(None, \"124,00 €\", \"€\", \"124,00\", 124),\n    Example(None, \"$104.99\", \"$\", \"104.99\", 104.99),\n    Example(None, \"39,00 €\", \"€\", \"39,00\", 39),\n    Example(None, \"1 029,00 €\", \"€\", \"1 029,00\", 1029),\n    Example(None, \"Běžná cena 299,00 Kč\", \"Kč\", \"299,00\", 299),\n    Example(None, \"745,00 €\", \"€\", \"745,00\", 745),\n    Example(None, \"$89.00\", \"$\", \"89.00\", 89),\n    Example(None, \"$29.95\", \"$\", \"29.95\", 29.95),\n    Example(None, \"2.00\", None, \"2.00\", 2.00),\n    Example(None, \"249.99\", None, \"249.99\", 249.99),\n    Example(None, \"24.99\", None, \"24.99\", 24.99),\n    Example(None, \"1 499 Kč\", \"Kč\", \"1 499\", 1499),\n    Example(None, \"199,95 €\", \"€\", \"199,95\", 199.95),\n    Example(None, \"6,00 €\", \"€\", \"6,00\", 6),\n    Example(None, \"$28.49\", \"$\", \"28.49\", 28.49),\n    Example(None, \"200.000 đ\", \"đ\", \"200.000\", 200000),\n    Example(None, \"9,24 €\", \"€\", \"9,24\", 9.24),\n    Example(None, \"48,00 €\", \"€\", \"48,00\", 48.00),\n    Example(None, \"Cena : 890 Kč\", \"Kč\", \"890\", 890),\n    Example(None, \"790.00\", None, \"790.00\", 790.00),\n    Example(None, \"17 260 руб.\", \"руб.\", \"17 260\", 17260),\n    Example(None, \"227,000 تومان\", \"تومان\", \"227,000\", 227000),\n    Example(None, \"295,88 €\", \"€\", \"295,88\", 295.88),\n    Example(None, \"£1399\", \"£\", \"1399\", 1399),\n    Example(None, \"11,33 Br\", \"Br\", \"11,33\", 11.33),\n    Example(None, \"325.95\", None, \"325.95\", 325.95),\n    Example(None, \"$19.50\", \"$\", \"19.50\", 19.50),\n    Example(None, \"19,00 €\", \"€\", \"19,00\", 19),\n    Example(None, \"2 999,00 €\", \"€\", \"2 999,00\", 2999),\n    Example(None, \"49.95\", None, \"49.95\", 49.95),\n    Example(None, \"99 LEI\", \"LEI\", \"99\", 99),\n    Example(None, \"249 Kč\", \"Kč\", \"249\", 249),\n    Example(None, \"3.79\", None, \"3.79\", 3.79),\n    Example(None, \"běžná cena 890 Kč\", \"Kč\", \"890\", 890),\n    Example(None, \"$809,000\", \"$\", \"809,000\", 809000),\n    Example(None, \"450 000 ₫\", \"₫\", \"450 000\", 450000),\n    Example(None, \"30,00 €\", \"€\", \"30,00\", 30.00),\n    Example(None, \"14.95\", None, \"14.95\", 14.95),\n    Example(None, \"12.50\", None, \"12.50\", 12.50),\n    Example(None, \"129,00 € (-15%)\", \"€\", \"129,00\", 129.00),\n    Example(None, \"12,90 €\", \"€\", \"12,90\", 12.90),\n    Example(None, \"A partir de 11,70 €\", \"€\", \"11,70\", 11.70),\n    Example(None, \"15.49\", None, \"15.49\", 15.49),\n    Example(None, \"12.34 €\", \"€\", \"12.34\", 12.34),\n    Example(None, \"€799,00\", \"€\", \"799,00\", 799),\n    Example(None, \"230 лв.\", \"лв.\", \"230\", 230),\n    Example(None, \"14.55 €\", \"€\", \"14.55\", 14.55),\n    Example(None, \"133,86 LEI\", \"LEI\", \"133,86\", 133.86),\n    Example(None, \"7 990,00 Kč\", \"Kč\", \"7 990,00\", 7990),\n    Example(None, \"350.00\", None, \"350.00\", 350.00),\n    Example(None, \"Cena: 55,72 zł brutto\", \"zł\", \"55,72\", 55.72),\n    Example(None, \"O blenderach Omniblend\", None, None, None),\n    Example(None, \"3,822.00\", None, \"3,822.00\", 3822),\n    Example(None, \"0,15 €\", \"€\", \"0,15\", 0.15),\n    Example(None, \"430,00 €\", \"€\", \"430,00\", 430),\n    Example(None, \"$29.00\", \"$\", \"29.00\", 29.00),\n    Example(None, \"39.99\", None, \"39.99\", 39.99),\n    Example(None, \"$15.00\", \"$\", \"15.00\", 15.00),\n    Example(None, \"21,00 Lei\", \"Lei\", \"21,00\", 21.00),\n    Example(None, \"naše cena 250,00 Kč\", \"Kč\", \"250,00\", 250.00),\n    Example(None, \"$24.95\", \"$\", \"24.95\", 24.95),\n    Example(None, \"162.18\", None, \"162.18\", 162.18),\n    Example(None, \"39,60 EUR\", \"EUR\", \"39,60\", 39.60),\n    Example(None, \"10,75 €\", \"€\", \"10,75\", 10.75),\n    Example(None, \"219 руб.\", \"руб.\", \"219\", 219),\n    Example(None, \"89,00 € *\", \"€\", \"89,00\", 89.00),\n    Example(None, \"151,200 تومان\", \"تومان\", \"151,200\", 151200),\n    Example(None, \"$159.99\", \"$\", \"159.99\", 159.99),\n    Example(None, \"2.49\", None, \"2.49\", 2.49),\n    Example(None, \"7.38\", None, \"7.38\", 7.38),\n    Example(None, \"62,00 zł\", \"zł\", \"62,00\", 62.00),\n    Example(None, \"$20.00\", \"$\", \"20.00\", 20),\n    Example(None, \"$ 50.00\", \"$\", \"50.00\", 50),\n    Example(None, \"34.99\", None, \"34.99\", 34.99),\n    Example(None, \"318,00 €\", \"€\", \"318,00\", 318),\n    Example(None, \"11.499,00 EUR\", \"EUR\", \"11.499,00\", 11499),\n    Example(None, \"571.12坪\", None, \"571.12\", 571.12),  # area, not currency\n    Example(None, \"€ 75.00\", \"€\", \"75.00\", 75.00),\n    Example(None, \"11,90 € *\", \"€\", \"11,90\", 11.90),\n    Example(None, \"€0.51\", \"€\", \"0.51\", 0.51),\n    Example(None, \"6,50 €\", \"€\", \"6,50\", 6.50),\n    Example(None, \"790 Kč\", \"Kč\", \"790\", 790),\n    Example(None, \"ab 2.99 €\", \"€\", \"2.99\", 2.99),\n    Example(None, \"369\", None, \"369\", 369),\n    Example(None, \"134.96\", None, \"134.96\", 134.96),\n    Example(None, \"135 lei\", \"lei\", \"135\", 135),\n    Example(None, \"2,99 € *\", \"€\", \"2,99\", 2.99),\n    Example(None, \"$9.99\", \"$\", \"9.99\", 9.99),\n    Example(None, \"2.950,00 €\", \"€\", \"2.950,00\", 2950),\n    Example(None, \"19.99\", None, \"19.99\", 19.99),\n    Example(None, \"49 lei\", \"lei\", \"49\", 49),\n    Example(None, \"31,07 € (bez DPH)\", \"€\", \"31,07\", 31.07),\n    Example(None, \"56.00\", None, \"56.00\", 56.00),\n    Example(None, \"54.95\", None, \"54.95\", 54.95),\n    Example(None, \"$ 80.00\", \"$\", \"80.00\", 80.00),\n    Example(None, \"$39.00\", \"$\", \"39.00\", 39.00),\n    Example(None, \"Rp 221.000\", \"Rp\", \"221.000\", 221000),\n    Example(None, \"35,90 EUR\", \"EUR\", \"35,90\", 35.90),\n    Example(None, \"4 835,50 €\", \"€\", \"4 835,50\", 4835.50),\n    Example(None, \"75,00€\", \"€\", \"75,00\", 75),\n    Example(None, \"$21.95\", \"$\", \"21.95\", 21.95),\n    Example(None, \"737,00\", None, \"737,00\", 737),\n    Example(None, \"129,00 € **\", \"€\", \"129,00\", 129),\n    Example(None, \"2 399 Kč\", \"Kč\", \"2 399\", 2399),\n    Example(None, \"430 руб\", \"руб\", \"430\", 430),\n    Example(None, \"69.95\", None, \"69.95\", 69.95),\n    Example(None, \"$0.00\", \"$\", \"0.00\", 0),\n    Example(None, \"49.56\", None, \"49.56\", 49.56),\n    Example(None, \"0,00 EUR\", \"EUR\", \"0,00\", 0),\n    Example(None, \"145,00 Kč\", \"Kč\", \"145,00\", 145),\n    Example(None, \"99,00 lei\", \"lei\", \"99,00\", 99),\n    Example(None, \"$750,000\", \"$\", \"750,000\", 750000),\n    Example(None, \"$49.99\", \"$\", \"49.99\", 49.99),\n    Example(None, \"29.00\", None, \"29.00\", 29.00),\n    Example(None, \"$7.20\", \"$\", \"7.20\", 7.20),\n    Example(None, \"69.00\", None, \"69.00\", 69.00),\n    Example(None, \"4.47\", None, \"4.47\", 4.47),\n    Example(None, \"39,90 € *\", \"€\", \"39,90\", 39.90),\n    Example(None, \"469,00 €\", \"€\", \"469,00\", 469),\n    Example(None, \"24.38\", None, \"24.38\", 24.38),\n    Example(None, \"6,24\", None, \"6,24\", 6.24),\n    Example(None, \"$89.00\", \"$\", \"89.00\", 89.00),\n    Example(None, \"24,35 €\", \"€\", \"24,35\", 24.35),\n    Example(None, \"Pris från 805 kr\", \"kr\", \"805\", 805),\n    Example(None, \"295 Kč\", \"Kč\", \"295\", 295),\n    Example(None, \"175.00\", None, \"175.00\", 175.00),\n    Example(None, \"7 990 kr\", \"kr\", \"7 990\", 7990),\n    Example(None, \"14,00 €\", \"€\", \"14,00\", 14),\n    Example(None, \"249 Kč\", \"Kč\", \"249\", 249),\n    Example(None, \"£39.95\", \"£\", \"39.95\", 39.95),\n    Example(None, \"10,75 TL\", \"TL\", \"10,75\", 10.75),\n    Example(None, \"$25.00\", \"$\", \"25.00\", 25.00),\n    Example(None, \"1 720,00 zł\", \"zł\", \"1 720,00\", 1720),\n    Example(None, \"běžná cena 749 Kč\", \"Kč\", \"749\", 749),\n    Example(None, \"425,00 €\", \"€\", \"425,00\", 425),\n    Example(None, \"59.00\", None, \"59.00\", 59.00),\n    Example(None, \"1,120.00\", None, \"1,120.00\", 1120),\n    Example(None, \"a partire da 7,32 € *\", \"€\", \"7,32\", 7.32),\n    Example(None, \"148.50 Inc GST\", None, \"148.50\", 148.50),  # India?\n    Example(None, \"7.49\", None, \"7.49\", 7.49),\n    Example(None, \"80.00\", None, \"80.00\", 80.00),\n    Example(None, \"93 499 Kč\", \"Kč\", \"93 499\", 93499),\n    Example(None, \"1.599,00 € *\", \"€\", \"1.599,00\", 1599),\n    Example(None, \"ab 3,63 EUR\", \"EUR\", \"3,63\", 3.63),\n    Example(None, \"29,90 EUR\", \"EUR\", \"29,90\", 29.90),\n    Example(None, \"$3.95\", \"$\", \"3.95\", 3.95),\n    Example(None, \"3430 лв.\", \"лв.\", \"3430\", 3430),\n    Example(None, \"724,00 €\", \"€\", \"724,00\", 724),\n    Example(None, \"18,00 €\", \"€\", \"18,00\", 18),\n    Example(None, \"6,75 €\", \"€\", \"6,75\", 6.75),\n    Example(None, \"29,90 € *\", \"€\", \"29,90\", 29.90),\n    Example(None, \"135.99\", None, \"135.99\", 135.99),\n    Example(None, \"30,000 تومان\", \"تومان\", \"30,000\", 30000),\n    # Example(None, '191.6 KB',\n    #         None, None, None),\n    Example(None, \"1 500 Kč\", \"Kč\", \"1 500\", 1500),\n    Example(None, \"349,00 €\", \"€\", \"349,00\", 349),\n    Example(None, \"$250.00\", \"$\", \"250.00\", 250.00),\n    Example(None, \"44.95\", None, \"44.95\", 44.95),\n    Example(None, \"$22.75\", \"$\", \"22.75\", 22.75),\n    Example(None, \"250,00 €\", \"€\", \"250,00\", 250),\n    Example(None, \"14.96 €\", \"€\", \"14.96\", 14.96),\n    Example(None, \"$4,350.00\", \"$\", \"4,350.00\", 4350),\n    Example(None, \"379 Kč\", \"Kč\", \"379\", 379),\n    Example(None, \"19,50 EUR\", \"EUR\", \"19,50\", 19.5),\n    Example(None, \"33,68 zł\", \"zł\", \"33,68\", 33.68),\n    Example(None, \"6.70€\", \"€\", \"6.70\", 6.70),\n    Example(None, \"$29.99\", \"$\", \"29.99\", 29.99),\n    Example(None, \"6.50\", None, \"6.50\", 6.50),\n]\n\n\nPRICE_PARSING_EXAMPLES_3 = [\n    Example(\"R$\", \"R$ 139,99 R$ 135,99\", \"R$\", \"139,99\", 139.99),\n    Example(\"£\", \"£ 34.99\", \"£\", \"34.99\", 34.99),\n    Example(\"Price\", \"$7.65\", \"$\", \"7.65\", 7.65),\n    Example(\"€\", \"75,00\", \"€\", \"75,00\", 75),\n    Example(None, \"34,90 €\", \"€\", \"34,90\", 34.90),\n    Example(None, \"629.95\", None, \"629.95\", 629.95),\n    Example(\"11000 руб.\", \"47700 руб.\", \"руб.\", \"47700\", 47700),\n    Example(\"$29.99 – $74.99\", \"$29.99\", \"$\", \"29.99\", 29.99),\n    Example(None, \"174,00 €\", \"€\", \"174,00\", 174),\n    Example(None, \"18,00 €\", \"€\", \"18,00\", 18),\n    Example(\"Price:\", \"$19.50\", \"$\", \"19.50\", 19.50),\n    Example(\"8 390 руб.\", \"8 390 руб.\", \"руб.\", \"8 390\", 8390),\n    Example(None, \"55,00 €\", \"€\", \"55,00\", 55),\n    Example(\"€333.00\", \"€299.71\", \"€\", \"299.71\", 299.71),\n    Example(None, \"384,00 €\", \"€\", \"384,00\", 384),\n    Example(\"From:\", \"From: $14.97\", \"$\", \"14.97\", 14.97),\n    Example(None, \"0,00 €\", \"€\", \"0,00\", 0),\n    Example(None, \"€ 280,00\", \"€\", \"280,00\", 280),\n    Example(None, \"11 450 Kč\", \"Kč\", \"11 450\", 11450),\n    Example(\"Price $118.15\", \"$118.15\", \"$\", \"118.15\", 118.15),\n    Example(\"€\", \"49.99\", \"€\", \"49.99\", 49.99),\n    Example(\"1,15 €\", \"1,15 €\", \"€\", \"1,15\", 1.15),\n    Example(\"17,99 €\", \"31,93 €\", \"€\", \"31,93\", 31.93),\n    Example(None, \"र24,401\", \"र\", \"24,401\", 24401),\n    Example(None, \"$60.00\", \"$\", \"60.00\", 60),\n    Example(\"12,15 €\", \"12,15 €\", \"€\", \"12,15\", 12.15),\n    Example(\"£ 163.95\", \"163.95\", \"£\", \"163.95\", 163.95),\n    Example(None, \"30,00 €\", \"€\", \"30,00\", 30),\n    Example(\"zł\", \"165,00 zł\", \"zł\", \"165,00\", 165),\n    Example(\"469.00zł Bez podatku: 381.30zł\", \"469.00zł\", \"zł\", \"469.00\", 469),\n    Example(None, \"72.95\", None, \"72.95\", 72.95),\n    Example(\"Costo: $2,222.- Más IVA\", \"MX$3,179.00\", \"MX$\", \"3,179.00\", 3179),\n    Example(None, \"naše cena 4 370 Kč\", \"Kč\", \"4 370\", 4370),\n    Example(\"€\", \"21,33 €\", \"€\", \"21,33\", 21.33),\n    Example(None, \"49.95\", None, \"49.95\", 49.95),\n    Example(None, \"Před slevou 59 900 Kč\", \"Kč\", \"59 900\", 59900),\n    Example(\"ab\", \"6,78 € *\", \"€\", \"6,78\", 6.78),\n    Example(None, \"442\", None, \"442\", 442),\n    Example(\"18.10 €\", \"16.00 €\", \"€\", \"16.00\", 16.00),\n    Example(None, \"0.00\", None, \"0.00\", 0.00),\n    Example(None, \"379,00 € *\", \"€\", \"379,00\", 379.00),\n    Example(None, \"125.00\", None, \"125.00\", 125.00),\n    Example(None, \"£ 30.84\", \"£\", \"30.84\", 30.84),\n    Example(None, \"259,00 €\", \"€\", \"259,00\", 259),\n    Example(\"à partir de 1540 € / pers\", \"1540 €\", \"€\", \"1540\", 1540),\n    Example(None, \"95 €\", \"€\", \"95\", 95),\n    Example(None, \"53.79\", None, \"53.79\", 53.79),\n    Example(\"NT$\", \"NT$ 1,160\", \"NT$\", \"1,160\", 1160),\n    Example(\"ACTIVE\", \"$69,900\", \"$\", \"69,900\", 69900),\n    Example(None, \"$14.95\", \"$\", \"14.95\", 14.95),\n    Example(\"₹\", \"₹ 4649\", \"₹\", \"4649\", 4649),\n    Example(\"25 грн\", \"25 грн\", \"грн\", \"25\", 25),\n    Example(\"€\", \"16,40\", \"€\", \"16,40\", 16.40),\n    Example(\"PLN\", \"0,46\", \"PLN\", \"0,46\", 0.46),\n    Example(\"£\", \"£ 261.25\", \"£\", \"261.25\", 261.25),\n    Example(None, \"$0.00\", \"$\", \"0.00\", 0),\n    Example(None, \"24.95\", None, \"24.95\", 24.95),\n    Example(\"грн.\", \"27.00\", \"грн.\", \"27.00\", 27.00),\n    Example(\"New\", \"$189,900\", \"$\", \"189,900\", 189900),\n    Example(\"NA\", \"$269\", \"$\", \"269\", 269),\n    Example(\"$279\", \"$189\", \"$\", \"189\", 189),\n    Example(None, \"160,00 zł\", \"zł\", \"160,00\", 160),\n    Example(\"2 069 рублей\", \"2 400\", \"руб\", \"2 400\", 2400),\n    Example(\"Sale Price: $4.59\", \"$4.59\", \"$\", \"4.59\", 4.59),\n    Example(\"Купить\", \"542 руб.\", \"руб.\", \"542\", 542),\n    Example(None, \"$19.99\", \"$\", \"19.99\", 19.99),\n    Example(\"Price\", \"$6.45\", \"$\", \"6.45\", 6.45),\n    Example(None, \"32.99\", None, \"32.99\", 32.99),\n    Example(None, \"$86.44\", \"$\", \"86.44\", 86.44),\n    Example(None, \"25.00€\", \"€\", \"25.00\", 25.00),\n    Example(None, \"99,00 €\", \"€\", \"99,00\", 99.00),\n    Example(None, \"103.90\", None, \"103.90\", 103.90),\n    Example(\"14,00 € *\", \"25,00 € *\", \"€\", \"25,00\", 25.00),\n    Example(None, \"$6.49\", \"$\", \"6.49\", 6.49),\n    Example(\"€ 59,95\", \"€ 59,95\", \"€\", \"59,95\", 59.95),\n    Example(None, \"Běžná cena 75 990,00 Kč\", \"Kč\", \"75 990,00\", 75990),\n    Example(\"Price\", \"Rp 1.550.000\", \"Rp\", \"1.550.000\", 1550000),\n    Example(\"грн.\", \"1 430\", \"грн.\", \"1 430\", 1430),\n    Example(\"руб. (шт)\", \"1 690,54 руб. (шт)\", \"руб.\", \"1 690,54\", 1690.54),\n    Example(\"69 TL 41.90 TL\", \"69 TL 41.90 TL\", \"TL\", \"69\", 69),\n    Example(\"ALIDAD\", \"960,00 €\", \"€\", \"960,00\", 960),\n    Example(None, \"184,35 lei\", \"lei\", \"184,35\", 184.35),\n    Example(None, \"1 505 Kč\", \"Kč\", \"1 505\", 1505),\n    Example(None, \"23,00 € *\", \"€\", \"23,00\", 23),\n    Example(None, \"25.97\", None, \"25.97\", 25.97),\n    Example(None, \"58,19 €\", \"€\", \"58,19\", 58.19),\n    Example(None, \"27.00 лв.\", \"лв.\", \"27.00\", 27.00),\n    Example(\"48,00 €\", \"3,85 €\", \"€\", \"3,85\", 3.85),\n    Example(None, \"10,90 €\", \"€\", \"10,90\", 10.90),\n    Example(\"$ 879.0\", \"$ 879.0\", \"$\", \"879.0\", 879.0),\n    Example(\"EUR\", \"25.88\", \"EUR\", \"25.88\", 25.88),\n    Example(None, \"R$215,10\", \"R$\", \"215,10\", 215.10),\n    Example(\"£\", \"£ 12.50\", \"£\", \"12.50\", 12.50),\n    Example(None, \"3 173,00 €\", \"€\", \"3 173,00\", 3173),\n    Example(None, \"34,94 € *\", \"€\", \"34,94\", 34.94),\n    Example(None, \"Ops!\", None, None, None),\n    Example(None, \"392. 00\", None, \"392. 00\", 392),\n    Example(\"€\", \"213,62\", \"€\", \"213,62\", 213.62),\n    Example(\"3,00 €\", \"3,00 €\", \"€\", \"3,00\", 3),\n    Example(\"£0.00\", \"£0.00\", \"£\", \"0.00\", 0.00),\n    Example(\"€\", \"10 990,00\", \"€\", \"10 990,00\", 10990),\n    Example(None, \"€ 24,95\", \"€\", \"24,95\", 24.95),\n    Example(None, \"Not Available\", None, None, None),\n    Example(None, \"$19.99\", \"$\", \"19.99\", 19.99),\n    Example(\"Р\", \"15 130 Р\", \"Р\", \"15 130\", 15130),\n    Example(\"$5.95\", \"$5.95\", \"$\", \"5.95\", 5.95),\n    Example(None, \"199,99 €\", \"€\", \"199,99\", 199.99),\n    Example(\"Code\", \"£23.40\", \"£\", \"23.40\", 23.40),\n    Example(\"$29.99\", \"$29.99\", \"$\", \"29.99\", 29.99),\n    Example(None, \"795\", None, \"795\", 795),\n    Example(\n        (\n            \"Sorry, this item is currently out of stock but you can still\"\n            \" order, we will send as soon a product arrives\"\n        ),\n        \"34.99\",\n        None,\n        \"34.99\",\n        34.99,\n    ),\n    Example(\"Our Price: $149.95\", \"Our Price: $149.95\", \"$\", \"149.95\", 149.95),\n    Example(\"$119.95\", \"$119.95\", \"$\", \"119.95\", 119.95),\n    Example(None, \"339 грн\", \"грн\", \"339\", 339),\n    Example(\"$0.00\", \"$0.00\", \"$\", \"0.00\", 0.00),\n    Example(\"€\", \"79,00\", \"€\", \"79,00\", 79.00),\n    Example(None, \"378.00\", None, \"378.00\", 378.00),\n    Example(None, \"Pure & IP BP Ph. Eur. USP ACS AR LR\", None, None, None),\n    Example(None, \"$356.03\", \"$\", \"356.03\", 356.03),\n    Example(\"naše cena\", \"běžná cena 890 Kč\", \"Kč\", \"890\", 890),\n    Example(None, \"$49.99\", \"$\", \"49.99\", 49.99),\n    Example(None, \"5 550 Kč\", \"Kč\", \"5 550\", 5550),\n    Example(None, \"5 770 Kč\", \"Kč\", \"5 770\", 5770),\n    Example(None, \"Free!\", None, \"0\", 0),\n    Example(\"194 ₹\", \"199 ₹\", \"₹\", \"199\", 199),\n    Example(\"5€\", \"16,50 € *\", \"€\", \"16,50\", 16.50),\n    Example(None, \"$42.95\", \"$\", \"42.95\", 42.95),\n    Example(None, \"1.837, 32 €\", \"€\", \"1.837, 32\", 1837.32),\n    Example(\"$\", \"$ 791.00 $ 479.00\", \"$\", \"791.00\", 791.00),\n    Example(None, \"$69.30\", \"$\", \"69.30\", 69.30),\n    Example(None, \"$163,900\", \"$\", \"163,900\", 163900),\n    Example(None, \"36.95\", None, \"36.95\", 36.95),\n    Example(\"Rp 235.000\", \"Rp 235.000\", \"Rp\", \"235.000\", 235000),\n    Example(\"£\", \"11,13 €\", \"€\", \"11,13\", 11.13),\n    Example(None, \"160,00 lei\", \"lei\", \"160,00\", 160),\n    Example(\"3 300 руб\", \"3 300 руб\", \"руб\", \"3 300\", 3300),\n    Example(\"Р\", \"4 690 Р\", \"Р\", \"4 690\", 4690),\n    Example(\"189,00 € *\", \"189,00 € *\", \"€\", \"189,00\", 189),\n    Example(\"€\", None, \"€\", None, None),\n    Example(\"$ 30.00\", \"$ 30.00\", \"$\", \"30.00\", 30.00),\n    Example(\"$\", \"$ 5.95\", \"$\", \"5.95\", 5.95),\n    Example(\"£62.90\", \"£74.00\", \"£\", \"74.00\", 74.00),\n    Example(None, \"158,24 €\", \"€\", \"158,24\", 158.24),\n    Example(None, \"550,00 лв\", \"лв\", \"550,00\", 550),\n    Example(\"7,25 € *\", \"7,25 € *\", \"€\", \"7,25\", 7.25),\n    Example(None, \"94,000 تومان\", \"تومان\", \"94,000\", 94000),\n    Example(None, \"$8.27\", \"$\", \"8.27\", 8.27),\n    Example(\"Đã có VAT\", \"12.500 ₫\", \"₫\", \"12.500\", 12500),\n    Example(None, \"27.50\", None, \"27.50\", 27.50),\n    Example(\"23.90\", \"23.90\", None, \"23.90\", 23.90),\n    Example(\"Р\", \"18 000 Р\", \"Р\", \"18 000\", 18000),\n    Example(None, \"48,96 €\", \"€\", \"48,96\", 48.96),\n    Example(\"DKK\", \"199 DKK\", \"DKK\", \"199\", 199),\n    Example(\"Price: £6.95 - £9.95\", \"£6.95 - £9.95\", \"£\", \"6.95\", 6.95),\n    Example(None, \"599.97\", None, \"599.97\", 599.97),\n    Example(None, \"$40.00\", \"$\", \"40.00\", 40.00),\n    Example(\"Cena 300,00 Kč\", \"100,00 Kč\", \"Kč\", \"100,00\", 100),\n    Example(\"18,25 €\", \"18,25 €\", \"€\", \"18,25\", 18.25),\n    Example(None, \"29,00 €\", \"€\", \"29,00\", 29),\n    Example(\"€\", \"€ 39,95\", \"€\", \"39,95\", 39.95),\n    Example(None, \"32.00\", None, \"32.00\", 32.00),\n    Example(None, \"32.99\", None, \"32.99\", 32.99),\n    Example(\"HUF\", \"39000\", \"HUF\", \"39000\", 39000),\n    Example(None, \"850,000 ریال\", \"ریال\", \"850,000\", 850000),\n    Example(None, \"24,00 €\", \"€\", \"24,00\", 24.00),\n    Example(\"Versand\", \"CHF 19.90\", \"CHF\", \"19.90\", 19.90),\n    Example(\"\", \"530,42 Zł\", \"Zł\", \"530,42\", 530.42),\n    Example(None, \"Was: $124.95 Now: $0.00\", \"$\", \"124.95\", 124.95),\n    Example(None, \"Our Price 344.99 - 444.99\", None, \"344.99\", 344.99),\n    Example(None, \"3089.9 *\", None, \"3089.9\", 3089.9),\n    Example(None, \"40.00/each\", None, \"40.00\", 40.00),\n    Example(None, \"105. –\", None, \"105.\", 105.0),\n    Example(None, \"1.899,-\", None, \"1.899\", 1899.0),\n    Example(None, \"Sheet Set\", None, None, None),\n    Example(None, \"36. 24\", None, \"36. 24\", 36.24),\n    Example(None, \"32جن\", None, \"32\", 32.0),  # جن is not a currency\n    Example(None, \"Price 29\", None, \"29\", 29.0),\n    Example(\n        None,\n        \"559. 99 undefined 559.99 inkl. MwSt. zzgl. Versand\",\n        None,\n        \"559. 99\",\n        559.99,\n    ),\n    Example(None, \"$36 /\", \"$\", \"36\", 36.0),\n    Example(None, \"1.800.000₫\", \"₫\", \"1.800.000\", 1800000.0),  # Vietnamese dong (VND)\n    Example(None, \"0,40 LEI\", \"LEI\", \"0,40\", 0.4),  # Romanian Leu (RON)\n    Example(None, \"R$ 1.500,00\", \"R$\", \"1.500,00\", 1500.0),\n    Example(None, \"$ 8. 94\", \"$\", \"8. 94\", 8.94),\n    Example(None, \"$30.56/Month\", \"$\", \"30.56\", 30.56),\n    Example(None, \"from $742.50\", \"$\", \"742.50\", 742.5),\n    Example(None, \"25,00 € *\", \"€\", \"25,00\", 25.0),\n    Example(None, \"$3,690.00 (ea)\", \"$\", \"3,690.00\", 3690.0),\n    Example(None, \"AED 26.30\", \"AED\", \"26.30\", 26.3),\n    Example(None, \"15,000 руб.\", \"руб.\", \"15,000\", 15000.0),\n    Example(None, \"$5,246.58\", \"$\", \"5,246.58\", 5246.58),\n    Example(None, \"118, 99 TL\", \"TL\", \"118, 99\", 118.99),\n    Example(None, \"$575.00*\", \"$\", \"575.00\", 575.0),\n    Example(None, \"150 kr\", \"kr\", \"150\", 150.0),\n    Example(None, \"Estimate Price: $45,000 - $70,000\", \"$\", \"45,000\", 45000.0),\n    Example(None, \"Your Price: $7.99\", \"$\", \"7.99\", 7.99),\n    Example(None, \"$80.00 U.S.\", \"$\", \"80.00\", 80.0),\n    Example(None, \"253,89 lei\", \"lei\", \"253,89\", 253.89),\n    Example(None, \"$1,190.00 AUD\", \"AUD\", \"1,190.00\", 1190.0),\n    Example(None, \"€6.56 + VAT\", \"€\", \"6.56\", 6.56),\n    Example(None, \"4,35 € TTC\", \"€\", \"4,35\", 4.35),\n    Example(None, \"1.890,00 DKK\", \"DKK\", \"1.890,00\", 1890.0),\n    Example(None, \"₹397.00\", \"₹\", \"397.00\", 397.0),\n    Example(None, \"- $44.99\", \"$\", \"44.99\", 44.99),\n    Example(None, \"AU$ 1,175\", \"AU$\", \"1,175\", 1175.0),\n    Example(None, \"130, 38 zł\", \"zł\", \"130, 38\", 130.38),\n    Example(None, \"C$1.23\", \"C$\", \"1.23\", 1.23),\n    Example(None, \"CA$1.23\", \"CA$\", \"1.23\", 1.23),\n    Example(None, \"1 ؋\", \"؋\", \"1\", 1.0),\n    Example(None, \"1 Lek\", \"Lek\", \"1\", 1.0),\n    Example(None, \"1 ֏\", \"֏\", \"1\", 1.0),\n    Example(None, \"1 ƒ\", \"ƒ\", \"1\", 1.0),\n    Example(None, \"1 ₼\", \"₼\", \"1\", 1.0),\n    Example(None, \"1 ৳\", \"৳\", \"1\", 1.0),\n    Example(None, \"1 Br\", \"Br\", \"1\", 1.0),\n    Example(None, \"1 BZ$\", \"BZ$\", \"1\", 1.0),\n    Example(None, \"1 Nu.\", \"Nu.\", \"1\", 1.0),\n    Example(None, \"1 KM\", \"KM\", \"1\", 1.0),\n    Example(None, \"1 R$\", \"R$\", \"1\", 1.0),\n    Example(None, \"1 лв\", \"лв\", \"1\", 1.0),\n    Example(None, \"1 FBu\", \"FBu\", \"1\", 1.0),\n    Example(None, \"1 BD\", \"BD\", \"1\", 1.0),  # Bahraini Dinar\n    Example(None, \"1 ៛\", \"៛\", \"1\", 1.0),\n    Example(None, \"1 CFA\", \"CFA\", \"1\", 1.0),\n    Example(None, \"1 FCFA\", \"FCFA\", \"1\", 1.0),\n    Example(None, \"1 KMF\", \"KMF\", \"1\", 1.0),\n    Example(None, \"1 ₣\", \"₣\", \"1\", 1.0),\n    Example(None, \"1 ₡\", \"₡\", \"1\", 1.0),\n    Example(None, \"1 kn\", \"kn\", \"1\", 1.0),\n    Example(None, \"1 CUC$\", \"CUC$\", \"1\", 1.0),\n    Example(None, \"1 ₱\", \"₱\", \"1\", 1.0),\n    Example(None, \"1 Kč\", \"Kč\", \"1\", 1.0),\n    Example(None, \"1 Fdj\", \"Fdj\", \"1\", 1.0),\n    Example(None, \"1 RD$\", \"RD$\", \"1\", 1.0),\n    Example(None, \"1 Nfk\", \"Nfk\", \"1\", 1.0),\n    Example(None, \"1 GH₵\", \"GH₵\", \"1\", 1.0),  # Ghanaian cedi\n    Example(None, \"1 Ft\", \"Ft\", \"1\", 1.0),\n    Example(None, \"1 Rp\", \"Rp\", \"1\", 1.0),\n    Example(None, \"1 ﷼\", \"﷼\", \"1\", 1.0),  # Saudi riyal\n    Example(None, \"1 ₪\", \"₪\", \"1\", 1.0),\n    Example(None, \"1 J$\", \"J$\", \"1\", 1.0),\n    Example(None, \"1 KD\", \"KD\", \"1\", 1.0),  # Kuwaiti dinar\n    Example(None, \"1 ₭\", \"₭\", \"1\", 1.0),  # Lao kip\n    Example(None, \"1 LD\", \"LD\", \"1\", 1.0),\n    Example(None, \"1 MOP$\", \"MOP$\", \"1\", 1.0),\n    Example(None, \"1 MK\", \"MK\", \"1\", 1.0),\n    Example(None, \"1 RM\", \"RM\", \"1\", 1.0),\n    Example(None, \"1 Rf\", \"Rf\", \"1\", 1.0),\n    Example(None, \"1 UM\", \"UM\", \"1\", 1.0),\n    Example(None, \"1 ₨\", \"₨\", \"1\", 1.0),\n    Example(None, \"1 ₮\", \"₮\", \"1\", 1.0),\n    Example(None, \"1 ƒ\", \"ƒ\", \"1\", 1.0),\n    Example(None, \"1 C$\", \"C$\", \"1\", 1.0),\n    Example(None, \"1 ₦\", \"₦\", \"1\", 1.0),\n    Example(None, \"1 B/.\", \"B/.\", \"1\", 1.0),\n    Example(None, \"1 S/.\", \"S/.\", \"1\", 1.0),\n    Example(None, \"1 ₽\", \"₽\", \"1\", 1.0),\n    Example(None, \"1 Db\", \"Db\", \"1\", 1.0),\n    Example(None, \"1 NT$\", \"NT$\", \"1\", 1.0),\n    Example(None, \"1 ЅM\", None, \"1\", 1.0),  # It's not a currency\n    Example(None, \"1 TSh\", \"TSh\", \"1\", 1.0),\n    Example(None, \"1 T$\", \"T$\", \"1\", 1.0),\n    Example(None, \"1 TT$\", \"TT$\", \"1\", 1.0),\n    Example(None, \"1 DT\", \"DT\", \"1\", 1.0),\n    Example(None, \"1 ₺\", \"₺\", \"1\", 1.0),\n    Example(None, \"1 USh\", \"USh\", \"1\", 1.0),\n    Example(None, \"1 ₴\", \"₴\", \"1\", 1.0),\n    Example(None, \"1 $U\", \"$U\", \"1\", 1.0),\n    Example(None, \"1 VT\", \"VT\", \"1\", 1.0),\n    Example(None, \"1 Bs\", \"Bs\", \"1\", 1.0),\n    Example(None, \"1 ZK\", \"ZK\", \"1\", 1.0),\n    Example(None, \"1 Z$\", \"Z$\", \"1\", 1.0),\n    Example(None, \"1 ₿\", \"₿\", \"1\", 1.0),\n    Example(None, \"1 Br\", \"Br\", \"1\", 1.0),  # Ethiopian birr, Belarusian ruble\n    Example(None, \"1 美股\", None, \"1\", 1.0),  # not a currency\n    Example(None, \"1 GEL\", \"GEL\", \"1\", 1.0),  # Georgian lari\n    Example(None, \"1 FG\", \"FG\", \"1\", 1.0),  # Guinean franc\n    Example(None, \"14.00 SGD / Each\", \"SGD\", \"14.00\", 14.0),  # Singapore Dollar\n]\n\n\nPRICE_PARSING_EXAMPLES_XFAIL = [\n    # amount is picked as a price\n    Example(\n        \"3 Ausgaben für nur 14,85 EUR\",\n        \"3 Ausgaben für nur 14,85 EUR\",\n        \"EUR\",\n        \"14,85\",\n        14.85,\n    ),\n    Example(None, \"Buy Now - 2 Litre Was $120.00 Now $60.00\", \"$\", \"60.00\", 60),\n    Example(\n        \"Цена: уточняйте (мин. заказ: 1 )\",\n        \"Цена: уточняйте (мин. заказ: 1 )\",\n        None,\n        None,\n        None,\n    ),\n    Example(\n        None,\n        \"50 - $2.00 100 - $2.75 400 - $4.50 1,000 - $9.00 \"\n        \"2,000 - $17.00 3,000 - $24.00 10,000 - $75.00\",\n        \"$\",\n        \"2.00\",\n        2,\n    ),\n    # no detection of such single-letter currencies\n    Example(\"R273.00\", \"R273.00\", \"R\", \"273.00\", 273),\n    Example(\"R8,499\", \"R8,499\", \"R\", \"8,499\", 8499),\n    Example(\"Cuneo\", \"61.858 L\", \"L\", \"61.858\", 61858),  # Romanian New Leu\n    # \"р\" / \"руб\" is detected as currency\n    Example(\">\", \"См. цену в прайсе\", None, None, None),\n    Example(\"Купить\", \"Печная труба\", None, None, None),\n    Example(None, \"Код товара: 884\", None, \"884\", 884.0),\n    # dates\n    Example(None, \"July, 2004\", None, None, None),\n    Example(None, \"15.08.2017\", None, None, None),\n    # other incorrectly extracted prices\n    Example(\"8.5\", \"25-09\", None, None, None),\n    # misc\n    Example(\"of\", \"16.00 ft\", None, None, None),\n    # Example('7 724 134.40 114.32', '7 724 134.40 114.32',\n    #         '', ''),\n    # Example('中古価格（税込）： ¥20,800', '132',\n    #         '¥', '132', 132),\n    Example(\n        \"Free Shipping on Orders $49+.\",\n        \"Free Shipping on Orders $49+.\",\n        \"$\",\n        None,\n        None,\n    ),\n]\n\n# Valid currencies not detected by price-parser\n# Move to regular tests when added\nPRICE_PARSING_EXAMPLES_XFAIL_CURRENCIES_TO_BE_ADDED = [\n    Example(None, \"22000.00元/台\", \"元\", \"22000.00\", 22000.00),  # 元 is yuan\n    Example(None, \"2963yen\", \"yen\", \"2963\", 2963),\n    Example(None, \"1 บาท\", \"บาท\", \"1\", 1.0),  # Thai baht\n    Example(None, \"1 ر.س\", \"ر.س\", \"1\", 1.0),  # Saudi riyal\n    Example(None, \"1.198,- Kr\", \"Kr\", \"1.198\", 1198.0),\n    Example(None, \"45 ج.م\", \"ج.م\", \"45\", 45.0),  # Egyptian Pound (EGP)\n    Example(None, \"45 E£\", \"E£\", \"45\", 45.0),  # Egyptian Pound (EGP)\n    Example(None, \"2000 zl\", \"zl\", \"2000\", 2000.0),  # Polish zloty (PLN)\n    Example(None, \"CAN$1.23\", \"CAN$\", \"1.23\", 1.23),\n    Example(None, \"200q\", \"q\", \"200\", 200.0),  # Guatemalan Quetzal\n    Example(None, \"200Q\", \"Q\", \"200\", 200.0),  # Guatemalan Quetzal\n    Example(None, \"1 دج\", \"دج\", \"1\", 1.0),  # Algerian Dinar\n    Example(None, \"1 .د.ب\", \".د.ب\", \"1\", 1.0),  # Bahraini Dinar\n    Example(None, \"1 $b\", \"$b\", \"1\", 1.0),  # Barbadian dollar\n    Example(None, \"1 P\", \"P\", \"1\", 1.0),  # Pound sterling, Botswana pula\n    Example(None, \"1 franc\", \"franc\", \"1\", 1.0),\n    Example(None, \"2 francs\", \"francs\", \"2\", 2.0),\n    Example(None, \"1 ናቕፋ\", \"ናቕፋ\", \"1\", 1.0),  # Eritrean Nakfa\n    Example(\n        None,\n        \"1 نافكا\",  # Arabic \"نافكا\" stands for \"Navka\",\n        # which can refer to Eritrean Nakfa\n        \"نافكا\",\n        \"1\",\n        1.0,\n    ),\n    Example(None, \"1 E\", \"E\", \"1\", 1.0),  # Can refer to Egyptian pound\n    Example(None, \"1 ብር\", \"ብር\", \"1\", 1.0),  # Ethiopian birr\n    Example(None, \"1 D\", \"D\", \"1\", 1.0),  # Gambian dalasi\n    Example(None, \"1 ლ\", \"ლ\", \"1\", 1.0),  # Georgian lari\n    Example(None, \"1 ¢\", \"¢\", \"1\", 1.0),  # Ghanaian cedi, cents\n    Example(None, \"1 ₵\", \"₵\", \"1\", 1.0),  # Ghanaian cedi\n    Example(None, \"1 GFr\", \"GFr\", \"1\", 1.0),  # Guinean franc\n    Example(None, \"1 L\", \"L\", \"1\", 1.0),\n    Example(None, \"1 ع.د\", \"ع.د\", \"1\", 1.0),  # Iraqi dinar\n    Example(\n        None,\n        \"1 د.\",  # Arabic \"د.\" stands for dr. refers to \"dinar\" and \"dirham\":\n        # United Arab Emirates dirham (AED), Bahraini dinar (BHD),\n        # Algerian dinar (DZD), etc.\n        \"د.\",\n        \"1\",\n        1.0,\n    ),\n    Example(None, \"1 KSh\", \"KSh\", \"1\", 1.0),  # Kenyan shilling\n    Example(None, \"1 د.ك\", \"د.ك\", \"1\", 1.0),  # Kuwaiti dinar\n    Example(None, \"1 ل.د\", \"ل.د\", \"1\", 1.0),  # Libyan dinar\n    Example(None, \"1 ден\", \"ден\", \"1\", 1.0),  # Macedonian denar\n    Example(None, \"1 ДЕН\", \"ДЕН\", \"1\", 1.0),  # Macedonian denar\n    Example(None, \"1 Ar\", \"Ar\", \"1\", 1.0),  # Malagasy ariary\n    Example(None, \"1 د.إ\", \"د.إ\", \"1\", 1.0),  # United Arab Emirates dirham\n    Example(None, \"1 MT\", \"MT\", \"1\", 1.0),  # Mozambican metical\n    Example(None, \"1 K\", \"K\", \"1\", 1.0),  # Papua New Guinean kina\n    Example(None, \"1 FRw\", \"FRw\", \"1\", 1.0),  # Rwandan Franc\n    Example(None, \"1 RF\", \"RF\", \"1\", 1.0),  # Rwandan Franc\n    Example(None, \"1 R₣\", \"R₣\", \"1\", 1.0),  # Rwandan Franc\n    Example(None, \"1 Дин\", \"Дин\", \"1\", 1.0),\n    Example(None, \"1 SPL\", \"SPL\", \"1\", 1.0),  # Seborgan Luigino (SPL)\n    Example(None, \"1 ج.س.\", \"ج.س.\", \"1\", 1.0),  # Sudanese pound\n    Example(None, \"1 د.ت\", \"د.ت\", \"1\", 1.0),  # Tunisian dinar\n    Example(None, \"AU $59.95\", \"AU $\", \"59.95\", 59.95),\n    Example(None, \"US $1.23\", \"US $\", \"1.23\", 1.23),\n    Example(None, \"CAD$1.23\", \"CAD$\", \"1.23\", 1.23),\n    Example(None, \"1 G$\", \"G$\", \"1\", 1.0),  # Guyanese dollar\n    Example(None, \"1 GY$\", \"GY$\", \"1\", 1.0),  # Guyanese dollar\n    Example(None, \"1 BTC\", \"BTC\", \"1\", 1.0),  # Bitcoin\n    Example(None, \"1 CHf\", \"CHf\", \"1\", 1.0),  # Swiss franc\n    Example(None, \"1 Dh\", \"Dh\", \"1\", 1.0),  # United Arab Emirates dirham\n    Example(None, \"1 Dhs\", \"Dhs\", \"1\", 1.0),  # United Arab Emirates dirham\n    Example(None, \"1 Esc\", \"Esc\", \"1\", 1.0),  # Cape Verdean escudo\n    Example(None, \"1 Fbu\", \"Fbu\", \"1\", 1.0),  # Burundian franc\n    Example(None, \"1 ID\", \"ID\", \"1\", 1.0),  # Iraqi dinar\n    Example(None, \"1 Ks\", \"Ks\", \"1\", 1.0),  # Burmese kyat\n    Example(None, \"1 NT\", \"NT\", \"1\", 1.0),  # New Taiwan dollar\n    Example(None, \"1 Nu\", \"Nu\", \"1\", 1.0),  # Bhutanese ngultrum\n    Example(None, \"1 Rbl\", \"Rbl\", \"1\", 1.0),  # Belarusian ruble, Russian ruble\n    Example(None, \"1 Re\", \"Re\", \"1\", 1.0),  # Indian rupee, Sri Lankan rupee\n    Example(None, \"1 S/\", \"S/\", \"1\", 1.0),  # Peruvian sol\n    Example(None, \"1 SFr\", \"SFr\", \"1\", 1.0),  # Swiss franc\n    Example(None, \"1 Sl\", \"Sl\", \"1\", 1.0),  # Somaliland shilling\n    Example(None, \"1 VNĐ\", \"VNĐ\", \"1\", 1.0),  # Vietnamese đồng\n    Example(None, \"1 Vt\", \"Vt\", \"1\", 1.0),  # Vanuatu vatu\n    Example(None, \"1 din\", \"din\", \"1\", 1.0),  # Serbian dinar\n    Example(None, \"1 hrn\", \"hrn\", \"1\", 1.0),  # Ukrainian hryvnia\n    Example(None, \"1 kwz\", \"kwz\", \"1\", 1.0),  # Angolan kwanza\n    Example(None, \"1 lari\", \"lari\", \"1\", 1.0),  # Georgian lari\n    Example(None, \"1 nis\", \"nis\", \"1\", 1.0),  # Israeli new shekel\n    Example(None, \"1 pound\", \"pound\", \"1\", 1.0),  # Pound sterling\n    Example(None, \"1 Sʻ\", \"Sʻ\", \"1\", 1.0),  # Uzbekistani soʻm\n    Example(None, \"1 S'\", \"S'\", \"1\", 1.0),  # Uzbekistani soʻm\n    Example(None, \"1 so'm\", \"so'm\", \"1\", 1.0),  # Uzbekistani soʻm\n    Example(None, \"1 som\", \"som\", \"1\", 1.0),  # Uzbekistani soʻm\n    Example(None, \"1 stg\", \"stg\", \"1\", 1.0),  # Pound sterling\n    Example(None, \"1 yuan\", \"yuan\", \"1\", 1.0),  # Renminbi/Chinese yuan\n    Example(None, \"1 Ƀ\", \"Ƀ\", \"1\", 1.0),  # Bitcoin\n    Example(None, \"1 дин\", \"дин\", \"1\", 1.0),  # Serbian dinar\n    Example(None, \"1 км\", \"км\", \"1\", 1.0),  # Bosnia and Herzegovina convertible mark\n    Example(None, \"1 с\", \"с\", \"1\", 1.0),  # Kyrgyz som, Tajikistani somoni\n    Example(None, \"1 ש״ח\", \"ש״ח\", \"1\", 1.0),  # Israeli new shekel\n    Example(None, \"1 ج.س\", \"ج.س\", \"1\", 1.0),  # Sudanese pound\n    Example(None, \"1 د.أ\", \"د.أ\", \"1\", 1.0),  # Jordanian dinar\n    Example(None, \"1 د.ا\", \"د.ا\", \"1\", 1.0),  # Jordanian dinar\n    Example(None, \"1 د.ج\", \"د.ج\", \"1\", 1.0),  # Algerian dinar\n    Example(None, \"1 د.م\", \"د.م\", \"1\", 1.0),  # Moroccan dirham\n    Example(\n        None,\n        \"1 دينار\",  # Bahraini dinar, Algerian dinar, Iraqi dinar,\n        # Jordanian dinar, Kuwaiti dinar, Libyan dinar,\n        # Tunisian dinar\n        \"دينار\",\n        \"1\",\n        1.0,\n    ),\n    Example(None, \"1 دينار أردني\", \"دينار أردني\", \"1\", 1.0),  # Jordanian dinar\n    Example(None, \"1 دينار كويتي\", \"دينار كويتي\", \"1\", 1.0),  # Kuwaiti dinar\n    Example(None, \"1 ر.ع\", \"ر.ع\", \"1\", 1.0),  # Omani rial\n    Example(None, \"1 ر.ق\", \"ر.ق\", \"1\", 1.0),  # Qatari riyal\n    Example(None, \"1 ش.ج\", \"ش.ج\", \"1\", 1.0),  # Israeli new shekel\n    Example(None, \"1 ل.س\", \"ل.س\", \"1\", 1.0),  # Syrian pound\n    Example(None, \"1 ل.ل\", \"ل.ل\", \"1\", 1.0),  # Lebanese pound\n    Example(None, \"1 ரூ\", \"ரூ\", \"1\", 1.0),  # Sri Lankan rupee\n    Example(None, \"1 රු\", \"රු\", \"1\", 1.0),  # Sri Lankan rupee\n    Example(None, \"1 ლარი\", \"ლარი\", \"1\", 1.0),  # Georgian lari\n    Example(None, \"1 人民币\", \"人民币\", \"1\", 1.0),  # Renminbi/Chinese yuan\n    Example(None, \"1 圆\", \"圆\", \"1\", 1.0),  # Renminbi/Chinese yuan\n    Example(None, \"1 圓\", \"圓\", \"1\", 1.0),  # Renminbi/Chinese yuan\n    Example(None, \"1 GBp\", \"GBp\", \"1\", 1.0),  # British Pound\n    Example(None, \"1 ￡\", \"￡\", \"1\", 1.0),  # British Pound\n    Example(None, \"1 nzd\", \"nzd\", \"1\", 1.0),  # New Zealand dollar\n    Example(None, \"1 mkd\", \"mkd\", \"1\", 1.0),  # Macedonian denar\n    Example(None, \"CND\", \"CND\", \"1\", 1.0),  # Canadian dollar\n    Example(None, \"KShs\", \"KShs\", \"1\", 1.0),  # Kenyan shilling\n    Example(None, \"chf\", \"chf\", \"1\", 1.0),  # Swiss franc\n    Example(None, \"so'm\", \"so'm\", \"1\", 1.0),  # Uzbekistani soʻm\n    Example(None, \"тг\", \"тг\", \"1\", 1.0),  # Kazakhstani tenge\n    Example(None, 'ש\"ח', 'ש\"ח', \"1\", 1.0),  # Israeli new shekel\n    Example(None, \"ש'ח\", \"ש'ח\", \"1\", 1.0),  # Israeli new shekel\n    Example(None, \"د.ع\", \"د.ع\", \"1\", 1.0),  # Iraqi dinar\n    Example(None, \"د.ل\", \"د.ل\", \"1\", 1.0),  # Libyan dinar\n    Example(None, \"ر.ي\", \"ر.ي\", \"1\", 1.0),  # Yemeni rial\n    Example(None, \"ش.ص\", \"ش.ص\", \"1\", 1.0),  # Somali shilling\n    Example(\n        None,\n        \"1 G\",  # \"G\" may mean Guyanese dollar, but it is too ambiguous\n        \"G\",\n        \"1\",\n        1.0,\n    ),\n]\n\n\nPRICE_PARSING_DECIMAL_SEPARATOR_EXAMPLES = [\n    Example(None, \"1250€ 600\", \"€\", \"1250\", 1250, \"€\"),\n    Example(None, \"1250€ 60\", \"€\", \"1250€60\", 1250.60, \"€\"),\n    Example(None, \"1250€600\", \"€\", \"1250€600\", 1250.600, \"€\"),\n    Example(None, \".75 €\", \"€\", \".75\", 0.75, \".\"),\n    Example(\"$.75\", \"$.75\", \"$\", \".75\", 0.75, \".\"),\n    Example(\"$..75\", \"$..75\", \"$\", \".75\", 0.75, \".\"),\n    Example(\"$..75,333\", \"$..75,333\", \"$\", \".75,333\", 0.75333, \".\"),\n    Example(\"$..75,333\", \"$..75,333\", \"$\", \".75,333\", 75.333, \",\"),\n    Example(\"$.750.30\", \"$.750.30\", \"$\", \"750.30\", 750.30, \".\"),\n]\n\n\n@pytest.mark.parametrize(\n    \"example\",\n    PRICE_PARSING_EXAMPLES_BUGS_CAUGHT\n    + PRICE_PARSING_EXAMPLES_NEW\n    + PRICE_PARSING_EXAMPLES\n    + PRICE_PARSING_EXAMPLES_2\n    + PRICE_PARSING_EXAMPLES_3\n    + PRICE_PARSING_EXAMPLES_NO_PRICE\n    + PRICE_PARSING_EXAMPLES_NO_CURRENCY\n    + PRICE_PARSING_DECIMAL_SEPARATOR_EXAMPLES\n    + [\n        pytest.param(e, marks=pytest.mark.xfail(strict=True))\n        for e in PRICE_PARSING_EXAMPLES_XFAIL\n        + PRICE_PARSING_EXAMPLES_XFAIL_CURRENCIES_TO_BE_ADDED\n    ],\n    ids=idfn,\n)\ndef test_parsing(example: Example) -> None:\n    parsed = Price.fromstring(\n        example.price_raw, example.currency_raw, example.decimal_separator\n    )\n    assert parsed == example, (\n        f\"Failed scenario: price={example.price_raw}, \"\n        f\"currency_hint={example.currency_raw}\"\n    )\n\n\n@pytest.mark.parametrize(\n    (\"amount\", \"amount_float\"),\n    [\n        (None, None),\n        (Decimal(\"1.23\"), 1.23),\n    ],\n)\ndef test_price_amount_float(amount: Decimal | None, amount_float: float | None) -> None:\n    assert Price(amount, None, None).amount_float == amount_float\n\n\n@pytest.mark.parametrize(\n    (\"price_raw\", \"decimal_separator\", \"expected_result\"),\n    [\n        (\"140.000\", None, Decimal(140000)),\n        (\"140.000\", \",\", Decimal(140000)),\n        (\"140.000\", \".\", Decimal(\"140.000\")),\n        (\"140€33\", \"€\", Decimal(\"140.33\")),\n        (\"140,000€33\", \"€\", Decimal(\"140000.33\")),\n        (\"140.000€33\", \"€\", Decimal(\"140000.33\")),\n    ],\n)\ndef test_price_decimal_separator(\n    price_raw: str, decimal_separator: str | None, expected_result: Decimal\n) -> None:\n    parsed = Price.fromstring(price_raw, decimal_separator=decimal_separator)\n    assert parsed.amount == expected_result\n"
  },
  {
    "path": "tox.ini",
    "content": "[tox]\nenvlist = py39,py310,py311,py312,py313,py314,mypy\n\n[testenv]\ndeps =\n    pytest\n    pytest-cov >= 7.0.0\n\ncommands =\n    pytest \\\n        --cov-report=term-missing --cov-report= --cov-report=xml --cov=price_parser \\\n        --doctest-modules \\\n        {posargs:price_parser tests README.rst}\n\n[testenv:mypy]\ndeps =\n    mypy==1.18.2\n    pytest==8.4.2\n\ncommands = mypy price_parser tests\n\n[testenv:pre-commit]\ndeps = pre-commit\ncommands = pre-commit run --all-files --show-diff-on-failure\nskip_install = true\n"
  }
]