diff --git a/src/OpenFOAM/db/IOstreams/Sstreams/ISstream.C b/src/OpenFOAM/db/IOstreams/Sstreams/ISstream.C
index c93aad5a36f956d6075d1b89e4329cd601ba5a93..3c7d266520ac79142bc877eac24e4ff61d85e196 100644
--- a/src/OpenFOAM/db/IOstreams/Sstreams/ISstream.C
+++ b/src/OpenFOAM/db/IOstreams/Sstreams/ISstream.C
@@ -2,7 +2,7 @@
   =========                 |
   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
    \\    /   O peration     |
-    \\  /    A nd           | Copyright (C) 2011-2012 OpenFOAM Foundation
+    \\  /    A nd           | Copyright (C) 2011-2013 OpenFOAM Foundation
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
 License
@@ -296,7 +296,7 @@ Foam::Istream& Foam::ISstream::read(token& t)
             buf[nChar++] = c;
 
             // get everything that could resemble a number and let
-            // strtod() determine the validity
+            // readScalar determine the validity
             while
             (
                 is_.get(c)
@@ -348,24 +348,25 @@ Foam::Istream& Foam::ISstream::read(token& t)
                 }
                 else
                 {
-                    char *endptr = NULL;
-
                     if (asLabel)
                     {
-                        long longVal(strtol(buf, &endptr, 10));
-                        t = label(longVal);
-
-                        // return as a scalar if doesn't fit in a label
-                        if (*endptr || t.labelToken() != longVal)
+                        label labelVal;
+                        if (readLabel(buf, labelVal))
                         {
-                            t = scalar(strtod(buf, &endptr));
+                            t = labelVal;
                         }
-                    }
-                    else
-                    {
-                        scalar scalarVal(strtod(buf, &endptr));
-                        t = scalarVal;
-
+                        else
+                        {
+                            // Maybe too big? Try as scalar
+                            scalar scalarVal;
+                            if (readScalar(buf, scalarVal))
+                            {
+                                t = scalarVal;
+                            }
+                            else
+                            {
+                                t.setBad();
+                            }
 // ---------------------------------------
 // this would also be possible if desired:
 // ---------------------------------------
@@ -380,12 +381,20 @@ Foam::Istream& Foam::ISstream::read(token& t)
 //                                t = labelVal;
 //                            }
 //                        }
-                    }
 
-                    // not everything converted: bad format or trailing junk
-                    if (*endptr)
+                        }
+                    }
+                    else
                     {
-                        t.setBad();
+                        scalar scalarVal;
+                        if (readScalar(buf, scalarVal))
+                        {
+                            t = scalarVal;
+                        }
+                        else
+                        {
+                            t.setBad();
+                        }
                     }
                 }
             }