Fix parsing decimal zero values. Fixes #6444
authorMarek Safar <marek.safar@gmail.com>
Wed, 8 Aug 2012 10:14:47 +0000 (11:14 +0100)
committerMarek Safar <marek.safar@gmail.com>
Wed, 8 Aug 2012 10:26:01 +0000 (11:26 +0100)
mcs/class/corlib/Test/System/DecimalTest.cs
mono/metadata/decimal.c

index 87ddc5ec68d71703d133175d803d720904f576eb..b70be0c4239cca85d68dd33dc72a414aaa592317 100644 (file)
@@ -1532,5 +1532,24 @@ namespace MonoTests.System
 
                        Assert.Fail ("Expected FormatException");
                }
+
+               [Test]
+               [SetCulture("en-US")]
+               public void ParseZeros ()
+               {
+                       var d = Decimal.Parse ("0.000");
+                       var bits = Decimal.GetBits (d);
+                       Assert.AreEqual (0, bits[0], "#1");
+                       Assert.AreEqual (0, bits[1], "#2");
+                       Assert.AreEqual (0, bits[2], "#3");
+                       Assert.AreEqual (196608, bits[3], "#4");
+                       Assert.AreEqual ("0.000", d.ToString (), "#5");
+
+                       d = Decimal.Parse("0.000000000000000000000000000000000000000000000000000000000000000000");
+                       Assert.AreEqual ("0.0000000000000000000000000000", d.ToString (), "#10");
+
+                       d = Decimal.Parse ("0.");
+                       Assert.AreEqual ("0", d.ToString (), "#11");
+               }
        }
 }
index 984279f70dd8f999a0d06339696e3332fce5dc55..c8f22887d96161e27408163af3d003991892aef6 100644 (file)
@@ -1079,6 +1079,10 @@ gint32 mono_string2decimal(/*[Out]*/decimal_repr* pA, MonoString* str, gint32 de
         }
     }
 
+    // Set correct scale for zeros decimal (000 input is 0.00)
+    if (sigLen < 0 && len > decrDecimal)
+        sigLen = len;
+
     scale = sigLen - decrDecimal;
 
     if (i < len) { /* too much digits, we must round */
@@ -1104,8 +1108,7 @@ gint32 mono_string2decimal(/*[Out]*/decimal_repr* pA, MonoString* str, gint32 de
         if (rc != DECIMAL_SUCCESS) return rc;
     }
 
-    if (alo == 0 && ahi == 0) {
-        DECINIT(pA);
+    if (alo == 0 && ahi == 0 && scale <= 0) {
         return DECIMAL_SUCCESS;
     } else {
         return pack128toDecimal(pA, alo, ahi, sigLen - decrDecimal, sign);