r300 - in trunk/nuiton-struts2/src: main/java/org/nuiton/web/struts2/converters test/java/org/nuiton/web/struts2 test/java/org/nuiton/web/struts2/converters
Author: sbavencoff Date: 2014-01-22 16:21:44 +0100 (Wed, 22 Jan 2014) New Revision: 300 Url: http://nuiton.org/projects/nuiton-web/repository/revisions/300 Log: refs #3010 : create a number converter with local parameters Added: trunk/nuiton-struts2/src/main/java/org/nuiton/web/struts2/converters/LocalNumberConverter.java trunk/nuiton-struts2/src/test/java/org/nuiton/web/struts2/converters/ trunk/nuiton-struts2/src/test/java/org/nuiton/web/struts2/converters/LocalNumberConverterTest.java Modified: trunk/nuiton-struts2/src/main/java/org/nuiton/web/struts2/converters/DoubleConverter.java Modified: trunk/nuiton-struts2/src/main/java/org/nuiton/web/struts2/converters/DoubleConverter.java =================================================================== --- trunk/nuiton-struts2/src/main/java/org/nuiton/web/struts2/converters/DoubleConverter.java 2014-01-06 18:07:49 UTC (rev 299) +++ trunk/nuiton-struts2/src/main/java/org/nuiton/web/struts2/converters/DoubleConverter.java 2014-01-22 15:21:44 UTC (rev 300) @@ -24,13 +24,12 @@ * #L% */ -import java.util.Arrays; -import java.util.Map; - +import com.opensymphony.xwork2.conversion.TypeConversionException; import org.apache.commons.lang3.StringUtils; import org.apache.struts2.util.StrutsTypeConverter; -import com.opensymphony.xwork2.conversion.TypeConversionException; +import java.util.Arrays; +import java.util.Map; /** * Let user input either "0.1" or "0,1" as a double value. To use this converter, add the following lines in your @@ -42,7 +41,10 @@ * </pre> * * @author Arnaud Thimel <thimel@codelutin.com> + * @Deprecated since 1.15 prefer use LocalNumberConverter */ + +@Deprecated public class DoubleConverter extends StrutsTypeConverter { @Override Added: trunk/nuiton-struts2/src/main/java/org/nuiton/web/struts2/converters/LocalNumberConverter.java =================================================================== --- trunk/nuiton-struts2/src/main/java/org/nuiton/web/struts2/converters/LocalNumberConverter.java (rev 0) +++ trunk/nuiton-struts2/src/main/java/org/nuiton/web/struts2/converters/LocalNumberConverter.java 2014-01-22 15:21:44 UTC (rev 300) @@ -0,0 +1,152 @@ +package org.nuiton.web.struts2.converters; + +import com.opensymphony.xwork2.conversion.TypeConversionException; +import com.opensymphony.xwork2.conversion.impl.NumberConverter; +import org.apache.commons.lang3.StringUtils; + +import java.lang.reflect.Member; +import java.text.DecimalFormat; +import java.text.ParseException; +import java.util.Map; + +/** + * this class convert a double and integer with local format or standard format + * To use this converter, add the following lines in your + * <code>classpath:xwork-conversion.properties</code> file : + * + * <pre> + * java.lang.Double=org.nuiton.web.struts2.converters.LocalNumberConverter + * java.lang.Integer=org.nuiton.web.struts2.converters.LocalNumberConverter + * </pre> + * + * <code>classpath:struts.xml</code> file : + * + * <pre> + * <bean type="com.opensymphony.xwork2.conversion.impl.NumberConverter" class="org.nuiton.web.struts2.converters.LocalNumberConverter" scope="singleton"/> + * </pre> + * + * @author Sylvain Bavencoff <bavencoff@codelutin.com> + */ +public class LocalNumberConverter extends NumberConverter { + + protected int getMinDecimals() { + return 0; + } + + protected int getMaxDecimals() { + return 3; + } + + protected DecimalFormat integerFormat; + + protected DecimalFormat decimalFormat; + + public LocalNumberConverter() { + integerFormat = new DecimalFormat("###,##0"); + decimalFormat = new DecimalFormat("###,##0." + StringUtils.repeat("0", getMinDecimals()) + StringUtils.repeat("#", getMaxDecimals() - getMinDecimals())); + } + + public Object convertValue(Map<String, Object> context, Object target, Member member, String propertyName, Object value, Class toType) { + Object result; + + if (toType == String.class && (value instanceof Double || value instanceof Integer)) { + + result = convertToString(value); + + } else if (value instanceof String + && (toType == Double.class || toType == double.class || toType == Integer.class || toType == int.class)) { + + result = convertToNumber((String) value, toType); + + } else { + + result = super.convertValue(context, target, member, propertyName, value, toType); + + } + + return result; + + } + + protected String convertToString(Object value) { + + String string; + + if (value == null) { + + string = StringUtils.EMPTY; + + } else if (value instanceof Integer) { + + string = integerFormat.format(value); + + } else { + + string = decimalFormat.format(value); + + } + + return string; + } + + protected Number convertToNumber(String string, Class toType) { + Number parsedValue; + + if (string == null || string.isEmpty()) { + + if (toType.isPrimitive()) { + + if (toType == Double.class || toType == double.class) { + + parsedValue = new Double(0); + + } else { + + parsedValue = new Integer(0); + + } + } else { + + parsedValue = null; + + } + + } else { + + char groupingSeparator = integerFormat.getDecimalFormatSymbols().getGroupingSeparator(); + + if (Character.isSpaceChar(groupingSeparator)) { + + string = string.replaceAll(" ", groupingSeparator + ""); + + } + + try { + + if (toType == Double.class || toType == double.class) { + + string = string.replace('.', decimalFormat.getDecimalFormatSymbols().getDecimalSeparator()); + + parsedValue = decimalFormat.parse(string).doubleValue(); + + } else { + + parsedValue = integerFormat.parse(string).intValue(); + + } + + } catch (ParseException e ){ + + throw new TypeConversionException("strings=" + string, e); + + } catch (NumberFormatException e ){ + + throw new TypeConversionException("strings=" + string, e); + + } + + } + + return parsedValue; + } +} Added: trunk/nuiton-struts2/src/test/java/org/nuiton/web/struts2/converters/LocalNumberConverterTest.java =================================================================== --- trunk/nuiton-struts2/src/test/java/org/nuiton/web/struts2/converters/LocalNumberConverterTest.java (rev 0) +++ trunk/nuiton-struts2/src/test/java/org/nuiton/web/struts2/converters/LocalNumberConverterTest.java 2014-01-22 15:21:44 UTC (rev 300) @@ -0,0 +1,327 @@ +package org.nuiton.web.struts2.converters; + +import org.junit.Assert; +import org.junit.Test; + +import java.text.DecimalFormatSymbols; +import java.util.Locale; + +/** + * @author Sylvain Bavencoff <bavencoff@codelutin.com> + */ +public class LocalNumberConverterTest { + + protected LocalNumberConverter converter; + + protected Object convert(Object value, Class toType) { + return converter.convertValue(null, null, null, "", value, toType); + } + + @Test + public void testConvertValue() { + converter = new LocalNumberConverter(); + + DecimalFormatSymbols symbols = new DecimalFormatSymbols(Locale.getDefault(Locale.Category.FORMAT)); + + symbols.getCurrency(); + char minusSign = symbols.getMinusSign(); + char groupingSeparator = symbols.getGroupingSeparator(); + char decimalSeparator = symbols.getDecimalSeparator(); + + + // Integer to String + Assert.assertEquals("0", + convert(0, String.class)); + + Assert.assertEquals("0", + convert(new Integer(0), String.class)); + + Assert.assertEquals("18", + convert(18, String.class)); + + Assert.assertEquals("18", + convert(new Integer(18), String.class), "18"); + + Assert.assertEquals(minusSign + "18", + convert(-18, String.class)); + + Assert.assertEquals(minusSign + "18", + convert(new Integer(-18), String.class)); + + Assert.assertEquals("1" + groupingSeparator + "000" + groupingSeparator + "008", + convert(1000008, String.class)); + + Assert.assertEquals("1" + groupingSeparator + "000" + groupingSeparator + "008", + convert(new Integer(1000008), String.class)); + + Assert.assertEquals(minusSign + "1" + groupingSeparator + "000" + groupingSeparator + "008", + convert(-1000008, String.class)); + + Assert.assertEquals(minusSign + "1" + groupingSeparator + "000" + groupingSeparator + "008", + convert(new Integer(-1000008), String.class)); + + // Double to String + Assert.assertEquals("0", + convert(0, String.class)); + + Assert.assertEquals("0", + convert(new Double(0), String.class)); + + Assert.assertEquals("18", + convert(18, String.class)); + + Assert.assertEquals("18", convert(new Double(18), String.class)); + + Assert.assertEquals(minusSign + "18", + convert(-18, String.class)); + + Assert.assertEquals(minusSign + "18", + convert(new Double(-18), String.class)); + + Assert.assertEquals("1" + groupingSeparator + "000" + groupingSeparator + "008", + convert(1000008, String.class)); + + Assert.assertEquals("1" + groupingSeparator + "000" + groupingSeparator + "008", + convert(new Double(1000008), String.class)); + + Assert.assertEquals(minusSign + "1" + groupingSeparator + "000" + groupingSeparator + "008", + convert(-1000008, String.class)); + + Assert.assertEquals(minusSign + "1" + groupingSeparator + "000" + groupingSeparator + "008", + convert(new Double(-1000008), String.class)); + + Assert.assertEquals("0" + decimalSeparator + "58", + convert(0.58, String.class)); + + Assert.assertEquals("0" + decimalSeparator + "58", + convert(new Double(0.58), String.class)); + + Assert.assertEquals("18" + decimalSeparator + "58", + convert(18.58, String.class)); + + Assert.assertEquals("18" + decimalSeparator + "58", + convert(new Double(18.58), String.class)); + + Assert.assertEquals(minusSign + "18" + decimalSeparator + "58", + convert(-18.58, String.class)); + + Assert.assertEquals(minusSign + "18" + decimalSeparator + "58", + convert(new Double(-18.58), String.class)); + + Assert.assertEquals("1" + groupingSeparator + "000" + groupingSeparator + "008" + decimalSeparator + "58", + convert(1000008.58, String.class)); + + Assert.assertEquals("1" + groupingSeparator + "000" + groupingSeparator + "008" + decimalSeparator + "58", + convert(new Double(1000008.58), String.class)); + + Assert.assertEquals(minusSign + "1" + groupingSeparator + "000" + groupingSeparator + "008" + decimalSeparator + "58", + convert(-1000008.58, String.class)); + + Assert.assertEquals(minusSign + "1" + groupingSeparator + "000" + groupingSeparator + "008" + decimalSeparator + "58", + convert(new Double(-1000008.58), String.class)); + + Assert.assertEquals("0" + decimalSeparator + "586", + convert(0.5864, String.class)); + + Assert.assertEquals("0" + decimalSeparator + "586", + convert(new Double(0.5864), String.class)); + + Assert.assertEquals("0" + decimalSeparator + "587", + convert(0.5867, String.class)); + + Assert.assertEquals("0" + decimalSeparator + "587", + convert(new Double(0.5867), String.class)); + + // String to Integer + Assert.assertEquals(0, + convert(null, int.class)); + + Assert.assertEquals(null, + convert(null, Integer.class)); + + Assert.assertEquals(0, + convert("", int.class)); + + Assert.assertEquals(null, + convert("", Integer.class)); + + Assert.assertEquals(0, + convert("0", int.class)); + + Assert.assertEquals(new Integer(0), + convert("0", Integer.class)); + + Assert.assertEquals(12, + convert("12", int.class)); + + Assert.assertEquals(new Integer(12), + convert("12", Integer.class)); + + Assert.assertEquals(-12, + convert(minusSign + "12", int.class)); + + Assert.assertEquals(new Integer(-12), + convert(minusSign + "12", Integer.class)); + + if (Character.isSpaceChar(groupingSeparator)) { + + Assert.assertEquals(1002, + convert("1 002", int.class)); + + Assert.assertEquals(new Integer(1002), + convert("1 002", Integer.class)); + + Assert.assertEquals(-1002, + convert(minusSign + "1 002", int.class)); + + Assert.assertEquals(new Integer(-1002), + convert(minusSign + "1 002", Integer.class)); + + } + + Assert.assertEquals(1002, + convert("1" + groupingSeparator + "002", int.class)); + Assert.assertEquals(new Integer(1002), + convert("1" + groupingSeparator + "002", Integer.class)); + + Assert.assertEquals(-1002, + convert(minusSign + "1" + groupingSeparator + "002", int.class)); + + Assert.assertEquals(new Integer(-1002), + convert(minusSign + "1" + groupingSeparator + "002", Integer.class)); + + // String to Double + Assert.assertEquals(0d, + convert(null, double.class)); + + Assert.assertEquals(null, + convert(null, Double.class)); + + Assert.assertEquals(0d, + convert("", double.class)); + + Assert.assertEquals(null, + convert("", Double.class)); + + Assert.assertEquals(0d, + convert("0", double.class)); + + Assert.assertEquals(new Double(0), + convert("0", Double.class)); + + Assert.assertEquals(12d, + convert("12", double.class)); + + Assert.assertEquals(new Double(12), + convert("12", Double.class)); + + Assert.assertEquals(-12d, + convert(minusSign + "12", double.class)); + + Assert.assertEquals(new Double(-12), + convert(minusSign + "12", Double.class)); + + + if (Character.isSpaceChar(groupingSeparator)) { + + Assert.assertEquals(1002d, + convert("1 002", double.class)); + + Assert.assertEquals(new Double(1002), + convert("1 002", Double.class)); + + Assert.assertEquals(-1002d, + convert(minusSign + "1 002", double.class)); + + Assert.assertEquals(new Double(-1002), + convert(minusSign + "1 002", Double.class)); + + } + + Assert.assertEquals(1002d, + convert("1" + groupingSeparator + "002", double.class)); + + Assert.assertEquals(new Double(1002), + convert("1" + groupingSeparator + "002", Double.class)); + + Assert.assertEquals(-1002d, + convert(minusSign + "1" + groupingSeparator + "002", double.class)); + + Assert.assertEquals(new Double(-1002), + convert(minusSign + "1" + groupingSeparator + "002", Double.class)); + + Assert.assertEquals(0.36, + convert("0" + decimalSeparator + "36", double.class)); + + Assert.assertEquals(new Double(0.36), + convert("0" + decimalSeparator + "36", Double.class)); + + Assert.assertEquals(12.36, + convert("12" + decimalSeparator + "36", double.class)); + + Assert.assertEquals(new Double(12.36), + convert("12" + decimalSeparator + "36", Double.class)); + + Assert.assertEquals(-12.36, + convert(minusSign + "12" + decimalSeparator + "36", double.class)); + + Assert.assertEquals(new Double(-12.36), + convert(minusSign + "12" + decimalSeparator + "36", Double.class)); + + + if (Character.isSpaceChar(groupingSeparator)) { + + Assert.assertEquals(1002.36, + convert("1 002" + decimalSeparator + "36", double.class)); + + Assert.assertEquals(new Double(1002.36), + convert("1 002" + decimalSeparator + "36", Double.class)); + + Assert.assertEquals(-1002.36, + convert(minusSign + "1 002" + decimalSeparator + "36", double.class)); + + Assert.assertEquals(new Double(-1002.36), + convert(minusSign + "1 002" + decimalSeparator + "36", Double.class)); + + } + + Assert.assertEquals(1002.36, + convert("1" + groupingSeparator + "002" + decimalSeparator + "36", double.class)); + + Assert.assertEquals(new Double(1002.36), + convert("1" + groupingSeparator + "002" + decimalSeparator + "36", Double.class)); + + Assert.assertEquals(-1002.36, + convert(minusSign + "1" + groupingSeparator + "002" + decimalSeparator + "36", double.class)); + + Assert.assertEquals(new Double(-1002.36), + convert(minusSign + "1" + groupingSeparator + "002" + decimalSeparator + "36", Double.class)); + + Assert.assertEquals(12.3669, + convert("12" + decimalSeparator + "3669", double.class)); + + Assert.assertEquals(new Double(12.3669), + convert("12" + decimalSeparator + "3669", Double.class)); + + Assert.assertEquals(12.36, + convert("12.36", double.class)); + + Assert.assertEquals(new Double(12.36), + convert("12.36", Double.class)); + + Assert.assertEquals(1002.36, + convert("1 002.36", double.class)); + + Assert.assertEquals(new Double(1002.36), + convert("1 002.36", Double.class)); + + Assert.assertEquals(1002.36, + convert("1002.36", double.class)); + + Assert.assertEquals(new Double(1002.36), + convert("1002.36", Double.class)); + + } + + +}
participants (1)
-
sbavencoffļ¼ users.nuiton.org