Fix Decimal64.toString() 73/101273/1
authorRobert Varga <robert.varga@pantheon.tech>
Tue, 24 May 2022 12:21:26 +0000 (14:21 +0200)
committerRobert Varga <robert.varga@pantheon.tech>
Tue, 24 May 2022 12:22:13 +0000 (14:22 +0200)
intPart() does not carry the sign when the leading part is zero, hence
we need to adjust for that.

JIRA: YANGTOOLS-1438
Change-Id: I5049650b0997e6543455542d48b3f2dcdd02bc4c
Signed-off-by: Robert Varga <robert.varga@pantheon.tech>
common/yang-common/src/main/java/org/opendaylight/yangtools/yang/common/Decimal64.java
common/yang-common/src/test/java/org/opendaylight/yangtools/yang/common/Decimal64Test.java

index bbf66fd22cc6b54e49653cd14c426a90d7f0692f..d9d1e14b6cbec9fa37afbc7fafddfec8a1b39c8d 100644 (file)
@@ -447,11 +447,18 @@ public class Decimal64 extends Number implements CanonicalValue<Decimal64> {
         // prohibited, subject to the rule that there MUST be at least one digit
         // before and after the decimal point.  The value zero is represented as
         // "0.0".
-        final StringBuilder sb = new StringBuilder(21).append(intPart()).append('.');
+
+        final long intPart = intPart();
         final long fracPart = fracPart();
+        final StringBuilder sb = new StringBuilder(21);
+        if (intPart == 0 && fracPart < 0) {
+            sb.append('-');
+        }
+        sb.append(intPart).append('.');
+
         if (fracPart != 0) {
             // We may need to zero-pad the fraction part
-            sb.append(Strings.padStart(Long.toString(fracPart), scale(), '0'));
+            sb.append(Strings.padStart(Long.toString(Math.abs(fracPart)), scale(), '0'));
         } else {
             sb.append('0');
         }
@@ -501,7 +508,7 @@ public class Decimal64 extends Number implements CanonicalValue<Decimal64> {
     }
 
     private long fracPart() {
-        return Math.abs(value % FACTOR[offset]);
+        return value % FACTOR[offset];
     }
 
     private static byte offsetOf(final int scale) {
index c0440f0de880fcdfac611521af9267755f14f937..9aae74a276e6144ce5907c3c91d8e1e825979caf 100644 (file)
@@ -223,6 +223,11 @@ public class Decimal64Test {
         assertEquals("-1.0", Decimal64.valueOf(BigDecimal.ONE.negate()).toString());
     }
 
+    @Test
+    public void testLeadingZeroToString() {
+        assertEquals("-0.63", Decimal64.valueOf("-0.63").toString());
+    }
+
     @Test
     public void testBoundaries() {
         assertEquals(-128L, Decimal64.valueOf(1, Byte.MIN_VALUE).longValue());