| module SafeYAML |
| class Transform |
| class ToFloat |
| Infinity = 1.0 / 0.0 |
| NaN = 0.0 / 0.0 |
| |
| PREDEFINED_VALUES = { |
| ".inf" => Infinity, |
| ".Inf" => Infinity, |
| ".INF" => Infinity, |
| "-.inf" => -Infinity, |
| "-.Inf" => -Infinity, |
| "-.INF" => -Infinity, |
| ".nan" => NaN, |
| ".NaN" => NaN, |
| ".NAN" => NaN, |
| }.freeze |
| |
| MATCHER = /\A[-+]?(?:\d[\d_]*)?\.[\d_]+(?:[eE][-+][\d]+)?\Z/.freeze |
| |
| def transform?(value) |
| return true, Float(value) if MATCHER.match(value) |
| try_edge_cases?(value) |
| end |
| |
| def try_edge_cases?(value) |
| return true, PREDEFINED_VALUES[value] if PREDEFINED_VALUES.include?(value) |
| return true, Parse::Sexagesimal.value(value) if Parse::Sexagesimal::FLOAT_MATCHER.match(value) |
| return false |
| end |
| end |
| end |
| end |