瀏覽代碼

preserve integer representation in `ui.number` (fixes #2454)

Falko Schindler 1 年之前
父節點
當前提交
8d91ca3617
共有 2 個文件被更改,包括 24 次插入0 次删除
  1. 3 0
      nicegui/elements/number.py
  2. 21 0
      tests/test_number.py

+ 3 - 0
nicegui/elements/number.py

@@ -119,6 +119,9 @@ class Number(ValidationElement, DisableableElement):
         if value is None:
             return None
         if self.format is None:
+            old_value = float(self._props.get(self.VALUE_PROP) or 0)
+            if old_value == int(old_value) and value == int(value):
+                return str(int(value))  # preserve integer representation
             return str(value)
         if value == '':
             return 0

+ 21 - 0
tests/test_number.py

@@ -1,5 +1,6 @@
 import pytest
 from selenium.webdriver.common.by import By
+from selenium.webdriver.common.keys import Keys
 
 from nicegui import ui
 from nicegui.testing import Screen
@@ -86,3 +87,23 @@ def test_rounding(precision: int, screen: Screen):
         screen.should_contain('number=_12.3_')
     elif precision == -1:
         screen.should_contain('number=_10.0_')
+
+
+def test_int_float_conversion_on_error1(screen: Screen):
+    ui.number('Number', validation={'Error': lambda value: value == 1}, value=1)
+
+    screen.open('/')
+    element = screen.selenium.find_element(By.XPATH, '//*[@aria-label="Number"]')
+    element.send_keys('2')
+    screen.should_contain('Error')
+    assert element.get_attribute('value') == '12'
+
+
+def test_int_float_conversion_on_error2(screen: Screen):
+    ui.number('Number', validation={'Error': lambda value: value == 1.02}, value=1.02)
+
+    screen.open('/')
+    element = screen.selenium.find_element(By.XPATH, '//*[@aria-label="Number"]')
+    element.send_keys(Keys.BACKSPACE)
+    screen.should_contain('Error')
+    assert element.get_attribute('value') == '1.0'