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.
                 }
             }