parse_number.py 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738
  1. from typing import TYPE_CHECKING
  2. from .utils.constants import JSONReturnType
  3. from .utils.json_context import ContextValues
  4. NUMBER_CHARS: set[str] = set("0123456789-.eE/,_")
  5. if TYPE_CHECKING:
  6. from .json_parser import JSONParser
  7. def parse_number(self: "JSONParser") -> JSONReturnType:
  8. # <number> is a valid real number expressed in one of a number of given formats
  9. number_str = ""
  10. char = self.get_char_at()
  11. is_array = self.context.current == ContextValues.ARRAY
  12. while char and char in NUMBER_CHARS and (not is_array or char != ","):
  13. if char != "_":
  14. number_str += char
  15. self.index += 1
  16. char = self.get_char_at()
  17. if (self.get_char_at() or "").isalpha():
  18. # this was a string instead, sorry
  19. self.index -= len(number_str)
  20. return self.parse_string()
  21. if number_str and number_str[-1] in "-eE/,":
  22. # The number ends with a non valid character for a number/currency, rolling back one
  23. number_str = number_str[:-1]
  24. self.index -= 1
  25. try:
  26. if "," in number_str:
  27. return number_str
  28. if "." in number_str or "e" in number_str or "E" in number_str:
  29. return float(number_str)
  30. return int(number_str)
  31. except ValueError:
  32. return number_str