summaryrefslogtreecommitdiff
path: root/constructor.py
diff options
context:
space:
mode:
authorAnthon van der Neut <anthon@mnt.org>2017-08-06 00:45:39 +0200
committerAnthon van der Neut <anthon@mnt.org>2017-08-06 00:45:39 +0200
commitc93c3cd9efdebd72873655494fc695b9c65858eb (patch)
treea9be64d9e545dba6f2381a9fe17df140c2032470 /constructor.py
parent51de865df2d66215b5e904813f16fa84a90b215a (diff)
downloadruamel.yaml-c93c3cd9efdebd72873655494fc695b9c65858eb.tar.gz
scalarfloat support
Diffstat (limited to 'constructor.py')
-rw-r--r--constructor.py53
1 files changed, 53 insertions, 0 deletions
diff --git a/constructor.py b/constructor.py
index b67a748..7e572ad 100644
--- a/constructor.py
+++ b/constructor.py
@@ -24,6 +24,7 @@ from ruamel.yaml.scalarstring import * # NOQA
from ruamel.yaml.scalarstring import (PreservedScalarString, SingleQuotedScalarString,
DoubleQuotedScalarString, ScalarString)
from ruamel.yaml.scalarint import ScalarInt, BinaryInt, OctalInt, HexInt, HexCapsInt
+from ruamel.yaml.scalarfloat import ScalarFloat
from ruamel.yaml.timestamp import TimeStamp
if False: # MYPY
@@ -1040,6 +1041,58 @@ class RoundTripConstructor(SafeConstructor):
else:
return sign * int(value_s)
+ def construct_yaml_float(self, node):
+ # type: (Any) -> float
+ underscore = None
+ m_sign = False
+ value_so = to_str(self.construct_scalar(node))
+ value_s = value_so.replace('_', '').lower()
+ sign = +1
+ if value_s[0] == '-':
+ sign = -1
+ if value_s[0] in '+-':
+ m_sign = True
+ value_s = value_s[1:]
+ if value_s == '.inf':
+ return sign * self.inf_value
+ if value_s == '.nan':
+ return self.nan_value
+ if self.resolver.processing_version != (1, 2) and ':' in value_s:
+ digits = [float(part) for part in value_s.split(':')]
+ digits.reverse()
+ base = 1
+ value = 0.0
+ for digit in digits:
+ value += digit * base
+ base *= 60
+ return sign * value
+ if 'e' in value_s:
+ try:
+ mantissa, exponent = value_so.split('e')
+ exp = 'e'
+ except ValueError:
+ mantissa, exponent = value_so.split('E')
+ exp = 'E'
+ if self.resolver.processing_version != (1, 2):
+ # value_s is lower case independent of input
+ if '.' not in mantissa:
+ warnings.warn(MantissaNoDotYAML1_1Warning(node, value_so))
+ width = len(mantissa)
+ prec = mantissa.find('.')
+ if prec > width - 2:
+ prec = 0
+ if m_sign:
+ width -= 1
+ e_width = len(exponent)
+ e_sign = exponent[0] in '+-'
+ # print('sf', width, prec, m_sign, exp, e_width, e_sign)
+ return ScalarFloat(sign * float(value_s), width=width, prec=prec, m_sign=m_sign,
+ exp=exp, e_width=e_width, e_sign=e_sign)
+ width = len(value_so)
+ prec = value_so.index('.')
+ return ScalarFloat(sign * float(value_s), width=width, prec=prec)
+ # return sign * float(value_s)
+
def construct_yaml_str(self, node):
# type: (Any) -> Any
value = self.construct_scalar(node)