OSDN Git Service

Fix locale handling of linear layout weights
authorTor Norbye <tnorbye@google.com>
Fri, 8 Jul 2011 00:32:46 +0000 (17:32 -0700)
committerTor Norbye <tnorbye@google.com>
Fri, 8 Jul 2011 00:32:46 +0000 (17:32 -0700)
Fix 18298: ADT r12 layout editor uses locale specific decimal
    separator leading to unparsable XML

Change-Id: Ideae319e41f8a7e34075065c63247d50cdf830c5

eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/common/layout/LinearLayoutRule.java
eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/common/layout/LinearLayoutRuleTest.java

index 00b8e53..2d08e62 100644 (file)
@@ -56,6 +56,7 @@ import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collections;
 import java.util.List;
+import java.util.Locale;
 import java.util.Map;
 
 /**
@@ -1078,7 +1079,9 @@ public class LinearLayoutRule extends BaseLayoutRule {
     @VisibleForTesting
     static String formatFloatAttribute(float value) {
         if (value != (int) value) {
-            return String.format("%.2f", value); //$NON-NLS-1$
+            // Run String.format without a locale, because we don't want locale-specific
+            // conversions here like separating the decimal part with a comma instead of a dot!
+            return String.format((Locale) null, "%.2f", value); //$NON-NLS-1$
         } else {
             return Integer.toString((int) value);
         }
index eb2158e..ab1d1c6 100644 (file)
@@ -30,11 +30,12 @@ import com.android.ide.common.api.IMenuCallback;
 import com.android.ide.common.api.INode;
 import com.android.ide.common.api.IViewRule;
 import com.android.ide.common.api.MenuAction;
+import com.android.ide.common.api.MenuAction.Choices;
 import com.android.ide.common.api.Point;
 import com.android.ide.common.api.Rect;
-import com.android.ide.common.api.MenuAction.Choices;
 
 import java.util.List;
+import java.util.Locale;
 import java.util.Map;
 
 /** Test the {@link LinearLayoutRule} */
@@ -380,6 +381,24 @@ public class LinearLayoutRuleTest extends LayoutTestBase {
         assertEquals("-1", LinearLayoutRule.formatFloatAttribute(-1f));
     }
 
+    public void testFormatFloatValueLocale() throws Exception {
+        // Ensure that the layout float values aren't affected by
+        // locale settings, like using commas instead of of periods
+        Locale originalDefaultLocale = Locale.getDefault();
+
+        try {
+            Locale.setDefault(Locale.FRENCH);
+
+            // Ensure that this is a locale which uses a comma instead of a period:
+            assertEquals("5,24", String.format("%.2f", 5.236f));
+
+            // Ensure that the formatFloatAttribute is immune
+            assertEquals("1.50", LinearLayoutRule.formatFloatAttribute(1.5f));
+        } finally {
+            Locale.setDefault(originalDefaultLocale);
+        }
+    }
+
     // Left to test:
     // Check inserting at last pos with multiple children
     // Check inserting with no bounds rectangle for dragged element