# # numerics.py # # Examples of parsing real and integers using various grouping and # decimal point characters, varying by locale. # # Copyright 2016, Paul McGuire # # Format samples from https://docs.oracle.com/cd/E19455-01/806-0169/overview-9/index.html # tests = """\ # Canadian (English and French) 4 294 967 295,000 # Danish 4 294 967 295,000 # Finnish 4 294 967 295,000 # French 4 294 967 295,000 # German 4 294 967 295,000 # Italian 4.294.967.295,000 # Norwegian 4.294.967.295,000 # Spanish 4.294.967.295,000 # Swedish 4 294 967 295,000 # GB-English 4,294,967,295.000 # US-English 4,294,967,295.000 # Thai 4,294,967,295.000 """ from pyparsing import Regex comma_decimal = Regex(r"\d{1,2}(([ .])\d\d\d(\2\d\d\d)*)?,\d*") comma_decimal.setParseAction( lambda t: float(t[0].replace(" ", "").replace(".", "").replace(",", ".")) ) dot_decimal = Regex(r"\d{1,2}(([ ,])\d\d\d(\2\d\d\d)*)?\.\d*") dot_decimal.setParseAction(lambda t: float(t[0].replace(" ", "").replace(",", ""))) decimal = comma_decimal ^ dot_decimal decimal.runTests(tests, parseAll=True) grouped_integer = Regex(r"\d{1,2}(([ .,])\d\d\d(\2\d\d\d)*)?") grouped_integer.setParseAction( lambda t: int(t[0].replace(" ", "").replace(",", "").replace(".", "")) ) grouped_integer.runTests(tests, parseAll=False)