3 var common = require('../common');
4 var Type = require('../type');
6 var YAML_FLOAT_PATTERN = new RegExp(
7 '^(?:[-+]?(?:[0-9][0-9_]*)\\.[0-9_]*(?:[eE][-+][0-9]+)?' +
8 '|\\.[0-9_]+(?:[eE][-+][0-9]+)?' +
9 '|[-+]?[0-9][0-9_]*(?::[0-5]?[0-9])+\\.[0-9_]*' +
10 '|[-+]?\\.(?:inf|Inf|INF)' +
11 '|\\.(?:nan|NaN|NAN))$');
13 function resolveYamlFloat(data) {
14 if (data === null) return false;
16 if (!YAML_FLOAT_PATTERN.test(data)) return false;
21 function constructYamlFloat(data) {
22 var value, sign, base, digits;
24 value = data.replace(/_/g, '').toLowerCase();
25 sign = value[0] === '-' ? -1 : 1;
28 if ('+-'.indexOf(value[0]) >= 0) {
29 value = value.slice(1);
32 if (value === '.inf') {
33 return (sign === 1) ? Number.POSITIVE_INFINITY : Number.NEGATIVE_INFINITY;
35 } else if (value === '.nan') {
38 } else if (value.indexOf(':') >= 0) {
39 value.split(':').forEach(function (v) {
40 digits.unshift(parseFloat(v, 10));
46 digits.forEach(function (d) {
54 return sign * parseFloat(value, 10);
58 var SCIENTIFIC_WITHOUT_DOT = /^[-+]?[0-9]+e/;
60 function representYamlFloat(object, style) {
65 case 'lowercase': return '.nan';
66 case 'uppercase': return '.NAN';
67 case 'camelcase': return '.NaN';
69 } else if (Number.POSITIVE_INFINITY === object) {
71 case 'lowercase': return '.inf';
72 case 'uppercase': return '.INF';
73 case 'camelcase': return '.Inf';
75 } else if (Number.NEGATIVE_INFINITY === object) {
77 case 'lowercase': return '-.inf';
78 case 'uppercase': return '-.INF';
79 case 'camelcase': return '-.Inf';
81 } else if (common.isNegativeZero(object)) {
85 res = object.toString(10);
87 // JS stringifier can build scientific format without dots: 5e-100,
88 // while YAML requres dot: 5.e-100. Fix it with simple hack
90 return SCIENTIFIC_WITHOUT_DOT.test(res) ? res.replace('e', '.e') : res;
93 function isFloat(object) {
94 return (Object.prototype.toString.call(object) === '[object Number]') &&
95 (object % 1 !== 0 || common.isNegativeZero(object));
98 module.exports = new Type('tag:yaml.org,2002:float', {
100 resolve: resolveYamlFloat,
101 construct: constructYamlFloat,
103 represent: representYamlFloat,
104 defaultStyle: 'lowercase'