From c7d696acc73729e27d982dec0b7f66f3b74106c6 Mon Sep 17 00:00:00 2001 From: chochos Date: Tue, 22 Feb 2011 02:15:38 +0000 Subject: [PATCH] Simplified some of the formatting routines in IsoType, using String.format(). Added unit tests to check that the new formatting code works fine. git-svn-id: https://j8583.svn.sourceforge.net/svnroot/j8583/j8583@69 db60a039-f72e-0410-b1d2-baa000846441 --- src/main/java/com/solab/iso8583/IsoType.java | 46 ++++++-------------- src/test/java/j8583/TestFormats.java | 44 +++++++++++++++++++ 2 files changed, 58 insertions(+), 32 deletions(-) create mode 100644 src/test/java/j8583/TestFormats.java diff --git a/src/main/java/com/solab/iso8583/IsoType.java b/src/main/java/com/solab/iso8583/IsoType.java index a89fa97..7af04aa 100644 --- a/src/main/java/com/solab/iso8583/IsoType.java +++ b/src/main/java/com/solab/iso8583/IsoType.java @@ -19,8 +19,6 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA package com.solab.iso8583; import java.math.BigDecimal; -import java.text.DecimalFormat; -import java.text.SimpleDateFormat; import java.util.Date; /** Defines the possible values types that can be used in the fields. @@ -80,13 +78,13 @@ public enum IsoType { * otherwise. */ public String format(Date value) { if (this == DATE10) { - return new SimpleDateFormat("MMddHHmmss").format(value); + return String.format("%Tm% length) { return value.substring(0, length); + } else if (value.length() == length) { + return value; + } else { + return String.format(String.format("%%-%ds", length), value); } - char[] c = new char[length]; - System.arraycopy(value.toCharArray(), 0, c, 0, value.length()); - for (int i = value.length(); i < c.length; i++) { - c[i] = ' '; - } - return new String(c); } else if (this == LLVAR || this == LLLVAR) { return value; } else if (this == NUMERIC) { @@ -121,7 +117,7 @@ public enum IsoType { System.arraycopy(x, 0, c, lim, x.length); return new String(c); } else if (this == AMOUNT) { - return IsoType.NUMERIC.format(new BigDecimal(value).movePointRight(2).intValue(), 12); + return IsoType.NUMERIC.format(new BigDecimal(value).movePointRight(2).longValue(), 12); } else if (this == BINARY) { if (value == null) { @@ -153,28 +149,15 @@ public enum IsoType { /** Formats the integer value as a NUMERIC, an AMOUNT, or a String. */ public String format(long value, int length) { if (this == NUMERIC) { - char[] c = new char[length]; - char[] x = Long.toString(value).toCharArray(); - if (x.length > length) { + String x = String.format(String.format("%%0%dd", length), value); + if (x.length() > length) { throw new IllegalArgumentException("Numeric value is larger than intended length: " + value + " LEN " + length); } - int lim = c.length - x.length; - for (int i = 0; i < lim; i++) { - c[i] = '0'; - } - System.arraycopy(x, 0, c, lim, x.length); - return new String(c); + return x; } else if (this == ALPHA || this == LLVAR || this == LLLVAR) { return format(Long.toString(value), length); } else if (this == AMOUNT) { - String v = Long.toString(value); - char[] digits = new char[12]; - for (int i = 0; i < 12; i++) { - digits[i] = '0'; - } - //No hay decimales asi que dejamos los dos ultimos digitos como 0 - System.arraycopy(v.toCharArray(), 0, digits, 10 - v.length(), v.length()); - return new String(digits); + return String.format("%010d00", value); } else if (this == BINARY || this == LLBIN || this == LLLBIN) { //TODO } @@ -184,8 +167,7 @@ public enum IsoType { /** Formats the BigDecimal as an AMOUNT, NUMERIC, or a String. */ public String format(BigDecimal value, int length) { if (this == AMOUNT) { - String v = new DecimalFormat(value.signum() >= 0 ? "0000000000.00" : "000000000.00").format(value); - return String.format("%s%s", v.substring(0, 10), v.substring(11)); + return String.format("%012d", value.movePointRight(2).longValue()); } else if (this == NUMERIC) { return format(value.longValue(), length); } else if (this == ALPHA || this == LLVAR || this == LLLVAR) { diff --git a/src/test/java/j8583/TestFormats.java b/src/test/java/j8583/TestFormats.java new file mode 100644 index 0000000..f7b4466 --- /dev/null +++ b/src/test/java/j8583/TestFormats.java @@ -0,0 +1,44 @@ +package j8583; + +import java.math.BigDecimal; +import java.util.Date; + +import org.junit.Test; + +import com.solab.iso8583.IsoType; + +/** Tests formatting of certain IsoTypes. + * + * @author Enrique Zamudio + */ +public class TestFormats { + + private Date date = new Date(96867296000l); + + @Test + public void testDateFormats() { + assert IsoType.DATE10.format(date).equals("0125213456"); + assert IsoType.DATE4.format(date).equals("0125"); + assert IsoType.DATE_EXP.format(date).equals("7301"); + assert IsoType.TIME.format(date).equals("213456"); + } + + @Test + public void testNumericFormats() { + assert IsoType.NUMERIC.format(123, 6).equals("000123"); + assert IsoType.NUMERIC.format("hola", 6).equals("00hola"); + assert IsoType.AMOUNT.format(12345, 0).equals("000001234500"); + assert IsoType.AMOUNT.format(new BigDecimal("12345.67"), 0).equals("000001234567"); + assert IsoType.AMOUNT.format("1234.56", 0).equals("000000123456"); + } + + @Test + public void testStringFormats() { + assert IsoType.ALPHA.format("hola", 3).equals("hol"); + assert IsoType.ALPHA.format("hola", 4).equals("hola"); + assert IsoType.ALPHA.format("hola", 6).equals("hola "); + assert IsoType.LLVAR.format("hola", 0).equals("hola"); + assert IsoType.LLLVAR.format("hola", 0).equals("hola"); + } + +}