'use strict'; var Type = require('../type'); var YAML_FLOAT_PATTERN = new RegExp( '^(?:[-+]?(?:[0-9][0-9_]*)\\.[0-9_]*(?:[eE][-+][0-9]+)?' + '|\\.[0-9_]+(?:[eE][-+][0-9]+)?' + '|[-+]?[0-9][0-9_]*(?::[0-5]?[0-9])+\\.[0-9_]*' + '|[-+]?\\.(?:inf|Inf|INF)' + '|\\.(?:nan|NaN|NAN))$'); function resolveYamlFloat(state) { var value, sign, base, digits, object = state.result; if (!YAML_FLOAT_PATTERN.test(object)) { return false; } value = object.replace(/_/g, '').toLowerCase(); sign = '-' === value[0] ? -1 : 1; digits = []; if (0 <= '+-'.indexOf(value[0])) { value = value.slice(1); } if ('.inf' === value) { state.result = (1 === sign) ? Number.POSITIVE_INFINITY : Number.NEGATIVE_INFINITY; return true; } else if ('.nan' === value) { state.result = NaN; return true; } else if (0 <= value.indexOf(':')) { value.split(':').forEach(function (v) { digits.unshift(parseFloat(v, 10)); }); value = 0.0; base = 1; digits.forEach(function (d) { value += d * base; base *= 60; }); state.result = sign * value; return true; } else { state.result = sign * parseFloat(value, 10); return true; } } function representYamlFloat(object, style) { if (isNaN(object)) { switch (style) { case 'lowercase': return '.nan'; case 'uppercase': return '.NAN'; case 'camelcase': return '.NaN'; } } else if (Number.POSITIVE_INFINITY === object) { switch (style) { case 'lowercase': return '.inf'; case 'uppercase': return '.INF'; case 'camelcase': return '.Inf'; } } else if (Number.NEGATIVE_INFINITY === object) { switch (style) { case 'lowercase': return '-.inf'; case 'uppercase': return '-.INF'; case 'camelcase': return '-.Inf'; } } else { return object.toString(10); } } function isFloat(object) { return ('[object Number]' === Object.prototype.toString.call(object)) && (0 !== object % 1); } module.exports = new Type('tag:yaml.org,2002:float', { loadKind: 'scalar', loadResolver: resolveYamlFloat, dumpPredicate: isFloat, dumpRepresenter: representYamlFloat, dumpDefaultStyle: 'lowercase' });