]> source.dussan.org Git - vaadin-framework.git/commitdiff
Support float fields with FieldGroup (#10553) 18/518/1
authorArtur Signell <artur@vaadin.com>
Mon, 17 Dec 2012 19:12:58 +0000 (21:12 +0200)
committerArtur Signell <artur@vaadin.com>
Mon, 17 Dec 2012 19:13:19 +0000 (21:13 +0200)
Change-Id: Ib7f6fff09e9372576aadfc44c82f7bb9ce9525cf

server/src/com/vaadin/data/util/converter/DefaultConverterFactory.java
server/src/com/vaadin/data/util/converter/StringToFloatConverter.java [new file with mode: 0644]
server/tests/src/com/vaadin/tests/server/component/abstractfield/DefaultConverterFactory.java

index 17b89ccb209bc06186d5dbc029a3cfbbe5bbfb37..16bab6479071288496a2cc4f77adcf12f68df95f 100644 (file)
@@ -95,6 +95,8 @@ public class DefaultConverterFactory implements ConverterFactory {
     protected Converter<String, ?> createStringConverter(Class<?> sourceType) {
         if (Double.class.isAssignableFrom(sourceType)) {
             return new StringToDoubleConverter();
+        } else if (Float.class.isAssignableFrom(sourceType)) {
+            return new StringToFloatConverter();
         } else if (Integer.class.isAssignableFrom(sourceType)) {
             return new StringToIntegerConverter();
         } else if (Boolean.class.isAssignableFrom(sourceType)) {
diff --git a/server/src/com/vaadin/data/util/converter/StringToFloatConverter.java b/server/src/com/vaadin/data/util/converter/StringToFloatConverter.java
new file mode 100644 (file)
index 0000000..76d53a7
--- /dev/null
@@ -0,0 +1,122 @@
+/*
+ * Copyright 2011 Vaadin Ltd.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+
+package com.vaadin.data.util.converter;
+
+import java.text.NumberFormat;
+import java.text.ParsePosition;
+import java.util.Locale;
+
+/**
+ * A converter that converts from {@link String} to {@link Float} and back. Uses
+ * the given locale and a {@link NumberFormat} instance for formatting and
+ * parsing.
+ * <p>
+ * Leading and trailing white spaces are ignored when converting from a String.
+ * </p>
+ * <p>
+ * Override and overwrite {@link #getFormat(Locale)} to use a different format.
+ * </p>
+ * 
+ * @author Vaadin Ltd
+ * @since 7.0
+ */
+public class StringToFloatConverter implements Converter<String, Float> {
+
+    /**
+     * Returns the format used by {@link #convertToPresentation(Float, Locale)}
+     * and {@link #convertToModel(String, Locale)}.
+     * 
+     * @param locale
+     *            The locale to use
+     * @return A NumberFormat instance
+     */
+    protected NumberFormat getFormat(Locale locale) {
+        if (locale == null) {
+            locale = Locale.getDefault();
+        }
+
+        return NumberFormat.getNumberInstance(locale);
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see
+     * com.vaadin.data.util.converter.Converter#convertToModel(java.lang.Object,
+     * java.util.Locale)
+     */
+    @Override
+    public Float convertToModel(String value, Locale locale)
+            throws ConversionException {
+        if (value == null) {
+            return null;
+        }
+
+        // Remove leading and trailing white space
+        value = value.trim();
+
+        ParsePosition parsePosition = new ParsePosition(0);
+        Number parsedValue = getFormat(locale).parse(value, parsePosition);
+        if (parsePosition.getIndex() != value.length()) {
+            throw new ConversionException("Could not convert '" + value
+                    + "' to " + getModelType().getName());
+        }
+        if (parsedValue == null) {
+            // Convert "" to null
+            return null;
+        }
+
+        return parsedValue.floatValue();
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see
+     * com.vaadin.data.util.converter.Converter#convertToPresentation(java.lang
+     * .Object, java.util.Locale)
+     */
+    @Override
+    public String convertToPresentation(Float value, Locale locale)
+            throws ConversionException {
+        if (value == null) {
+            return null;
+        }
+
+        return getFormat(locale).format(value);
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see com.vaadin.data.util.converter.Converter#getModelType()
+     */
+    @Override
+    public Class<Float> getModelType() {
+        return Float.class;
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see com.vaadin.data.util.converter.Converter#getPresentationType()
+     */
+    @Override
+    public Class<String> getPresentationType() {
+        return String.class;
+    }
+}
index 9338d74f055673140260de6b08742f18fd74b41b..698e9bcee42e6a4e5216141ab3d978114b61d9e2 100644 (file)
@@ -15,6 +15,33 @@ import com.vaadin.ui.TextField;
 
 public class DefaultConverterFactory extends TestCase {
 
+    public static class FloatBean {
+        float f1;
+        Float f2;
+
+        public FloatBean(float f1, Float f2) {
+            this.f1 = f1;
+            this.f2 = f2;
+        }
+
+        public float getF1() {
+            return f1;
+        }
+
+        public void setF1(float f1) {
+            this.f1 = f1;
+        }
+
+        public Float getF2() {
+            return f2;
+        }
+
+        public void setF2(Float f2) {
+            this.f2 = f2;
+        }
+
+    }
+
     Person paulaBean = new Person("Paula", "Brilliant", "paula@brilliant.com",
             34, Sex.FEMALE, new Address("Paula street 1", 12345, "P-town",
                     Country.FINLAND));
@@ -25,6 +52,21 @@ public class DefaultConverterFactory extends TestCase {
         paulaBean.setRent(rent);
     }
 
+    public void testFloatConversion() {
+        VaadinSession sess = new VaadinSession(null);
+        VaadinSession.setCurrent(sess);
+
+        TextField tf = new TextField();
+        tf.setLocale(new Locale("en", "US"));
+        tf.setPropertyDataSource(new MethodProperty<Integer>(new FloatBean(12f,
+                23f), "f2"));
+        assertEquals("23", tf.getValue());
+        tf.setValue("24");
+        assertEquals("24", tf.getValue());
+        assertEquals(24f, tf.getConvertedValue());
+        assertEquals(24f, tf.getPropertyDataSource().getValue());
+    }
+
     public void testDefaultNumberConversion() {
         VaadinSession app = new VaadinSession(null);
         VaadinSession.setCurrent(app);