diff --git a/src/org/openstreetmap/josm/gui/autofilter/AutoFilterManager.java b/src/org/openstreetmap/josm/gui/autofilter/AutoFilterManager.java
index 44f503ed0d..5643cf12ca 100644
--- a/src/org/openstreetmap/josm/gui/autofilter/AutoFilterManager.java
+++ b/src/org/openstreetmap/josm/gui/autofilter/AutoFilterManager.java
@@ -14,7 +14,6 @@ import java.util.NavigableSet;
 import java.util.Objects;
 import java.util.TreeMap;
 import java.util.TreeSet;
-import java.util.function.Consumer;
 
 import org.openstreetmap.josm.actions.mapmode.MapMode;
 import org.openstreetmap.josm.data.osm.BBox;
@@ -196,7 +195,7 @@ implements ZoomChangeListener, MapModeChangeListener, DataSetListener, Preferenc
 
         @Override
         public boolean match(OsmPrimitive osm) {
-            return rule.getTagValuesForPrimitive(osm).anyMatch(v -> v == value);
+            return rule.getTagValuesForPrimitive(osm, false).anyMatch(v -> v == value);
         }
 
         @Override
@@ -260,10 +259,15 @@ implements ZoomChangeListener, MapModeChangeListener, DataSetListener, Preferenc
         }
         BBox bbox = MainApplication.getMap().mapView.getState().getViewArea().getLatLonBoundsBox().toBBox();
         NavigableSet<Integer> values = new TreeSet<>();
-        Consumer<OsmPrimitive> consumer = o -> enabledRule.getTagValuesForPrimitive(o).forEach(values::add);
-        ds.searchNodes(bbox).forEach(consumer);
-        ds.searchWays(bbox).forEach(consumer);
-        ds.searchRelations(bbox).forEach(consumer);
+        for (var primitiveList : List.of(ds.searchNodes(bbox), ds.searchWays(bbox), ds.searchRelations(bbox))) {
+            // add all values that are directly mentioned
+            primitiveList.forEach(o -> enabledRule.getTagValuesForPrimitive(o, true).forEach(values::add));
+            // only add integer values from value ranges, not fractional values
+            primitiveList.forEach(o -> enabledRule.getTagValuesForPrimitive(o, false)
+                    .filter(v -> !enabledRule.formatValue(v).contains("."))
+                    .forEach(values::add));
+
+        }
         return values;
     }
 
diff --git a/src/org/openstreetmap/josm/gui/autofilter/AutoFilterRule.java b/src/org/openstreetmap/josm/gui/autofilter/AutoFilterRule.java
index f722122bd6..e78c42d156 100644
--- a/src/org/openstreetmap/josm/gui/autofilter/AutoFilterRule.java
+++ b/src/org/openstreetmap/josm/gui/autofilter/AutoFilterRule.java
@@ -130,17 +130,19 @@ public class AutoFilterRule {
 
     /**
      * Returns the numeric values for the given OSM primitive
-     * @param osm the primitive
+     *
+     * @param osm              the primitive
+     * @param directValuesOnly whether "inner" values from ranges (such as 6 and 7 for 5-8) should be omitted
      * @return a stream of numeric values
      */
-    public IntStream getTagValuesForPrimitive(OsmPrimitive osm) {
+    public IntStream getTagValuesForPrimitive(OsmPrimitive osm, boolean directValuesOnly) {
         if (allKeys.size() == 1) {
-            IntStream values = getTagValuesForPrimitive(osm, key);
+            IntStream values = getTagValuesForPrimitive(osm, key, directValuesOnly);
             if (values != null) return values;
         } else {
             Set<Integer> allValues = new HashSet<>();
             for (String k : allKeys) {
-                IntStream values = getTagValuesForPrimitive(osm, k);
+                IntStream values = getTagValuesForPrimitive(osm, k, directValuesOnly);
                 if (values != null) { values.forEach(allValues::add); }
             }
             if (!allValues.isEmpty()) return allValues.stream().mapToInt(it -> it).sorted();
@@ -148,7 +150,7 @@ public class AutoFilterRule {
         return Boolean.TRUE.equals(PROP_AUTO_FILTER_DEFAULTS.get()) ? defaultValueSupplier.apply(osm) : IntStream.empty();
     }
 
-    private IntStream getTagValuesForPrimitive(OsmPrimitive osm, String key) {
+    private IntStream getTagValuesForPrimitive(OsmPrimitive osm, String key, boolean directValuesOnly) {
         String value = osm.get(key);
         if (value != null) {
             Pattern p = Pattern.compile("(-?[0-9]+)-(-?[0-9]+)");
@@ -157,7 +159,11 @@ public class AutoFilterRule {
                 if (m.matches()) {
                     int a = valueExtractor.applyAsInt(m.group(1));
                     int b = valueExtractor.applyAsInt(m.group(2));
-                    return IntStream.rangeClosed(Math.min(a, b), Math.max(a, b));
+                    if (directValuesOnly && a != b) {
+                        return IntStream.of(a, b).sorted();
+                    } else {
+                        return IntStream.rangeClosed(Math.min(a, b), Math.max(a, b));
+                    }
                 } else {
                     try {
                         return IntStream.of(valueExtractor.applyAsInt(v));
diff --git a/test/unit/org/openstreetmap/josm/gui/autofilter/AutoFilterRuleTest.java b/test/unit/org/openstreetmap/josm/gui/autofilter/AutoFilterRuleTest.java
index ae1b15b909..3d1914dcb6 100644
--- a/test/unit/org/openstreetmap/josm/gui/autofilter/AutoFilterRuleTest.java
+++ b/test/unit/org/openstreetmap/josm/gui/autofilter/AutoFilterRuleTest.java
@@ -22,7 +22,7 @@ import org.junit.jupiter.api.Test;
 @I18n
 class AutoFilterRuleTest {
     /**
-     * Unit test of {@link AutoFilterRule#getTagValuesForPrimitive(OsmPrimitive)}.
+     * Unit test of {@link AutoFilterRule#getTagValuesForPrimitive(OsmPrimitive, boolean)}.
      */
     @Test
     void testTagValuesForPrimitive() {
@@ -43,7 +43,7 @@ class AutoFilterRuleTest {
     }
 
     /**
-     * Unit test of {@link AutoFilterRule#getTagValuesForPrimitive(OsmPrimitive)} to deal with {@code %} of key {@code incline}.
+     * Unit test of {@link AutoFilterRule#getTagValuesForPrimitive(OsmPrimitive, boolean)} to deal with {@code %} of key {@code incline}.
      */
     @Test
     void testTagValuesForPrimitiveInclineUnit() {
@@ -54,7 +54,7 @@ class AutoFilterRuleTest {
     }
 
     /**
-     * Unit test of {@link AutoFilterRule#getTagValuesForPrimitive(OsmPrimitive)} provides sensible defaults, see #17496.
+     * Unit test of {@link AutoFilterRule#getTagValuesForPrimitive(OsmPrimitive, boolean)} provides sensible defaults, see #17496.
      */
     @Test
     void testTagValuesForPrimitivesDefaults() {
@@ -71,7 +71,7 @@ class AutoFilterRuleTest {
 
     private void assertTagValuesForPrimitive(AutoFilterRule rule, String assertion, int... expected) {
         final OsmPrimitive primitive = OsmUtils.createPrimitive(assertion);
-        final int[] actual = rule.getTagValuesForPrimitive(primitive).toArray();
+        final int[] actual = rule.getTagValuesForPrimitive(primitive, false).toArray();
         assertArrayEquals(expected, actual);
     }
 
