Index: /trunk/resources/data/validator/addresses.mapcss
===================================================================
--- /trunk/resources/data/validator/addresses.mapcss	(revision 17758)
+++ /trunk/resources/data/validator/addresses.mapcss	(revision 17759)
@@ -1,7 +1,7 @@
 /* #10232 */
-way[addr:interpolation=odd] > node[addr:housenumber][get(split(".", tag("addr:housenumber")/2), 1)=0] {
+way[addr:interpolation=odd] > node[addr:housenumber][mod(tag("addr:housenumber"),2)=0] {
     throwWarning: tr("Even housenumber in odd address interpolation.");
 }
-way[addr:interpolation=even] > node[addr:housenumber][get(split(".", tag("addr:housenumber")/2), 1)=5] {
+way[addr:interpolation=even] > node[addr:housenumber][mod(tag("addr:housenumber"),2)=1] {
     throwWarning: tr("Odd housenumber in even address interpolation.");
 }
Index: /trunk/resources/data/validator/combinations.mapcss
===================================================================
--- /trunk/resources/data/validator/combinations.mapcss	(revision 17758)
+++ /trunk/resources/data/validator/combinations.mapcss	(revision 17759)
@@ -647,5 +647,5 @@
 
 /* #14125, #14323, #18185 */
-way[highway][lanes][!lanes:forward][!lanes:backward][oneway!=yes][oneway!=-1][oneway!=reversible][highway!=motorway][junction!=roundabout][lanes>2][get(split(".", tag(lanes)/2), 1)=5] {
+way[highway][lanes][!lanes:forward][!lanes:backward][oneway!=yes][oneway!=-1][oneway!=reversible][highway!=motorway][junction!=roundabout][lanes>2][mod(tag(lanes),2)=1] {
   throwWarning: tr("street with odd number of {0}, but without {1} and {2} or {3}", "{1.key}", "{2.key}", "{3.key}", "{4.key}");
   group: tr("missing tag");
@@ -667,6 +667,6 @@
   assertNoMatch: "way highway=primary turn:lanes=left|right lanes=2";
 }
-way[highway][!lanes:forward][/^.*:lanes:forward$/][!lanes:backward][!get(split(".", tag(lanes)/2), 1)=5],
-way[highway][!lanes:backward][/^.*:lanes:backward$/][!lanes:forward][!get(split(".", tag(lanes)/2), 1)=5] {
+way[highway][!lanes:forward][/^.*:lanes:forward$/][!lanes:backward][mod(tag(lanes),2)=0],
+way[highway][!lanes:backward][/^.*:lanes:backward$/][!lanes:forward][mod(tag(lanes),2)=0] {
   throwOther: tr("{0} without {1}", "{2.key}", "{1.key}");
   group: tr("missing tag");
Index: /trunk/src/org/openstreetmap/josm/gui/mappaint/mapcss/ExpressionFactory.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/mappaint/mapcss/ExpressionFactory.java	(revision 17758)
+++ /trunk/src/org/openstreetmap/josm/gui/mappaint/mapcss/ExpressionFactory.java	(revision 17759)
@@ -190,4 +190,5 @@
         FACTORY_MAP.put("lower", Factory.of(String.class, Functions::lower));
         FACTORY_MAP.put("minus", Factory.ofNumberVarArgs(Functions::minus));
+        FACTORY_MAP.put("mod", Factory.of(float.class, float.class, Functions::mod));
         FACTORY_MAP.put("not", Factory.of(boolean.class, Functions::not));
         FACTORY_MAP.put("not_equal", Factory.of(Object.class, Object.class, Functions::not_equal));
Index: /trunk/src/org/openstreetmap/josm/gui/mappaint/mapcss/Functions.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/mappaint/mapcss/Functions.java	(revision 17758)
+++ /trunk/src/org/openstreetmap/josm/gui/mappaint/mapcss/Functions.java	(revision 17759)
@@ -112,4 +112,14 @@
 
     /**
+     * Function associated to the math modulo "%" operator.
+     * @param a first value
+     * @param b second value
+     * @return {@code a mod b}, e.g., {@code mod(7, 5) = 2}
+     */
+    public static float mod(float a, float b) { // NO_UCD (unused code)
+        return a % b;
+    }
+
+    /**
      * Creates a list of values, e.g., for the {@code dashes} property.
      * @param ignored The environment (ignored)
