Fix Formatter.format("%,d") for locales without grouping
Fix Formatter.format("%,d") for locales without grouping
in their defaul decimal format.
Bug: 33245708
Test: vogar luni/src/test/java/libcore/java/util/FormatterTest.java
(cherry picked from commit 26d1f75ec1f3749e3def869fecb11a7dc0d3a31d)
Change-Id: I4164ae51d5abf12dd5031d714bfdcde1b21911a1
diff --git a/luni/src/test/java/libcore/java/util/FormatterTest.java b/luni/src/test/java/libcore/java/util/FormatterTest.java
index e87fee5..aed9ca0 100644
--- a/luni/src/test/java/libcore/java/util/FormatterTest.java
+++ b/luni/src/test/java/libcore/java/util/FormatterTest.java
@@ -17,7 +17,11 @@
package libcore.java.util;
import java.math.BigDecimal;
+import java.text.DecimalFormat;
+import java.text.DecimalFormatSymbols;
+import java.text.NumberFormat;
import java.util.Calendar;
+import java.util.Formatter;
import java.util.GregorianCalendar;
import java.util.Locale;
import java.util.TimeZone;
@@ -183,4 +187,24 @@
assertEquals(expected, String.format(Locale.US, "%t" + pattern, c));
assertEquals(expected, String.format(Locale.US, "%T" + pattern, c));
}
+
+ // http://b/33245708: Some locales have a group separator != '\0' but a default decimal format
+ // pattern without grouping (e.g. a group size of zero). This would throw divide by zero when
+ // working out where to place the separator.
+ public void testGroupingSizeZero() {
+ Locale localeWithoutGrouping = new Locale("hy");
+ DecimalFormat decimalFormat =
+ (DecimalFormat) NumberFormat.getInstance(localeWithoutGrouping);
+
+ // Confirm the locale is still a good example: it has a group separator, but no grouping in
+ // the default decimal format.
+ assertEquals(0, decimalFormat.getGroupingSize());
+ assertFalse(decimalFormat.isGroupingUsed());
+ DecimalFormatSymbols symbols = decimalFormat.getDecimalFormatSymbols();
+ assertTrue(symbols.getGroupingSeparator() != '\0');
+
+ Formatter formatter = new Formatter(localeWithoutGrouping);
+ formatter.format("%,d", 123456789);
+ // No exception expected
+ }
}
diff --git a/ojluni/src/main/java/java/util/Formatter.java b/ojluni/src/main/java/java/util/Formatter.java
index 9a4e234..c656e9c 100755
--- a/ojluni/src/main/java/java/util/Formatter.java
+++ b/ojluni/src/main/java/java/util/Formatter.java
@@ -4193,6 +4193,14 @@
grpSep = dfs.getGroupingSeparator();
DecimalFormat df = (DecimalFormat) NumberFormat.getIntegerInstance(l);
grpSize = df.getGroupingSize();
+ // Android-changed: http://b/33245708 : Some locales have a group separator but
+ // also patterns without groups. If we do not clear the group separator in these
+ // cases a divide by zero is thrown when determining where to place the
+ // separators.
+ if (!df.isGroupingUsed() || df.getGroupingSize() == 0) {
+ grpSep = '\0';
+ }
+ // Android-changed: end http://b/33245708.
}
}