From c4f6aed639753b007c812dfb62b96e249889a077 Mon Sep 17 00:00:00 2001 From: Alexey Andreev Date: Thu, 4 Jun 2015 21:40:26 +0300 Subject: [PATCH] Fix some cases of formatting numbers --- .../classlib/java/text/TDecimalFormat.java | 27 ++++++++------- .../classlib/java/text/DecimalFormatTest.java | 34 ++++++++++++++++++- 2 files changed, 47 insertions(+), 14 deletions(-) diff --git a/teavm-classlib/src/main/java/org/teavm/classlib/java/text/TDecimalFormat.java b/teavm-classlib/src/main/java/org/teavm/classlib/java/text/TDecimalFormat.java index a8fb16a28..2909a2dd5 100644 --- a/teavm-classlib/src/main/java/org/teavm/classlib/java/text/TDecimalFormat.java +++ b/teavm-classlib/src/main/java/org/teavm/classlib/java/text/TDecimalFormat.java @@ -241,8 +241,8 @@ public class TDecimalFormat extends TNumberFormat { buffer.append(positive ? positivePrefix : negativePrefix); // Add insignificant integer zeros - int digitPos = exponent; int intLength = Math.max(0, exponent); + int digitPos = Math.max(intLength, getMinimumIntegerDigits()) - 1; for (int i = getMinimumIntegerDigits() - 1; i >= intLength; --i) { buffer.append('0'); if (groupingSize > 0 && digitPos % groupingSize == 0 && digitPos > 0) { @@ -275,20 +275,24 @@ public class TDecimalFormat extends TNumberFormat { --digitPos; } - if (digitPos == 0 && getMinimumFractionDigits() == 0) { - if (isDecimalSeparatorAlwaysShown()) { + if (mantissa == 0) { + if (getMinimumFractionDigits() == 0) { + if (isDecimalSeparatorAlwaysShown()) { + buffer.append(symbols.getDecimalSeparator()); + } + } else { buffer.append(symbols.getDecimalSeparator()); + for (int i = 0; i < getMinimumFractionDigits(); ++i) { + buffer.append('0'); + } } } else { buffer.append(symbols.getDecimalSeparator()); // Add significant fractional zeros - int fracZeros = Math.min(getMinimumFractionDigits(), Math.max(0, -exponent)); + int fracZeros = Math.min(getMaximumFractionDigits(), Math.max(0, -exponent)); digitPos = 0; for (int i = 0; i < fracZeros; ++i) { - if (groupingSize > 0 && digitPos % groupingSize == 0 && digitPos > 0) { - buffer.append(symbols.getGroupingSeparator()); - } ++digitPos; buffer.append('0'); } @@ -299,9 +303,6 @@ public class TDecimalFormat extends TNumberFormat { if (mantissa == 0) { break; } - if (groupingSize > 0 && digitPos % groupingSize == 0 && digitPos > 0) { - buffer.append(symbols.getGroupingSeparator()); - } ++digitPos; long mantissaDigitMask = POW10_ARRAY[mantissaDigit]; buffer.append(Character.forDigit((int)(mantissa / mantissaDigitMask), 10)); @@ -311,9 +312,6 @@ public class TDecimalFormat extends TNumberFormat { // Add insignificant fractional zeros for (int i = digitPos; i < getMinimumFractionDigits(); ++i) { - if (groupingSize > 0 && digitPos % groupingSize == 0 && digitPos > 0) { - buffer.append(symbols.getGroupingSeparator()); - } ++digitPos; buffer.append('0'); } @@ -395,6 +393,9 @@ public class TDecimalFormat extends TNumberFormat { } private long normalize(long value) { + if (value >= MANTISSA_PATTERN * 10) { + value /= 10; + } if (value < MANTISSA_PATTERN / 1_000_0000_0000_0000L) { value *= 1_0000_0000_0000_0000L; } diff --git a/teavm-tests/src/test/java/org/teavm/classlib/java/text/DecimalFormatTest.java b/teavm-tests/src/test/java/org/teavm/classlib/java/text/DecimalFormatTest.java index 7d5bc67e1..768d009d4 100644 --- a/teavm-tests/src/test/java/org/teavm/classlib/java/text/DecimalFormatTest.java +++ b/teavm-tests/src/test/java/org/teavm/classlib/java/text/DecimalFormatTest.java @@ -113,6 +113,15 @@ public class DecimalFormatTest { assertEquals(0, format.getMaximumFractionDigits()); } + @Test + public void formatsIntegerPart() { + DecimalFormat format = createFormat("00"); + assertEquals("02", format.format(2)); + assertEquals("23", format.format(23)); + assertEquals("23", format.format(23.2)); + assertEquals("24", format.format(23.7)); + } + @Test public void formatsNumber() { DecimalFormat format = createFormat("0.0"); @@ -138,7 +147,6 @@ public class DecimalFormatTest { @Test public void formatsFractionalPart() { DecimalFormat format = createFormat("0.0000####"); - assertEquals("0.00001235", format.format(0.0000123456)); assertEquals("0.00012346", format.format(0.000123456)); assertEquals("0.00123456", format.format(0.00123456)); @@ -147,6 +155,12 @@ public class DecimalFormatTest { assertEquals("0.1230", format.format(0.123)); assertEquals("0.1234", format.format(0.1234)); assertEquals("0.12345", format.format(0.12345)); + + format = createFormat("0.##"); + assertEquals("23", format.format(23)); + assertEquals("2.3", format.format(2.3)); + assertEquals("0.23", format.format(0.23)); + assertEquals("0.02", format.format(0.023)); } @Test @@ -202,6 +216,24 @@ public class DecimalFormatTest { assertEquals("-4", format.format(-3.5)); } + @Test + public void formatsWithGroups() { + DecimalFormat format = createFormat("#,###.0"); + assertEquals("23.0", format.format(23)); + assertEquals("2,300.0", format.format(2300)); + assertEquals("2,300,000,000,000,000,000,000.0", format.format(23E20)); + assertEquals("23,000,000,000,000,000,000,000,000.0", format.format(23E24)); + + format = createFormat("000,000,000,000,000,000,000"); + assertEquals("000,000,000,000,000,000,023", format.format(23)); + } + + @Test + public void formatsLargeValues() { + DecimalFormat format = createFormat("0"); + assertEquals("9223372036854775807", format.format(9223372036854775807L)); + } + private DecimalFormat createFormat(String format) { return new DecimalFormat(format, symbols); }