diff --git a/lib/OpenLayers/BaseTypes.js b/lib/OpenLayers/BaseTypes.js index 0b09c91054..70832605d8 100644 --- a/lib/OpenLayers/BaseTypes.js +++ b/lib/OpenLayers/BaseTypes.js @@ -186,6 +186,18 @@ OpenLayers.String = { */ isNumeric: function(value) { return OpenLayers.String.numberRegEx.test(value); + }, + + /** + * APIFunction: numericIf + * Converts a string that appears to be a numeric value into a number. + * + * Returns + * {Number|String} a Number if the passed value is a number, a String + * otherwise. + */ + numericIf: function(value) { + return OpenLayers.String.isNumeric(value) ? parseFloat(value) : value; } }; diff --git a/lib/OpenLayers/Format/Filter/v1.js b/lib/OpenLayers/Format/Filter/v1.js index 31966c115e..244e61d798 100644 --- a/lib/OpenLayers/Format/Filter/v1.js +++ b/lib/OpenLayers/Format/Filter/v1.js @@ -168,16 +168,19 @@ OpenLayers.Format.Filter.v1 = OpenLayers.Class(OpenLayers.Format.XML, { obj.filters.push(filter); }, "Literal": function(node, obj) { - obj.value = this.getChildValue(node); + obj.value = OpenLayers.String.numericIf( + this.getChildValue(node)); }, "PropertyName": function(node, filter) { filter.property = this.getChildValue(node); }, "LowerBoundary": function(node, filter) { - filter.lowerBoundary = this.readOgcExpression(node); + filter.lowerBoundary = OpenLayers.String.numericIf( + this.readOgcExpression(node)); }, "UpperBoundary": function(node, filter) { - filter.upperBoundary = this.readOgcExpression(node); + filter.upperBoundary = OpenLayers.String.numericIf( + this.readOgcExpression(node)); }, "Intersects": function(node, obj) { this.readSpatial(node, obj, OpenLayers.Filter.Spatial.INTERSECTS); diff --git a/lib/OpenLayers/Format/SLD/v1.js b/lib/OpenLayers/Format/SLD/v1.js index 8b841afbad..cc3d41c8a3 100644 --- a/lib/OpenLayers/Format/SLD/v1.js +++ b/lib/OpenLayers/Format/SLD/v1.js @@ -154,13 +154,13 @@ OpenLayers.Format.SLD.v1 = OpenLayers.Class(OpenLayers.Format.Filter.v1_0_0, { rule.elseFilter = true; }, "MinScaleDenominator": function(node, rule) { - rule.minScaleDenominator = this.getChildValue(node); + rule.minScaleDenominator = parseFloat(this.getChildValue(node)); }, "MaxScaleDenominator": function(node, rule) { - rule.maxScaleDenominator = this.getChildValue(node); + rule.maxScaleDenominator = parseFloat(this.getChildValue(node)); }, "LineSymbolizer": function(node, rule) { - // OpenLayers doens't do painter's order, instead we extend + // OpenLayers doesn't do painter's order, instead we extend var symbolizer = rule.symbolizer["Line"] || {}; this.readChildNodes(node, symbolizer); // in case it didn't exist before diff --git a/tests/BaseTypes.html b/tests/BaseTypes.html index 7d30ea26d3..7953eafc60 100644 --- a/tests/BaseTypes.html +++ b/tests/BaseTypes.html @@ -195,6 +195,42 @@ } } + + function test_Number_numericIf(t) { + var cases = [ + {value: "3", expect: 3}, + {value: "+3", expect: 3}, + {value: "-3", expect: -3}, + {value: "3.0", expect: 3}, + {value: "+3.0", expect: 3}, + {value: "-3.0", expect: -3}, + {value: "6.02e23", expect: 6.02e23}, + {value: "+1.0e-100", expect: 1e-100}, + {value: "-1.0e+100", expect: -1e100}, + {value: "1E100", expect: 1e100}, + {value: null, expect: null}, + {value: true, expect: true}, + {value: false, expect: false}, + {value: undefined, expect: undefined}, + {value: "", expect: ""}, + {value: "3 ", expect: "3 "}, + {value: " 3", expect: " 3"}, + {value: "1e", expect: "1e"}, + {value: "1+e", expect: "1+e"}, + {value: "1-e", expect: "1-e"} + ]; + t.plan(cases.length); + + var func = OpenLayers.String.numericIf; + var obj, val, got, exp; + for(var i=0; i'; function test_read(t) { - t.plan(6); + t.plan(8); var parser = new OpenLayers.Format.SLD.v1_0_0(); var xml = new OpenLayers.Format.XML(); @@ -131,7 +131,23 @@ t.ok(style instanceof OpenLayers.Style, "(AAA161,0) user style is instance of OpenLayers.Style"); t.eq(style.rules.length, 2, "(AAA161,0) user style has 2 rules"); - // check the first rule + // check the second rule + rule = style.rules[1]; + var feature = { + layer: { + map: { + getScale: function(){ + return 40000; + } + } + }, + attributes: { + CTE: "900" + } + }; + t.ok(typeof rule.maxScaleDenominator == "number", "MaxScaleDenominator is a number"); + t.eq(rule.evaluate(feature), true, "numeric filter comparison evaluates correctly"); + // etc. I'm convinced read works, really wanted to test write (since examples don't test that) // I'll add more tests here later.