Index: trunk/src/com/drew/metadata/Directory.java
===================================================================
--- trunk/src/com/drew/metadata/Directory.java	(revision 13061)
+++ trunk/src/com/drew/metadata/Directory.java	(revision 15217)
@@ -1,4 +1,4 @@
 /*
- * Copyright 2002-2017 Drew Noakes
+ * Copyright 2002-2019 Drew Noakes and contributors
  *
  *    Licensed under the Apache License, Version 2.0 (the "License");
@@ -757,4 +757,6 @@
         if (o == null)
             return null;
+        if (o instanceof Number)
+            return ((Number)o).longValue();
         if (o instanceof String || o instanceof StringValue) {
             try {
@@ -763,7 +765,21 @@
                 return null;
             }
-        }
-        if (o instanceof Number)
-            return ((Number)o).longValue();
+        } else if (o instanceof Rational[]) {
+            Rational[] rationals = (Rational[])o;
+            if (rationals.length == 1)
+                return rationals[0].longValue();
+        } else if (o instanceof byte[]) {
+            byte[] bytes = (byte[])o;
+            if (bytes.length == 1)
+                return (long)bytes[0];
+        } else if (o instanceof int[]) {
+            int[] ints = (int[])o;
+            if (ints.length == 1)
+                return (long)ints[0];
+        } else if (o instanceof short[]) {
+            short[] shorts = (short[])o;
+            if (shorts.length == 1)
+                return (long)shorts[0];
+        }
         return null;
     }
@@ -1009,14 +1025,18 @@
                 }
             } else if (componentType.getName().equals("float")) {
+                DecimalFormat format = new DecimalFormat(_floatFormatPattern);
                 for (int i = 0; i < arrayLength; i++) {
                     if (i != 0)
                         string.append(' ');
-                    string.append(new DecimalFormat(_floatFormatPattern).format(Array.getFloat(o, i)));
+                    String s = format.format(Array.getFloat(o, i));
+                    string.append(s.equals("-0") ? "0" : s);
                 }
             } else if (componentType.getName().equals("double")) {
+                DecimalFormat format = new DecimalFormat(_floatFormatPattern);
                 for (int i = 0; i < arrayLength; i++) {
                     if (i != 0)
                         string.append(' ');
-                    string.append(new DecimalFormat(_floatFormatPattern).format(Array.getDouble(o, i)));
+                    String s = format.format(Array.getDouble(o, i));
+                    string.append(s.equals("-0") ? "0" : s);
                 }
             } else if (componentType.getName().equals("byte")) {
