diff --git a/Makefile.in b/Makefile.in
index 3fbafc7..f14180f 100644
--- a/Makefile.in
+++ b/Makefile.in
@@ -1365,9 +1365,9 @@
 	magick/splay-tree.h magick/static.c magick/static.h \
 	magick/statistic.c magick/statistic.h magick/stream.c \
 	magick/stream.h magick/stream-private.h magick/string.c \
-	magick/string_.h magick/studio.h magick/thread.c \
-	magick/thread_.h magick/thread-private.h magick/timer.c \
-	magick/timer.h magick/token.c magick/token.h \
+	magick/string_.h magick/string-private.h magick/studio.h \
+	magick/thread.c magick/thread_.h magick/thread-private.h \
+	magick/timer.c magick/timer.h magick/token.c magick/token.h \
 	magick/token-private.h magick/transform.c magick/transform.h \
 	magick/threshold.c magick/threshold.h magick/type.c \
 	magick/type.h magick/utility.c magick/utility.h \
@@ -3859,6 +3859,7 @@
 	magick/stream-private.h \
 	magick/string.c \
 	magick/string_.h \
+	magick/string-private.h \
 	magick/studio.h \
 	magick/thread.c \
 	magick/thread_.h \
@@ -4013,6 +4014,7 @@
 	magick/signature-private.h \
 	magick/static.h \
 	magick/stream-private.h \
+	magick/string-private.h \
 	magick/studio.h \
 	magick/thread_.h \
 	magick/thread-private.h \
diff --git a/coders/cin.c b/coders/cin.c
index db65623..5594393 100644
--- a/coders/cin.c
+++ b/coders/cin.c
@@ -67,6 +67,7 @@
 #include "magick/quantum-private.h"
 #include "magick/static.h"
 #include "magick/string_.h"
+#include "magick/string-private.h"
 #include "magick/module.h"
 
 /*
@@ -1023,12 +1024,12 @@
   cin.origination.x_offset=0UL;
   value=GetCINProperty(image_info,image,"cin:origination.x_offset");
   if (value != (const char *) NULL)
-    cin.origination.x_offset=atol(value);
+    cin.origination.x_offset=StringToLong(value);
   offset+=WriteBlobLong(image,(unsigned long) cin.origination.x_offset);
   cin.origination.y_offset=0UL;
   value=GetCINProperty(image_info,image,"cin:origination.y_offset");
   if (value != (const char *) NULL)
-    cin.origination.y_offset=atol(value);
+    cin.origination.y_offset=StringToLong(value);
   offset+=WriteBlobLong(image,(unsigned long) cin.origination.y_offset);
   value=GetCINProperty(image_info,image,"cin:origination.filename");
   if (value != (const char *) NULL)
@@ -1069,12 +1070,12 @@
   cin.origination.x_pitch=0.0f;
   value=GetCINProperty(image_info,image,"cin:origination.x_pitch");
   if (value != (const char *) NULL)
-    cin.origination.x_pitch=atof(value);
+    cin.origination.x_pitch=StringToDouble(value);
   offset+=WriteBlobFloat(image,cin.origination.x_pitch);
   cin.origination.y_pitch=0.0f;
   value=GetCINProperty(image_info,image,"cin:origination.y_pitch");
   if (value != (const char *) NULL)
-    cin.origination.y_pitch=atof(value);
+    cin.origination.y_pitch=StringToDouble(value);
   offset+=WriteBlobFloat(image,cin.origination.y_pitch);
   cin.origination.gamma=image->gamma;
   offset+=WriteBlobFloat(image,cin.origination.gamma);
@@ -1086,28 +1087,28 @@
   cin.film.id=0;
   value=GetCINProperty(image_info,image,"cin:film.id");
   if (value != (const char *) NULL)
-    cin.film.id=(char) atoi(value);
+    cin.film.id=(char) StringToLong(value);
   offset+=WriteBlobByte(image,(unsigned char) cin.film.id);
   cin.film.type=0;
   value=GetCINProperty(image_info,image,"cin:film.type");
   if (value != (const char *) NULL)
-    cin.film.type=(char) atoi(value);
+    cin.film.type=(char) StringToLong(value);
   offset+=WriteBlobByte(image,(unsigned char) cin.film.type);
   cin.film.offset=0;
   value=GetCINProperty(image_info,image,"cin:film.offset");
   if (value != (const char *) NULL)
-    cin.film.offset=(char) atoi(value);
+    cin.film.offset=(char) StringToLong(value);
   offset+=WriteBlobByte(image,(unsigned char) cin.film.offset);
   offset+=WriteBlobByte(image,(unsigned char) cin.film.reserve1);
   cin.film.prefix=0UL;
   value=GetCINProperty(image_info,image,"cin:film.prefix");
   if (value != (const char *) NULL)
-    cin.film.prefix=(unsigned long) atol(value);
+    cin.film.prefix=(unsigned long) StringToLong(value);
   offset+=WriteBlobLong(image,cin.film.prefix);
   cin.film.count=0UL;
   value=GetCINProperty(image_info,image,"cin:film.count");
   if (value != (const char *) NULL)
-    cin.film.count=(unsigned long) atol(value);
+    cin.film.count=(unsigned long) StringToLong(value);
   offset+=WriteBlobLong(image,cin.film.count);
   value=GetCINProperty(image_info,image,"cin:film.format");
   if (value != (const char *) NULL)
@@ -1117,12 +1118,12 @@
   cin.film.frame_position=0UL;
   value=GetCINProperty(image_info,image,"cin:film.frame_position");
   if (value != (const char *) NULL)
-    cin.film.frame_position=(unsigned long) atol(value);
+    cin.film.frame_position=(unsigned long) StringToLong(value);
   offset+=WriteBlobLong(image,cin.film.frame_position);
   cin.film.frame_rate=0.0f;
   value=GetCINProperty(image_info,image,"cin:film.frame_rate");
   if (value != (const char *) NULL)
-    cin.film.frame_rate=atof(value);
+    cin.film.frame_rate=StringToDouble(value);
   offset+=WriteBlobFloat(image,cin.film.frame_rate);
   value=GetCINProperty(image_info,image,"cin:film.frame_id");
   if (value != (const char *) NULL)
diff --git a/coders/dcm.c b/coders/dcm.c
index 9d96d97..392666c 100644
--- a/coders/dcm.c
+++ b/coders/dcm.c
@@ -63,6 +63,7 @@
 #include "magick/quantum-private.h"
 #include "magick/static.h"
 #include "magick/string_.h"
+#include "magick/string-private.h"
 #include "magick/module.h"
 
 /*
@@ -3173,7 +3174,7 @@
             /*
               Number of frames.
             */
-            number_scenes=(unsigned long) atol((char *) data);
+            number_scenes=(unsigned long) StringToLong((char *) data);
             break;
           }
           case 0x0010:
@@ -3243,7 +3244,7 @@
             /*
               Visible pixel range: center.
             */
-            window_center=atol((char *) data);
+            window_center=StringToLong((char *) data);
             break;
           }
           case 0x1051:
@@ -3251,7 +3252,7 @@
             /*
               Visible pixel range: width.
             */
-            window_width=(unsigned long) atol((char *) data);
+            window_width=(unsigned long) StringToLong((char *) data);
             break;
           }
           case 0x1200:
diff --git a/coders/dpx.c b/coders/dpx.c
index bf88332..43b283a 100644
--- a/coders/dpx.c
+++ b/coders/dpx.c
@@ -52,6 +52,7 @@
 #include "magick/list.h"
 #include "magick/magick.h"
 #include "magick/memory_.h"
+#include "magick/module.h"
 #include "magick/monitor.h"
 #include "magick/monitor-private.h"
 #include "magick/option.h"
@@ -60,8 +61,7 @@
 #include "magick/quantum-private.h"
 #include "magick/static.h"
 #include "magick/string_.h"
-#include "magick/module.h"
-#include "magick/module.h"
+#include "magick/string-private.h"
 
 /*
   Typedef declaration.
@@ -1612,32 +1612,32 @@
   dpx.orientation.x_offset=0U;
   value=GetDPXProperty(image_info,image,"dpx:orientation.x_offset");
   if (value != (const char *) NULL)
-    dpx.orientation.x_offset=(unsigned int) atoi(value);
+    dpx.orientation.x_offset=(unsigned int) StringToLong(value);
   offset+=WriteBlobLong(image,dpx.orientation.x_offset);
   dpx.orientation.y_offset=0U;
   value=GetDPXProperty(image_info,image,"dpx:orientation.y_offset");
   if (value != (const char *) NULL)
-    dpx.orientation.y_offset=(unsigned int) atoi(value);
+    dpx.orientation.y_offset=(unsigned int) StringToLong(value);
   offset+=WriteBlobLong(image,dpx.orientation.y_offset);
   dpx.orientation.x_center=0.0f;
   value=GetDPXProperty(image_info,image,"dpx:orientation.x_center");
   if (value != (const char *) NULL)
-    dpx.orientation.x_center=atof(value);
+    dpx.orientation.x_center=StringToDouble(value);
   offset+=WriteBlobFloat(image,dpx.orientation.x_center);
   dpx.orientation.y_center=0.0f;
   value=GetDPXProperty(image_info,image,"dpx:orientation.y_center");
   if (value != (const char *) NULL)
-    dpx.orientation.y_center=atof(value);
+    dpx.orientation.y_center=StringToDouble(value);
   offset+=WriteBlobFloat(image,dpx.orientation.y_center);
   dpx.orientation.x_size=0U;
   value=GetDPXProperty(image_info,image,"dpx:orientation.x_size");
   if (value != (const char *) NULL)
-    dpx.orientation.x_size=(unsigned int) atoi(value);
+    dpx.orientation.x_size=(unsigned int) StringToLong(value);
   offset+=WriteBlobLong(image,dpx.orientation.x_size);
   dpx.orientation.y_size=0U;
   value=GetDPXProperty(image_info,image,"dpx:orientation.y_size");
   if (value != (const char *) NULL)
-    dpx.orientation.y_size=(unsigned int) atoi(value);
+    dpx.orientation.y_size=(unsigned int) StringToLong(value);
   offset+=WriteBlobLong(image,dpx.orientation.y_size);
   value=GetDPXProperty(image_info,image,"dpx:orientation.filename");
   if (value != (const char *) NULL)
@@ -1726,27 +1726,27 @@
   dpx.film.frame_position=0U;
   value=GetDPXProperty(image_info,image,"dpx:film.frame_position");
   if (value != (const char *) NULL)
-    dpx.film.frame_position=(unsigned int) atoi(value);
+    dpx.film.frame_position=(unsigned int) StringToLong(value);
   offset+=WriteBlobLong(image,dpx.film.frame_position);
   dpx.film.sequence_extent=0U;
   value=GetDPXProperty(image_info,image,"dpx:film.sequence_extent");
   if (value != (const char *) NULL)
-    dpx.film.sequence_extent=(unsigned int) atoi(value);
+    dpx.film.sequence_extent=(unsigned int) StringToLong(value);
   offset+=WriteBlobLong(image,dpx.film.sequence_extent);
   dpx.film.held_count=0U;
   value=GetDPXProperty(image_info,image,"dpx:film.held_count");
   if (value != (const char *) NULL)
-    dpx.film.held_count=(unsigned int) atoi(value);
+    dpx.film.held_count=(unsigned int) StringToLong(value);
   offset+=WriteBlobLong(image,dpx.film.held_count);
   dpx.film.frame_rate=0.0f;
   value=GetDPXProperty(image_info,image,"dpx:film.frame_rate");
   if (value != (const char *) NULL)
-    dpx.film.frame_rate=atof(value);
+    dpx.film.frame_rate=StringToDouble(value);
   offset+=WriteBlobFloat(image,dpx.film.frame_rate);
   dpx.film.shutter_angle=0.0f;
   value=GetDPXProperty(image_info,image,"dpx:film.shutter_angle");
   if (value != (const char *) NULL)
-    dpx.film.shutter_angle=atof(value);
+    dpx.film.shutter_angle=StringToDouble(value);
   offset+=WriteBlobFloat(image,dpx.film.shutter_angle);
   *dpx.film.frame_id='\0';
   value=GetDPXProperty(image_info,image,"dpx:film.frame_id");
@@ -1774,72 +1774,72 @@
   offset+=WriteBlobLong(image,dpx.television.user_bits);
   value=GetDPXProperty(image_info,image,"dpx:television.interlace");
   if (value != (const char *) NULL)
-    dpx.television.interlace=(unsigned char) atoi(value);
+    dpx.television.interlace=(unsigned char) StringToLong(value);
   offset+=WriteBlobByte(image,dpx.television.interlace);
   value=GetDPXProperty(image_info,image,"dpx:television.field_number");
   if (value != (const char *) NULL)
-    dpx.television.field_number=(unsigned char) atoi(value);
+    dpx.television.field_number=(unsigned char) StringToLong(value);
   offset+=WriteBlobByte(image,dpx.television.field_number);
   dpx.television.video_signal=0;
   value=GetDPXProperty(image_info,image,"dpx:television.video_signal");
   if (value != (const char *) NULL)
-    dpx.television.video_signal=(unsigned char) atoi(value);
+    dpx.television.video_signal=(unsigned char) StringToLong(value);
   offset+=WriteBlobByte(image,dpx.television.video_signal);
   dpx.television.padding=0;
   value=GetDPXProperty(image_info,image,"dpx:television.padding");
   if (value != (const char *) NULL)
-    dpx.television.padding=(unsigned char) atoi(value);
+    dpx.television.padding=(unsigned char) StringToLong(value);
   offset+=WriteBlobByte(image,dpx.television.padding);
   dpx.television.horizontal_sample_rate=0.0f;
   value=GetDPXProperty(image_info,image,
     "dpx:television.horizontal_sample_rate");
   if (value != (const char *) NULL)
-    dpx.television.horizontal_sample_rate=atof(value);
+    dpx.television.horizontal_sample_rate=StringToDouble(value);
   offset+=WriteBlobFloat(image,dpx.television.horizontal_sample_rate);
   dpx.television.vertical_sample_rate=0.0f;
   value=GetDPXProperty(image_info,image,"dpx:television.vertical_sample_rate");
   if (value != (const char *) NULL)
-    dpx.television.vertical_sample_rate=atof(value);
+    dpx.television.vertical_sample_rate=StringToDouble(value);
   offset+=WriteBlobFloat(image,dpx.television.vertical_sample_rate);
   dpx.television.frame_rate=0.0f;
   value=GetDPXProperty(image_info,image,"dpx:television.frame_rate");
   if (value != (const char *) NULL)
-    dpx.television.frame_rate=atof(value);
+    dpx.television.frame_rate=StringToDouble(value);
   offset+=WriteBlobFloat(image,dpx.television.frame_rate);
   dpx.television.time_offset=0.0f;
   value=GetDPXProperty(image_info,image,"dpx:television.time_offset");
   if (value != (const char *) NULL)
-    dpx.television.time_offset=atof(value);
+    dpx.television.time_offset=StringToDouble(value);
   offset+=WriteBlobFloat(image,dpx.television.time_offset);
   dpx.television.gamma=0.0f;
   value=GetDPXProperty(image_info,image,"dpx:television.gamma");
   if (value != (const char *) NULL)
-    dpx.television.gamma=atof(value);
+    dpx.television.gamma=StringToDouble(value);
   offset+=WriteBlobFloat(image,dpx.television.gamma);
   dpx.television.black_level=0.0f;
   value=GetDPXProperty(image_info,image,"dpx:television.black_level");
   if (value != (const char *) NULL)
-    dpx.television.black_level=atof(value);
+    dpx.television.black_level=StringToDouble(value);
   offset+=WriteBlobFloat(image,dpx.television.black_level);
   dpx.television.black_gain=0.0f;
   value=GetDPXProperty(image_info,image,"dpx:television.black_gain");
   if (value != (const char *) NULL)
-    dpx.television.black_gain=atof(value);
+    dpx.television.black_gain=StringToDouble(value);
   offset+=WriteBlobFloat(image,dpx.television.black_gain);
   dpx.television.break_point=0.0f;
   value=GetDPXProperty(image_info,image,"dpx:television.break_point");
   if (value != (const char *) NULL)
-    dpx.television.break_point=atof(value);
+    dpx.television.break_point=StringToDouble(value);
   offset+=WriteBlobFloat(image,dpx.television.break_point);
   dpx.television.white_level=0.0f;
   value=GetDPXProperty(image_info,image,"dpx:television.white_level");
   if (value != (const char *) NULL)
-    dpx.television.white_level=atof(value);
+    dpx.television.white_level=StringToDouble(value);
   offset+=WriteBlobFloat(image,dpx.television.white_level);
   dpx.television.integration_times=0.0f;
   value=GetDPXProperty(image_info,image,"dpx:television.integration_times");
   if (value != (const char *) NULL)
-    dpx.television.integration_times=atof(value);
+    dpx.television.integration_times=StringToDouble(value);
   offset+=WriteBlobFloat(image,dpx.television.integration_times);
   offset+=WriteBlob(image,sizeof(dpx.television.reserve),(unsigned char *)
     dpx.television.reserve);
diff --git a/coders/fits.c b/coders/fits.c
index f0fcd7c..6f32bfa 100644
--- a/coders/fits.c
+++ b/coders/fits.c
@@ -54,6 +54,7 @@
 #include "magick/list.h"
 #include "magick/magick.h"
 #include "magick/memory_.h"
+#include "magick/module.h"
 #include "magick/monitor.h"
 #include "magick/monitor-private.h"
 #include "magick/pixel-private.h"
@@ -62,7 +63,7 @@
 #include "magick/static.h"
 #include "magick/statistic.h"
 #include "magick/string_.h"
-#include "magick/module.h"
+#include "magick/string-private.h"
 #include "magick/module.h"
 
 /*
@@ -349,23 +350,23 @@
       if (LocaleCompare(keyword,"simple") == 0)
         fits_info.simple=(*p == 'T') || (*p == 't') ? MagickTrue : MagickFalse;
       if (LocaleCompare(keyword,"bitpix") == 0)
-        fits_info.bits_per_pixel=atoi(p);
+        fits_info.bits_per_pixel=StringToLong(p);
       if (LocaleCompare(keyword,"naxis") == 0)
-        fits_info.number_axes=atoi(p);
+        fits_info.number_axes=StringToLong(p);
       if (LocaleCompare(keyword,"naxis1") == 0)
-        fits_info.columns=atoi(p);
+        fits_info.columns=StringToLong(p);
       if (LocaleCompare(keyword,"naxis2") == 0)
-        fits_info.rows=atoi(p);
+        fits_info.rows=StringToLong(p);
       if (LocaleCompare(keyword,"naxis3") == 0)
-        fits_info.number_planes=atoi(p);
+        fits_info.number_planes=StringToLong(p);
       if (LocaleCompare(keyword,"datamax") == 0)
-        fits_info.max_data=atof(p);
+        fits_info.max_data=StringToDouble(p);
       if (LocaleCompare(keyword,"datamin") == 0)
-        fits_info.min_data=atof(p);
+        fits_info.min_data=StringToDouble(p);
       if (LocaleCompare(keyword,"bzero") == 0)
-        fits_info.zero=atof(p);
+        fits_info.zero=StringToDouble(p);
       if (LocaleCompare(keyword,"bscale") == 0)
-        fits_info.scale=atof(p);
+        fits_info.scale=StringToDouble(p);
       if (LocaleCompare(keyword,"comment") == 0)
         {
           if (comment == (char *) NULL)
diff --git a/coders/hald.c b/coders/hald.c
index d61c06a..921f48f 100644
--- a/coders/hald.c
+++ b/coders/hald.c
@@ -51,12 +51,13 @@
 #include "magick/list.h"
 #include "magick/magick.h"
 #include "magick/memory_.h"
+#include "magick/module.h"
 #include "magick/monitor.h"
 #include "magick/monitor-private.h"
 #include "magick/quantum-private.h"
 #include "magick/static.h"
 #include "magick/string_.h"
-#include "magick/module.h"
+#include "magick/string-private.h"
 
 /*
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -117,7 +118,7 @@
   image=AcquireImage(image_info);
   level=0;
   if (*image_info->filename != '\0')
-    level=(unsigned long) atol(image_info->filename);
+    level=(unsigned long) StringToLong(image_info->filename);
   if (level < 2)
     level=8;
   status=MagickTrue;
diff --git a/coders/jpeg.c b/coders/jpeg.c
index 1104253..54be7c5 100644
--- a/coders/jpeg.c
+++ b/coders/jpeg.c
@@ -61,6 +61,7 @@
 #include "magick/log.h"
 #include "magick/magick.h"
 #include "magick/memory_.h"
+#include "magick/module.h"
 #include "magick/monitor.h"
 #include "magick/monitor-private.h"
 #include "magick/option.h"
@@ -71,7 +72,7 @@
 #include "magick/splay-tree.h"
 #include "magick/static.h"
 #include "magick/string_.h"
-#include "magick/module.h"
+#include "magick/string-private.h"
 #include "magick/utility.h"
 #include <setjmp.h>
 #if defined(MAGICKCORE_JPEG_DELEGATE)
@@ -1864,7 +1865,7 @@
             Search for compression quality that does not exceed image extent.
           */
           jpeg_info->quality=0;
-          extent=(MagickSizeType) StringToDouble(option,100.0);
+          extent=(MagickSizeType) SiPrefixToDouble(option,100.0);
           (void) DeleteImageOption(jpeg_info,"jpeg:extent");
           (void) AcquireUniqueFilename(jpeg_image->filename);
           min=0;
diff --git a/coders/meta.c b/coders/meta.c
index f876742..5837442 100644
--- a/coders/meta.c
+++ b/coders/meta.c
@@ -49,12 +49,13 @@
 #include "magick/list.h"
 #include "magick/magick.h"
 #include "magick/memory_.h"
+#include "magick/module.h"
 #include "magick/profile.h"
 #include "magick/splay-tree.h"
 #include "magick/quantum-private.h"
 #include "magick/static.h"
 #include "magick/string_.h"
-#include "magick/module.h"
+#include "magick/string-private.h"
 #include "magick/token.h"
 #include "magick/utility.h"
 
@@ -358,10 +359,10 @@
                 if (strcmp(newstr,"8BIM")==0)
                   dataset = 255;
                 else
-                  dataset = (unsigned char) atoi(newstr);
+                  dataset = (unsigned char) StringToLong(newstr);
                 break;
               case 1:
-                recnum = (unsigned int) atoi(newstr);
+                recnum = (unsigned int) StringToLong(newstr);
                 break;
               case 2:
                 name=(char *) AcquireQuantumMemory(strlen(newstr)+MaxTextExtent,
@@ -634,10 +635,10 @@
                 if (strcmp(newstr,"8BIM")==0)
                   dataset = 255;
                 else
-                  dataset = (unsigned char) atoi(newstr);
+                  dataset = (unsigned char) StringToLong(newstr);
                 break;
               case 1:
-                recnum=(unsigned int) atoi(newstr);
+                recnum=(unsigned int) StringToLong(newstr);
                 break;
               case 2:
                 name=(char *) AcquireQuantumMemory(strlen(newstr)+MaxTextExtent,
diff --git a/coders/miff.c b/coders/miff.c
index 523433e..c6ac0c9 100644
--- a/coders/miff.c
+++ b/coders/miff.c
@@ -58,6 +58,7 @@
 #include "magick/list.h"
 #include "magick/magick.h"
 #include "magick/memory_.h"
+#include "magick/module.h"
 #include "magick/monitor.h"
 #include "magick/monitor-private.h"
 #include "magick/option.h"
@@ -68,7 +69,7 @@
 #include "magick/static.h"
 #include "magick/statistic.h"
 #include "magick/string_.h"
-#include "magick/module.h"
+#include "magick/string-private.h"
 #if defined(MAGICKCORE_ZLIB_DELEGATE)
 #include "zlib.h"
 #endif
@@ -623,7 +624,7 @@
                   }
                 if (LocaleCompare(keyword,"colors") == 0)
                   {
-                    colors=(unsigned long) atol(options);
+                    colors=(unsigned long) StringToLong(options);
                     break;
                   }
                 if (LocaleCompare(keyword,"colorspace") == 0)
@@ -652,7 +653,7 @@
                   }
                 if (LocaleCompare(keyword,"columns") == 0)
                   {
-                    image->columns=(unsigned long) atol(options);
+                    image->columns=(unsigned long) StringToLong(options);
                     break;
                   }
                 (void) SetImageProperty(image,keyword,options);
@@ -663,12 +664,12 @@
               {
                 if (LocaleCompare(keyword,"delay") == 0)
                   {
-                    image->delay=(unsigned long) atol(options);
+                    image->delay=(unsigned long) StringToLong(options);
                     break;
                   }
                 if (LocaleCompare(keyword,"depth") == 0)
                   {
-                    image->depth=(unsigned long) atol(options);
+                    image->depth=(unsigned long) StringToLong(options);
                     break;
                   }
                 if (LocaleCompare(keyword,"dispose") == 0)
@@ -709,7 +710,7 @@
               {
                 if (LocaleCompare(keyword,"gamma") == 0)
                   {
-                    image->gamma=atof(options);
+                    image->gamma=StringToDouble(options);
                     break;
                   }
                 if (LocaleCompare(keyword,"gravity") == 0)
@@ -747,7 +748,7 @@
                   }
                 if (LocaleCompare(keyword,"iterations") == 0)
                   {
-                    image->iterations=(unsigned long) atol(options);
+                    image->iterations=(unsigned long) StringToLong(options);
                     break;
                   }
                 (void) SetImageProperty(image,keyword,options);
@@ -835,7 +836,7 @@
                       profiles=NewLinkedList(0);
                     (void) AppendValueToLinkedList(profiles,
                       AcquireString(keyword+8));
-                    profile=AcquireStringInfo((size_t) atol(options));
+                    profile=AcquireStringInfo((size_t) StringToLong(options));
                     (void) SetImageProfile(image,keyword+8,profile);
                     profile=DestroyStringInfo(profile);
                     break;
@@ -848,7 +849,7 @@
               {
                 if (LocaleCompare(keyword,"quality") == 0)
                   {
-                    image->quality=(unsigned long) atol(options);
+                    image->quality=(unsigned long) StringToLong(options);
                     break;
                   }
                 if ((LocaleCompare(keyword,"quantum-format") == 0) ||
@@ -903,7 +904,7 @@
                   }
                 if (LocaleCompare(keyword,"rows") == 0)
                   {
-                    image->rows=(unsigned long) atol(options);
+                    image->rows=(unsigned long) StringToLong(options);
                     break;
                   }
                 (void) SetImageProperty(image,keyword,options);
@@ -914,7 +915,7 @@
               {
                 if (LocaleCompare(keyword,"scene") == 0)
                   {
-                    image->scene=(unsigned long) atol(options);
+                    image->scene=(unsigned long) StringToLong(options);
                     break;
                   }
                 (void) SetImageProperty(image,keyword,options);
@@ -925,7 +926,7 @@
               {
                 if (LocaleCompare(keyword,"ticks-per-second") == 0)
                   {
-                    image->ticks_per_second=atol(options);
+                    image->ticks_per_second=StringToLong(options);
                     break;
                   }
                 if (LocaleCompare(keyword,"tile-offset") == 0)
@@ -976,7 +977,7 @@
               {
                 if (LocaleCompare(keyword,"version") == 0)
                   {
-                    version=atof(options);
+                    version=StringToDouble(options);
                     break;
                   }
                 (void) SetImageProperty(image,keyword,options);
diff --git a/coders/mpc.c b/coders/mpc.c
index a6766b2..ece2d72 100644
--- a/coders/mpc.c
+++ b/coders/mpc.c
@@ -58,6 +58,7 @@
 #include "magick/list.h"
 #include "magick/magick.h"
 #include "magick/memory_.h"
+#include "magick/module.h"
 #include "magick/monitor.h"
 #include "magick/monitor-private.h"
 #include "magick/option.h"
@@ -67,7 +68,7 @@
 #include "magick/static.h"
 #include "magick/statistic.h"
 #include "magick/string_.h"
-#include "magick/module.h"
+#include "magick/string-private.h"
 #include "magick/utility.h"
 
 /*
@@ -366,7 +367,7 @@
                   }
                 if (LocaleCompare(keyword,"colors") == 0)
                   {
-                    image->colors=(unsigned long) atol(options);
+                    image->colors=(unsigned long) StringToLong(options);
                     break;
                   }
                 if (LocaleCompare(keyword,"colorspace") == 0)
@@ -395,7 +396,7 @@
                   }
                 if (LocaleCompare(keyword,"columns") == 0)
                   {
-                    image->columns=(unsigned long) atol(options);
+                    image->columns=(unsigned long) StringToLong(options);
                     break;
                   }
                 (void) SetImageProperty(image,keyword,options);
@@ -406,12 +407,12 @@
               {
                 if (LocaleCompare(keyword,"delay") == 0)
                   {
-                    image->delay=(unsigned long) atol(options);
+                    image->delay=(unsigned long) StringToLong(options);
                     break;
                   }
                 if (LocaleCompare(keyword,"depth") == 0)
                   {
-                    image->depth=(unsigned long) atol(options);
+                    image->depth=(unsigned long) StringToLong(options);
                     break;
                   }
                 if (LocaleCompare(keyword,"dispose") == 0)
@@ -446,7 +447,7 @@
                   }
                 if (LocaleCompare(keyword,"error") == 0)
                   {
-                    image->error.mean_error_per_pixel=atof(options);
+                    image->error.mean_error_per_pixel=StringToDouble(options);
                     break;
                   }
                 (void) SetImageProperty(image,keyword,options);
@@ -457,7 +458,7 @@
               {
                 if (LocaleCompare(keyword,"gamma") == 0)
                   {
-                    image->gamma=atof(options);
+                    image->gamma=StringToDouble(options);
                     break;
                   }
                 if (LocaleCompare(keyword,"green-primary") == 0)
@@ -483,7 +484,7 @@
                   }
                 if (LocaleCompare(keyword,"iterations") == 0)
                   {
-                    image->iterations=(unsigned long) atol(options);
+                    image->iterations=(unsigned long) StringToLong(options);
                     break;
                   }
                 (void) SetImageProperty(image,keyword,options);
@@ -512,12 +513,12 @@
                   }
                 if (LocaleCompare(keyword,"maximum-error") == 0)
                   {
-                    image->error.normalized_maximum_error=atof(options);
+                    image->error.normalized_maximum_error=StringToDouble(options);
                     break;
                   }
                 if (LocaleCompare(keyword,"mean-error") == 0)
                   {
-                    image->error.normalized_mean_error=atof(options);
+                    image->error.normalized_mean_error=StringToDouble(options);
                     break;
                   }
                 if (LocaleCompare(keyword,"montage") == 0)
@@ -578,7 +579,7 @@
                       profiles=NewLinkedList(0);
                     (void) AppendValueToLinkedList(profiles,
                       AcquireString(keyword+8));
-                    profile=AcquireStringInfo((size_t) atol(options));
+                    profile=AcquireStringInfo((size_t) StringToLong(options));
                     (void) SetImageProfile(image,keyword+8,profile);
                     profile=DestroyStringInfo(profile);
                     break;
@@ -591,12 +592,12 @@
               {
                 if (LocaleCompare(keyword,"quality") == 0)
                   {
-                    image->quality=(unsigned long) atol(options);
+                    image->quality=(unsigned long) StringToLong(options);
                     break;
                   }
                 if (LocaleCompare(keyword,"quantum-depth") == 0)
                   {
-                    quantum_depth=(unsigned long) atol(options);
+                    quantum_depth=(unsigned long) StringToLong(options);
                     break;
                   }
                 (void) SetImageProperty(image,keyword,options);
@@ -636,7 +637,7 @@
                   }
                 if (LocaleCompare(keyword,"rows") == 0)
                   {
-                    image->rows=(unsigned long) atol(options);
+                    image->rows=(unsigned long) StringToLong(options);
                     break;
                   }
                 (void) SetImageProperty(image,keyword,options);
@@ -647,7 +648,7 @@
               {
                 if (LocaleCompare(keyword,"scene") == 0)
                   {
-                    image->scene=(unsigned long) atol(options);
+                    image->scene=(unsigned long) StringToLong(options);
                     break;
                   }
                 (void) SetImageProperty(image,keyword,options);
@@ -658,7 +659,7 @@
               {
                 if (LocaleCompare(keyword,"ticks-per-second") == 0)
                   {
-                    image->ticks_per_second=(long) atol(options);
+                    image->ticks_per_second=(long) StringToLong(options);
                     break;
                   }
                 if (LocaleCompare(keyword,"tile-offset") == 0)
diff --git a/coders/msl.c b/coders/msl.c
index d2346db..038867e 100644
--- a/coders/msl.c
+++ b/coders/msl.c
@@ -68,6 +68,7 @@
 #include "magick/log.h"
 #include "magick/magick.h"
 #include "magick/memory_.h"
+#include "magick/module.h"
 #include "magick/option.h"
 #include "magick/paint.h"
 #include "magick/profile.h"
@@ -82,7 +83,7 @@
 #include "magick/signature.h"
 #include "magick/static.h"
 #include "magick/string_.h"
-#include "magick/module.h"
+#include "magick/string-private.h"
 #include "magick/transform.h"
 #include "magick/threshold.h"
 #include "magick/utility.h"
@@ -898,7 +899,7 @@
                 {
                   if (LocaleCompare(keyword,"pointsize") == 0)
                     {
-                      draw_info->pointsize=atof(value);
+                      draw_info->pointsize=StringToDouble(value);
                       break;
                     }
                   ThrowMSLException(OptionError,"UnrecognizedAttribute",
@@ -910,7 +911,7 @@
                 {
                   if (LocaleCompare(keyword,"rotate") == 0)
                     {
-                      angle=atof(value);
+                      angle=StringToDouble(value);
                       affine.sx=cos(DegreesToRadians(fmod(angle,360.0)));
                       affine.rx=sin(DegreesToRadians(fmod(angle,360.0)));
                       affine.ry=(-sin(DegreesToRadians(fmod(angle,360.0))));
@@ -935,14 +936,14 @@
                     }
                   if (LocaleCompare(keyword,"skewX") == 0)
                     {
-                      angle=atof(value);
+                      angle=StringToDouble(value);
                       affine.ry=tan(DegreesToRadians(fmod((double) angle,
                         360.0)));
                       break;
                     }
                   if (LocaleCompare(keyword,"skewY") == 0)
                     {
-                      angle=atof(value);
+                      angle=StringToDouble(value);
                       affine.rx=tan(DegreesToRadians(fmod((double) angle,
                         360.0)));
                       break;
@@ -965,7 +966,7 @@
                     }
                   if (LocaleCompare(keyword,"strokewidth") == 0)
                     {
-                      draw_info->stroke_width=atol(value);
+                      draw_info->stroke_width=StringToLong(value);
                       break;
                     }
                   if (LocaleCompare(keyword,"style") == 0)
@@ -1021,7 +1022,7 @@
                 {
                   if (LocaleCompare(keyword,"weight") == 0)
                     {
-                      draw_info->weight=atol(value);
+                      draw_info->weight=StringToLong(value);
                       break;
                     }
                   ThrowMSLException(OptionError,"UnrecognizedAttribute",
@@ -1033,7 +1034,7 @@
                 {
                   if (LocaleCompare(keyword,"x") == 0)
                     {
-                      geometry.x=atol(value);
+                      geometry.x=StringToLong(value);
                       break;
                     }
                   ThrowMSLException(OptionError,"UnrecognizedAttribute",
@@ -1045,7 +1046,7 @@
                 {
                   if (LocaleCompare(keyword,"y") == 0)
                     {
-                      geometry.y=atol(value);
+                      geometry.y=StringToLong(value);
                       break;
                     }
                   ThrowMSLException(OptionError,"UnrecognizedAttribute",
@@ -1196,7 +1197,7 @@
                 {
                   if (LocaleCompare(keyword,"radius") == 0)
                     {
-                      geometry_info.rho=atof(value);
+                      geometry_info.rho=StringToDouble(value);
                       break;
                     }
                   ThrowMSLException(OptionError,"UnrecognizedAttribute",
@@ -1208,7 +1209,7 @@
                 {
                   if (LocaleCompare(keyword,"sigma") == 0)
                     {
-                      geometry_info.sigma=atol(value);
+                      geometry_info.sigma=StringToLong(value);
                       break;
                     }
                   ThrowMSLException(OptionError,"UnrecognizedAttribute",
@@ -1306,7 +1307,7 @@
                 {
                   if (LocaleCompare(keyword,"height") == 0)
                     {
-                      geometry.height=atol(value);
+                      geometry.height=StringToLong(value);
                       break;
                     }
                   ThrowMSLException(OptionError,"UnrecognizedAttribute",
@@ -1318,7 +1319,7 @@
                 {
                   if (LocaleCompare(keyword,"width") == 0)
                     {
-                      geometry.width=atol(value);
+                      geometry.width=StringToLong(value);
                       break;
                     }
                   ThrowMSLException(OptionError,"UnrecognizedAttribute",
@@ -1446,7 +1447,7 @@
             {
               if (LocaleCompare(keyword, "radius") == 0)
               {
-                radius = atof( value );
+                radius = StringToDouble( value );
                 break;
               }
               ThrowMSLException(OptionError,"UnrecognizedAttribute",keyword);
@@ -1457,7 +1458,7 @@
             {
               if (LocaleCompare(keyword,"sigma") == 0)
               {
-                sigma = atol( value );
+                sigma = StringToLong( value );
                 break;
               }
               ThrowMSLException(OptionError,"UnrecognizedAttribute",keyword);
@@ -1532,7 +1533,7 @@
                 {
                   if (LocaleCompare(keyword,"height") == 0)
                     {
-                      geometry.height=atol(value);
+                      geometry.height=StringToLong(value);
                       break;
                     }
                   ThrowMSLException(OptionError,"UnrecognizedAttribute",
@@ -1544,7 +1545,7 @@
                 {
                   if (LocaleCompare(keyword,"width") == 0)
                     {
-                      geometry.width=atol(value);
+                      geometry.width=StringToLong(value);
                       break;
                     }
                   ThrowMSLException(OptionError,"UnrecognizedAttribute",
@@ -1556,7 +1557,7 @@
                 {
                   if (LocaleCompare(keyword,"x") == 0)
                     {
-                      geometry.x=atol(value);
+                      geometry.x=StringToLong(value);
                       break;
                     }
                   ThrowMSLException(OptionError,"UnrecognizedAttribute",
@@ -1568,7 +1569,7 @@
                 {
                   if (LocaleCompare(keyword,"y") == 0)
                     {
-                      geometry.y=atol(value);
+                      geometry.y=StringToLong(value);
                       break;
                     }
                   ThrowMSLException(OptionError,"UnrecognizedAttribute",
@@ -1645,7 +1646,7 @@
                     }
                   if (LocaleCompare(keyword,"fuzz") == 0)
                     {
-                      msl_info->image[n]->fuzz=atof(value);
+                      msl_info->image[n]->fuzz=StringToDouble(value);
                       break;
                     }
                   ThrowMSLException(OptionError,"UnrecognizedAttribute",
@@ -1674,7 +1675,7 @@
                 {
                   if (LocaleCompare(keyword,"x") == 0)
                     {
-                      geometry.x=atol(value);
+                      geometry.x=StringToLong(value);
                       (void) GetOneVirtualMagickPixel(msl_info->image[n],
                         geometry.x,geometry.y,&target,&exception);
                       break;
@@ -1688,7 +1689,7 @@
                 {
                   if (LocaleCompare(keyword,"y") == 0)
                     {
-                      geometry.y=atol(value);
+                      geometry.y=StringToLong(value);
                       (void) GetOneVirtualMagickPixel(msl_info->image[n],
                         geometry.x,geometry.y,&target,&exception);
                       break;
@@ -1914,7 +1915,7 @@
                       CacheView
                         *composite_view;
 
-                      opacity=QuantumRange-atol(value);
+                      opacity=QuantumRange-StringToLong(value);
                       if (compose != DissolveCompositeOp)
                         {
                           (void) SetImageOpacity(composite_image,(Quantum)
@@ -1951,7 +1952,7 @@
                 {
                   if (LocaleCompare(keyword,"rotate") == 0)
                     {
-                      rotate_image=RotateImage(composite_image,atof(value),
+                      rotate_image=RotateImage(composite_image,StringToDouble(value),
                         &exception);
                       break;
                     }
@@ -2005,7 +2006,7 @@
                 {
                   if (LocaleCompare(keyword,"x") == 0)
                     {
-                      geometry.x=atol(value);
+                      geometry.x=StringToLong(value);
                       (void) GetOneVirtualPixel(msl_info->image[n],geometry.x,
                         geometry.y,&target,&exception);
                       break;
@@ -2019,7 +2020,7 @@
                 {
                   if (LocaleCompare(keyword,"y") == 0)
                     {
-                      geometry.y=atol(value);
+                      geometry.y=StringToLong(value);
                       (void) GetOneVirtualPixel(msl_info->image[n],geometry.x,
                         geometry.y,&target,&exception);
                       break;
@@ -2156,7 +2157,7 @@
                 {
                   if (LocaleCompare(keyword,"height") == 0)
                     {
-                      geometry.height=atol(value);
+                      geometry.height=StringToLong(value);
                       break;
                     }
                   ThrowMSLException(OptionError,"UnrecognizedAttribute",
@@ -2168,7 +2169,7 @@
                 {
                   if (LocaleCompare(keyword,"width") == 0)
                     {
-                      geometry.width=atol(value);
+                      geometry.width=StringToLong(value);
                       break;
                     }
                   ThrowMSLException(OptionError,"UnrecognizedAttribute",
@@ -2180,7 +2181,7 @@
                 {
                   if (LocaleCompare(keyword,"x") == 0)
                     {
-                      geometry.x=atol(value);
+                      geometry.x=StringToLong(value);
                       break;
                     }
                   ThrowMSLException(OptionError,"UnrecognizedAttribute",
@@ -2192,7 +2193,7 @@
                 {
                   if (LocaleCompare(keyword,"y") == 0)
                     {
-                      geometry.y=atol(value);
+                      geometry.y=StringToLong(value);
                       break;
                     }
                   ThrowMSLException(OptionError,"UnrecognizedAttribute",
@@ -2244,7 +2245,7 @@
                 {
                   if (LocaleCompare(keyword,"display") == 0)
                     {
-                      display=atol(value);
+                      display=StringToLong(value);
                       break;
                     }
                   ThrowMSLException(OptionError,"UnrecognizedAttribute",
@@ -2488,7 +2489,7 @@
                     }
                   if (LocaleCompare(keyword,"pointsize") == 0)
                     {
-                      draw_info->pointsize=atof(value);
+                      draw_info->pointsize=StringToDouble(value);
                       break;
                     }
                   ThrowMSLException(OptionError,"UnrecognizedAttribute",
@@ -2500,7 +2501,7 @@
                 {
                   if (LocaleCompare(keyword,"rotate") == 0)
                     {
-                      angle=atof(value);
+                      angle=StringToDouble(value);
                       affine.sx=cos(DegreesToRadians(fmod(angle,360.0)));
                       affine.rx=sin(DegreesToRadians(fmod(angle,360.0)));
                       affine.ry=(-sin(DegreesToRadians(fmod(angle,360.0))));
@@ -2525,13 +2526,13 @@
                     }
                   if (LocaleCompare(keyword,"skewX") == 0)
                     {
-                      angle=atof(value);
+                      angle=StringToDouble(value);
                       affine.ry=cos(DegreesToRadians(fmod(angle,360.0)));
                       break;
                     }
                   if (LocaleCompare(keyword,"skewY") == 0)
                     {
-                      angle=atof(value);
+                      angle=StringToDouble(value);
                       affine.rx=cos(DegreesToRadians(fmod(angle,360.0)));
                       break;
                     }
@@ -2553,7 +2554,7 @@
                     }
                   if (LocaleCompare(keyword,"strokewidth") == 0)
                     {
-                      draw_info->stroke_width=atol(value);
+                      draw_info->stroke_width=StringToLong(value);
                       break;
                     }
                   if (LocaleCompare(keyword,"style") == 0)
@@ -2609,7 +2610,7 @@
                 {
                   if (LocaleCompare(keyword,"weight") == 0)
                     {
-                      draw_info->weight=atol(value);
+                      draw_info->weight=StringToLong(value);
                       break;
                     }
                   ThrowMSLException(OptionError,"UnrecognizedAttribute",
@@ -2621,7 +2622,7 @@
                 {
                   if (LocaleCompare(keyword,"x") == 0)
                     {
-                      geometry.x=atol(value);
+                      geometry.x=StringToLong(value);
                       break;
                     }
                   ThrowMSLException(OptionError,"UnrecognizedAttribute",
@@ -2633,7 +2634,7 @@
                 {
                   if (LocaleCompare(keyword,"y") == 0)
                     {
-                      geometry.y=atol(value);
+                      geometry.y=StringToLong(value);
                       break;
                     }
                   ThrowMSLException(OptionError,"UnrecognizedAttribute",
@@ -2710,7 +2711,7 @@
                 {
                   if (LocaleCompare(keyword,"radius") == 0)
                     {
-                      geometry_info.rho=atof(value);
+                      geometry_info.rho=StringToDouble(value);
                       break;
                     }
                   ThrowMSLException(OptionError,"UnrecognizedAttribute",
@@ -2775,7 +2776,7 @@
                 {
                   if (LocaleCompare(keyword,"radius") == 0)
                     {
-                      geometry_info.rho=atof(value);
+                      geometry_info.rho=StringToDouble(value);
                       break;
                     }
                   ThrowMSLException(OptionError,"UnrecognizedAttribute",
@@ -2787,7 +2788,7 @@
                 {
                   if (LocaleCompare(keyword,"sigma") == 0)
                     {
-                      geometry_info.sigma=atol(value);
+                      geometry_info.sigma=StringToLong(value);
                       break;
                     }
                   ThrowMSLException(OptionError,"UnrecognizedAttribute",
@@ -3045,7 +3046,7 @@
                 {
                   if (LocaleCompare(keyword,"height") == 0)
                     {
-                      frame_info.height=atol(value);
+                      frame_info.height=StringToLong(value);
                       break;
                     }
                   ThrowMSLException(OptionError,"UnrecognizedAttribute",
@@ -3057,7 +3058,7 @@
                 {
                   if (LocaleCompare(keyword,"inner") == 0)
                     {
-                      frame_info.inner_bevel=atol(value);
+                      frame_info.inner_bevel=StringToLong(value);
                       break;
                     }
                   ThrowMSLException(OptionError,"UnrecognizedAttribute",
@@ -3069,7 +3070,7 @@
                 {
                   if (LocaleCompare(keyword,"outer") == 0)
                     {
-                      frame_info.outer_bevel=atol(value);
+                      frame_info.outer_bevel=StringToLong(value);
                       break;
                     }
                   ThrowMSLException(OptionError,"UnrecognizedAttribute",
@@ -3081,7 +3082,7 @@
                 {
                   if (LocaleCompare(keyword,"width") == 0)
                     {
-                      frame_info.width=atol(value);
+                      frame_info.width=StringToLong(value);
                       break;
                     }
                   ThrowMSLException(OptionError,"UnrecognizedAttribute",
@@ -3149,7 +3150,7 @@
                 {
                   if (LocaleCompare(keyword,"blue") == 0)
                     {
-                      pixel.blue=atof(value);
+                      pixel.blue=StringToDouble(value);
                       break;
                     }
                   ThrowMSLException(OptionError,"UnrecognizedAttribute",
@@ -3182,7 +3183,7 @@
                     }
                   if (LocaleCompare(keyword,"green") == 0)
                     {
-                      pixel.green=atof(value);
+                      pixel.green=StringToDouble(value);
                       break;
                     }
                   ThrowMSLException(OptionError,"UnrecognizedAttribute",
@@ -3194,7 +3195,7 @@
                 {
                   if (LocaleCompare(keyword,"red") == 0)
                     {
-                      pixel.red=atof(value);
+                      pixel.red=StringToDouble(value);
                       break;
                     }
                   ThrowMSLException(OptionError,"UnrecognizedAttribute",
@@ -3388,7 +3389,7 @@
                 {
                   if (LocaleCompare(keyword,"amount") == 0)
                     {
-                      geometry_info.rho=atof(value);
+                      geometry_info.rho=StringToDouble(value);
                       break;
                     }
                   ThrowMSLException(OptionError,"UnrecognizedAttribute",
@@ -3457,7 +3458,7 @@
             {
               if (LocaleCompare(keyword,"black") == 0)
               {
-                levelBlack = atof( value );
+                levelBlack = StringToDouble( value );
                 break;
               }
               ThrowMSLException(OptionError,"UnrecognizedAttribute",keyword);
@@ -3468,7 +3469,7 @@
             {
               if (LocaleCompare(keyword,"gamma") == 0)
               {
-                levelGamma = atof( value );
+                levelGamma = StringToDouble( value );
                 break;
               }
               ThrowMSLException(OptionError,"UnrecognizedAttribute",keyword);
@@ -3479,7 +3480,7 @@
             {
               if (LocaleCompare(keyword,"white") == 0)
               {
-                levelWhite = atof( value );
+                levelWhite = StringToDouble( value );
                 break;
               }
               ThrowMSLException(OptionError,"UnrecognizedAttribute",keyword);
@@ -3671,7 +3672,7 @@
                 {
                   if (LocaleCompare(keyword,"fuzz") == 0)
                     {
-                      msl_info->image[n]->fuzz=atof(value);
+                      msl_info->image[n]->fuzz=StringToDouble(value);
                       break;
                     }
                   ThrowMSLException(OptionError,"UnrecognizedAttribute",
@@ -3700,7 +3701,7 @@
                 {
                   if (LocaleCompare(keyword,"opacity") == 0)
                     {
-                      opacity=atof(value);
+                      opacity=StringToDouble(value);
                       break;
                     }
                   ThrowMSLException(OptionError,"UnrecognizedAttribute",
@@ -3712,7 +3713,7 @@
                 {
                   if (LocaleCompare(keyword,"x") == 0)
                     {
-                      geometry.x=atol(value);
+                      geometry.x=StringToLong(value);
                       (void) GetOneVirtualMagickPixel(msl_info->image[n],
                         geometry.x,geometry.y,&target,&exception);
                       break;
@@ -3726,7 +3727,7 @@
                 {
                   if (LocaleCompare(keyword,"y") == 0)
                     {
-                      geometry.y=atol(value);
+                      geometry.y=StringToLong(value);
                       (void) GetOneVirtualMagickPixel(msl_info->image[n],
                         geometry.x,geometry.y,&target,&exception);
                       break;
@@ -3794,7 +3795,7 @@
                 {
                   if (LocaleCompare(keyword,"radius") == 0)
                     {
-                      geometry_info.rho=atof(value);
+                      geometry_info.rho=StringToDouble(value);
                       break;
                     }
                   ThrowMSLException(OptionError,"UnrecognizedAttribute",
@@ -3881,12 +3882,12 @@
                 {
                   if (LocaleCompare(keyword,"blackness") == 0)
                     {
-                      geometry_info.rho=atof(value);
+                      geometry_info.rho=StringToDouble(value);
                       break;
                     }
                   if (LocaleCompare(keyword,"brightness") == 0)
                     {
-                      geometry_info.rho=atof(value);
+                      geometry_info.rho=StringToDouble(value);
                       break;
                     }
                   ThrowMSLException(OptionError,"UnrecognizedAttribute",
@@ -3910,7 +3911,7 @@
                 {
                   if (LocaleCompare(keyword,"hue") == 0)
                     {
-                      geometry_info.xi=atof(value);
+                      geometry_info.xi=StringToDouble(value);
                       break;
                     }
                   ThrowMSLException(OptionError,"UnrecognizedAttribute",
@@ -3922,7 +3923,7 @@
                 {
                   if (LocaleCompare(keyword,"lightness") == 0)
                     {
-                      geometry_info.rho=atof(value);
+                      geometry_info.rho=StringToDouble(value);
                       break;
                     }
                   ThrowMSLException(OptionError,"UnrecognizedAttribute",
@@ -3934,7 +3935,7 @@
                 {
                   if (LocaleCompare(keyword,"saturation") == 0)
                     {
-                      geometry_info.sigma=atof(value);
+                      geometry_info.sigma=StringToDouble(value);
                       break;
                     }
                   ThrowMSLException(OptionError,"UnrecognizedAttribute",
@@ -3946,7 +3947,7 @@
                 {
                   if (LocaleCompare(keyword,"whiteness") == 0)
                     {
-                      geometry_info.sigma=atof(value);
+                      geometry_info.sigma=StringToDouble(value);
                       break;
                     }
                   ThrowMSLException(OptionError,"UnrecognizedAttribute",
@@ -4133,7 +4134,7 @@
                 {
                   if (LocaleCompare(keyword,"radius") == 0)
                     {
-                      geometry_info.rho=atof(value);
+                      geometry_info.rho=StringToDouble(value);
                       break;
                     }
                   ThrowMSLException(OptionError,"UnrecognizedAttribute",
@@ -4208,7 +4209,7 @@
                     }
                   if (LocaleCompare(keyword,"fuzz") == 0)
                     {
-                      msl_info->image[n]->fuzz=atof(value);
+                      msl_info->image[n]->fuzz=StringToDouble(value);
                       break;
                     }
                   ThrowMSLException(OptionError,"UnrecognizedAttribute",
@@ -4399,7 +4400,7 @@
                 {
                   if (LocaleCompare(keyword,"colors") == 0)
                     {
-                      quantize_info.number_colors=atol(value);
+                      quantize_info.number_colors=StringToLong(value);
                       break;
                     }
                   if (LocaleCompare(keyword,"colorspace") == 0)
@@ -4455,7 +4456,7 @@
                 {
                   if (LocaleCompare(keyword,"treedepth") == 0)
                     {
-                      quantize_info.tree_depth=atol(value);
+                      quantize_info.tree_depth=StringToLong(value);
                       break;
                     }
                   ThrowMSLException(OptionError,"UnrecognizedAttribute",
@@ -4630,7 +4631,7 @@
                 {
                   if (LocaleCompare(keyword,"pointsize") == 0)
                     {
-                      draw_info->pointsize=atof(value);
+                      draw_info->pointsize=StringToDouble(value);
                       break;
                     }
                   ThrowMSLException(OptionError,"UnrecognizedAttribute",
@@ -4642,7 +4643,7 @@
                 {
                   if (LocaleCompare(keyword,"rotate") == 0)
                     {
-                      angle=atof(value);
+                      angle=StringToDouble(value);
                       affine.sx=cos(DegreesToRadians(fmod(angle,360.0)));
                       affine.rx=sin(DegreesToRadians(fmod(angle,360.0)));
                       affine.ry=(-sin(DegreesToRadians(fmod(angle,360.0))));
@@ -4667,13 +4668,13 @@
                     }
                   if (LocaleCompare(keyword,"skewX") == 0)
                     {
-                      angle=atof(value);
+                      angle=StringToDouble(value);
                       affine.ry=cos(DegreesToRadians(fmod(angle,360.0)));
                       break;
                     }
                   if (LocaleCompare(keyword,"skewY") == 0)
                     {
-                      angle=atof(value);
+                      angle=StringToDouble(value);
                       affine.rx=cos(DegreesToRadians(fmod(angle,360.0)));
                       break;
                     }
@@ -4695,7 +4696,7 @@
                     }
                   if (LocaleCompare(keyword,"strokewidth") == 0)
                     {
-                      draw_info->stroke_width=atol(value);
+                      draw_info->stroke_width=StringToLong(value);
                       break;
                     }
                   if (LocaleCompare(keyword,"style") == 0)
@@ -4751,7 +4752,7 @@
                 {
                   if (LocaleCompare(keyword,"weight") == 0)
                     {
-                      draw_info->weight=atol(value);
+                      draw_info->weight=StringToLong(value);
                       break;
                     }
                   ThrowMSLException(OptionError,"UnrecognizedAttribute",
@@ -4763,7 +4764,7 @@
                 {
                   if (LocaleCompare(keyword,"x") == 0)
                     {
-                      geometry.x=atol(value);
+                      geometry.x=StringToLong(value);
                       break;
                     }
                   ThrowMSLException(OptionError,"UnrecognizedAttribute",
@@ -4775,7 +4776,7 @@
                 {
                   if (LocaleCompare(keyword,"y") == 0)
                     {
-                      geometry.y=atol(value);
+                      geometry.y=StringToLong(value);
                       break;
                     }
                   ThrowMSLException(OptionError,"UnrecognizedAttribute",
@@ -4888,7 +4889,7 @@
                 {
                   if (LocaleCompare(keyword,"height") == 0)
                     {
-                      geometry.height=atol(value);
+                      geometry.height=StringToLong(value);
                       break;
                     }
                   ThrowMSLException(OptionError,"UnrecognizedAttribute",
@@ -4917,7 +4918,7 @@
                 {
                   if (LocaleCompare(keyword,"width") == 0)
                     {
-                      geometry.width=atol(value);
+                      geometry.width=StringToLong(value);
                       break;
                     }
                   ThrowMSLException(OptionError,"UnrecognizedAttribute",
@@ -5017,7 +5018,7 @@
                 {
                   if (LocaleCompare(keyword,"radius") == 0)
                     {
-                      geometry_info.rho=atof(value);
+                      geometry_info.rho=StringToDouble(value);
                       break;
                     }
                   ThrowMSLException(OptionError,"UnrecognizedAttribute",
@@ -5114,7 +5115,7 @@
           {
           if (LocaleCompare(keyword,"height") == 0)
             {
-            height = atol( value );
+            height = StringToLong( value );
             break;
             }
           ThrowMSLException(OptionError,"UnrecognizedAttribute",keyword);
@@ -5125,7 +5126,7 @@
           {
           if (LocaleCompare(keyword,"width") == 0)
             {
-            width = atol( value );
+            width = StringToLong( value );
             break;
             }
           ThrowMSLException(OptionError,"UnrecognizedAttribute",keyword);
@@ -5136,7 +5137,7 @@
           {
           if (LocaleCompare(keyword,"x") == 0)
             {
-            x = atol( value );
+            x = StringToLong( value );
             break;
             }
           ThrowMSLException(OptionError,"UnrecognizedAttribute",keyword);
@@ -5147,7 +5148,7 @@
           {
           if (LocaleCompare(keyword,"y") == 0)
             {
-            y = atol( value );
+            y = StringToLong( value );
             break;
             }
           ThrowMSLException(OptionError,"UnrecognizedAttribute",keyword);
@@ -5194,7 +5195,7 @@
           {
             if (LocaleCompare(keyword,"blur") == 0)
               {
-                msl_info->image[n]->blur=atof(value);
+                msl_info->image[n]->blur=StringToDouble(value);
                 break;
               }
             ThrowMSLException(OptionError,"UnrecognizedAttribute",keyword);
@@ -5223,7 +5224,7 @@
           {
             if (LocaleCompare(keyword,"x-resolution") == 0)
               {
-                x_resolution=atof(value);
+                x_resolution=StringToDouble(value);
                 break;
               }
             ThrowMSLException(OptionError,"UnrecognizedAttribute",keyword);
@@ -5234,7 +5235,7 @@
           {
             if (LocaleCompare(keyword,"y-resolution") == 0)
               {
-                y_resolution=atof(value);
+                y_resolution=StringToDouble(value);
                 break;
               }
             ThrowMSLException(OptionError,"UnrecognizedAttribute",keyword);
@@ -5342,7 +5343,7 @@
                 {
                   if (LocaleCompare(keyword,"height") == 0)
                     {
-                      geometry.height=(unsigned long) atol(value);
+                      geometry.height=(unsigned long) StringToLong(value);
                       break;
                     }
                   ThrowMSLException(OptionError,"UnrecognizedAttribute",
@@ -5354,7 +5355,7 @@
                 {
                   if (LocaleCompare(keyword,"support") == 0)
                     {
-                      blur=atof(value);
+                      blur=StringToDouble(value);
                       break;
                     }
                   ThrowMSLException(OptionError,"UnrecognizedAttribute",
@@ -5366,7 +5367,7 @@
                 {
                   if (LocaleCompare(keyword,"width") == 0)
                     {
-                      geometry.width=atol(value);
+                      geometry.width=StringToLong(value);
                       break;
                     }
                   ThrowMSLException(OptionError,"UnrecognizedAttribute",
@@ -5433,7 +5434,7 @@
                 {
                   if (LocaleCompare(keyword,"x") == 0)
                     {
-                      geometry.x=atol(value);
+                      geometry.x=StringToLong(value);
                       break;
                     }
                   ThrowMSLException(OptionError,"UnrecognizedAttribute",
@@ -5445,7 +5446,7 @@
                 {
                   if (LocaleCompare(keyword,"y") == 0)
                     {
-                      geometry.y=atol(value);
+                      geometry.y=StringToLong(value);
                       break;
                     }
                   ThrowMSLException(OptionError,"UnrecognizedAttribute",
@@ -5506,7 +5507,7 @@
           {
           if (LocaleCompare(keyword,"x") == 0)
             {
-            x = atol( value );
+            x = StringToLong( value );
             break;
             }
           ThrowMSLException(OptionError,"UnrecognizedAttribute",keyword);
@@ -5517,7 +5518,7 @@
           {
           if (LocaleCompare(keyword,"y") == 0)
             {
-            y = atol( value );
+            y = StringToLong( value );
             break;
             }
           ThrowMSLException(OptionError,"UnrecognizedAttribute",keyword);
@@ -5575,7 +5576,7 @@
                 {
                   if (LocaleCompare(keyword,"degrees") == 0)
                     {
-                      geometry_info.rho=atof(value);
+                      geometry_info.rho=StringToDouble(value);
                       break;
                     }
                   ThrowMSLException(OptionError,"UnrecognizedAttribute",
@@ -5637,7 +5638,7 @@
           {
           if (LocaleCompare(keyword,"degrees") == 0)
             {
-            degrees = atof( value );
+            degrees = StringToDouble( value );
             break;
             }
           ThrowMSLException(OptionError,"UnrecognizedAttribute",keyword);
@@ -5713,7 +5714,7 @@
                 {
                   if (LocaleCompare(keyword,"height") == 0)
                     {
-                      geometry.height=(unsigned long) atol(value);
+                      geometry.height=(unsigned long) StringToLong(value);
                       break;
                     }
                   ThrowMSLException(OptionError,"UnrecognizedAttribute",
@@ -5725,7 +5726,7 @@
                 {
                   if (LocaleCompare(keyword,"width") == 0)
                     {
-                      geometry.width=atol(value);
+                      geometry.width=StringToLong(value);
                       break;
                     }
                   ThrowMSLException(OptionError,"UnrecognizedAttribute",
@@ -5789,7 +5790,7 @@
                 {
                   if (LocaleCompare(keyword,"height") == 0)
                     {
-                      geometry.height=(unsigned long) atol(value);
+                      geometry.height=(unsigned long) StringToLong(value);
                       break;
                     }
                   ThrowMSLException(OptionError,"UnrecognizedAttribute",
@@ -5801,7 +5802,7 @@
                 {
                   if (LocaleCompare(keyword,"width") == 0)
                     {
-                      geometry.width=atol(value);
+                      geometry.width=StringToLong(value);
                       break;
                     }
                   ThrowMSLException(OptionError,"UnrecognizedAttribute",
@@ -5859,7 +5860,7 @@
                 {
                   if (LocaleCompare(keyword,"cluster-threshold") == 0)
                     {
-                      geometry_info.rho=atof(value);
+                      geometry_info.rho=StringToDouble(value);
                       break;
                     }
                   if (LocaleCompare(keyword,"colorspace") == 0)
@@ -5895,7 +5896,7 @@
                 {
                   if (LocaleCompare(keyword,"smoothing-threshold") == 0)
                     {
-                      geometry_info.sigma=atof(value);
+                      geometry_info.sigma=StringToDouble(value);
                       break;
                     }
                   ThrowMSLException(OptionError,"UnrecognizedAttribute",
@@ -6011,10 +6012,10 @@
                   if (value[len-1] == '%') {
                     char  tmp[100];
                     (void) CopyMagickString(tmp,value,len);
-                    opac = atol( tmp );
+                    opac = StringToLong( tmp );
                     opac = (int)(QuantumRange * ((float)opac/100));
                   } else
-                    opac = atol( value );
+                    opac = StringToLong( value );
                   (void) SetImageOpacity( msl_info->image[n], (Quantum) opac );
                   break;
               }
@@ -6096,7 +6097,7 @@
                 {
                   if (LocaleCompare(keyword,"azimuth") == 0)
                     {
-                      geometry_info.rho=atof(value);
+                      geometry_info.rho=StringToDouble(value);
                       break;
                     }
                   ThrowMSLException(OptionError,"UnrecognizedAttribute",
@@ -6108,7 +6109,7 @@
                 {
                   if (LocaleCompare(keyword,"elevation") == 0)
                     {
-                      geometry_info.sigma=atof(value);
+                      geometry_info.sigma=StringToDouble(value);
                       break;
                     }
                   ThrowMSLException(OptionError,"UnrecognizedAttribute",
@@ -6197,7 +6198,7 @@
                 {
                   if (LocaleCompare(keyword,"opacity") == 0)
                     {
-                      geometry_info.rho=atol(value);
+                      geometry_info.rho=StringToLong(value);
                       break;
                     }
                   ThrowMSLException(OptionError,"UnrecognizedAttribute",
@@ -6209,7 +6210,7 @@
                 {
                   if (LocaleCompare(keyword,"sigma") == 0)
                     {
-                      geometry_info.sigma=atol(value);
+                      geometry_info.sigma=StringToLong(value);
                       break;
                     }
                   break;
@@ -6219,7 +6220,7 @@
                 {
                   if (LocaleCompare(keyword,"x") == 0)
                     {
-                      geometry_info.xi=atof(value);
+                      geometry_info.xi=StringToDouble(value);
                       break;
                     }
                   ThrowMSLException(OptionError,"UnrecognizedAttribute",
@@ -6231,7 +6232,7 @@
                 {
                   if (LocaleCompare(keyword,"y") == 0)
                     {
-                      geometry_info.psi=atol(value);
+                      geometry_info.psi=StringToLong(value);
                       break;
                     }
                   ThrowMSLException(OptionError,"UnrecognizedAttribute",
@@ -6283,7 +6284,7 @@
             {
               if (LocaleCompare(keyword, "radius") == 0)
               {
-                radius = atof( value );
+                radius = StringToDouble( value );
                 break;
               }
               ThrowMSLException(OptionError,"UnrecognizedAttribute",keyword);
@@ -6294,7 +6295,7 @@
             {
               if (LocaleCompare(keyword,"sigma") == 0)
               {
-                sigma = atol( value );
+                sigma = StringToLong( value );
                 break;
               }
               ThrowMSLException(OptionError,"UnrecognizedAttribute",keyword);
@@ -6361,7 +6362,7 @@
           {
           if (LocaleCompare(keyword,"height") == 0)
             {
-            height = atol( value );
+            height = StringToLong( value );
             break;
             }
           ThrowMSLException(OptionError,"UnrecognizedAttribute",keyword);
@@ -6372,7 +6373,7 @@
           {
           if (LocaleCompare(keyword,"width") == 0)
             {
-            width = atol( value );
+            width = StringToLong( value );
             break;
             }
           ThrowMSLException(OptionError,"UnrecognizedAttribute",keyword);
@@ -6466,7 +6467,7 @@
                 {
                   if (LocaleCompare(keyword,"x") == 0)
                     {
-                      geometry_info.rho=atof(value);
+                      geometry_info.rho=StringToDouble(value);
                       break;
                     }
                   ThrowMSLException(OptionError,"UnrecognizedAttribute",
@@ -6478,7 +6479,7 @@
                 {
                   if (LocaleCompare(keyword,"y") == 0)
                     {
-                      geometry_info.sigma=atol(value);
+                      geometry_info.sigma=StringToLong(value);
                       break;
                     }
                   ThrowMSLException(OptionError,"UnrecognizedAttribute",
@@ -6570,7 +6571,7 @@
                 {
                   if (LocaleCompare(keyword,"threshold") == 0)
                     {
-                      geometry_info.rho=atof(value);
+                      geometry_info.rho=StringToDouble(value);
                       break;
                     }
                   ThrowMSLException(OptionError,"UnrecognizedAttribute",
@@ -6630,7 +6631,7 @@
                 {
                   if (LocaleCompare(keyword,"radius") == 0)
                     {
-                      geometry_info.rho=atof(value);
+                      geometry_info.rho=StringToDouble(value);
                       break;
                     }
                   ThrowMSLException(OptionError,"UnrecognizedAttribute",
@@ -6877,7 +6878,7 @@
                 {
                   if (LocaleCompare(keyword,"degrees") == 0)
                     {
-                      geometry_info.rho=atof(value);
+                      geometry_info.rho=StringToDouble(value);
                       break;
                     }
                   ThrowMSLException(OptionError,"UnrecognizedAttribute",
@@ -7030,7 +7031,7 @@
           {
           if (LocaleCompare(keyword,"threshold") == 0)
             {
-            threshold = atof( value );
+            threshold = StringToDouble( value );
             break;
             }
           ThrowMSLException(OptionError,"UnrecognizedAttribute",keyword);
@@ -7838,7 +7839,7 @@
 
           limit=MagickResourceInfinity;
           if (LocaleCompare(value,"unlimited") != 0)
-            limit=(MagickSizeType) StringToDouble(value,100.0);
+            limit=(MagickSizeType) SiPrefixToDouble(value,100.0);
           (void) SetMagickResourceLimit(AreaResource,limit);
           break;
         }
@@ -7868,7 +7869,7 @@
         {
           if (image == (Image *) NULL)
             break;
-          image->bias=StringToDouble(value,QuantumRange);
+          image->bias=SiPrefixToDouble(value,QuantumRange);
           break;
         }
       if (LocaleCompare(keyword,"blue-primary") == 0)
@@ -7971,8 +7972,8 @@
     {
       if (LocaleCompare(keyword,"pointsize") == 0)
         {
-          image_info->pointsize=atof(value);
-          draw_info->pointsize=atof(value);
+          image_info->pointsize=StringToDouble(value);
+          draw_info->pointsize=StringToDouble(value);
           break;
         }
       ThrowMSLException(OptionError,"UnrecognizedAttribute",keyword);
@@ -7983,10 +7984,10 @@
     {
       if (LocaleCompare(keyword,"quality") == 0)
         {
-          image_info->quality=atol(value);
+          image_info->quality=StringToLong(value);
           if (image == (Image *) NULL)
             break;
-          image->quality=atol(value);
+          image->quality=StringToLong(value);
           break;
         }
       break;
diff --git a/coders/png.c b/coders/png.c
index 69ed1d9..f537b3c 100644
--- a/coders/png.c
+++ b/coders/png.c
@@ -76,6 +76,7 @@
 #include "magick/static.h"
 #include "magick/statistic.h"
 #include "magick/string_.h"
+#include "magick/string-private.h"
 #include "magick/transform.h"
 #include "magick/utility.h"
 #if defined(MAGICKCORE_PNG_DELEGATE)
@@ -1540,7 +1541,7 @@
   /* look for length */
   while (*sp == '\0' || *sp == ' ' || *sp == '\n')
      sp++;
-  length=(png_uint_32) atol(sp);
+  length=(png_uint_32) StringToLong(sp);
   while (*sp != ' ' && *sp != '\n')
      sp++;
   /* allocate space */
diff --git a/coders/pnm.c b/coders/pnm.c
index 0181a6d..ca4dd42 100644
--- a/coders/pnm.c
+++ b/coders/pnm.c
@@ -53,6 +53,7 @@
 #include "magick/list.h"
 #include "magick/magick.h"
 #include "magick/memory_.h"
+#include "magick/module.h"
 #include "magick/monitor.h"
 #include "magick/monitor-private.h"
 #include "magick/pixel-private.h"
@@ -61,7 +62,7 @@
 #include "magick/static.h"
 #include "magick/statistic.h"
 #include "magick/string_.h"
-#include "magick/module.h"
+#include "magick/string-private.h"
 
 /*
   Forward declarations.
@@ -312,7 +313,7 @@
               scale[MaxTextExtent];
 
             (void) ReadBlobString(image,scale);
-            quantum_scale=atof(scale);
+            quantum_scale=StringToDouble(scale);
           }
         else
           {
@@ -365,11 +366,11 @@
             Assign a value to the specified keyword.
           */
           if (LocaleCompare(keyword,"depth") == 0)
-            packet_size=(unsigned long) atol(value);
+            packet_size=(unsigned long) StringToLong(value);
           if (LocaleCompare(keyword,"height") == 0)
-            image->rows=(unsigned long) atol(value);
+            image->rows=(unsigned long) StringToLong(value);
           if (LocaleCompare(keyword,"maxval") == 0)
-            max_value=(unsigned long) atol(value);
+            max_value=(unsigned long) StringToLong(value);
           if (LocaleCompare(keyword,"TUPLTYPE") == 0)
             {
               if (LocaleCompare(value,"BLACKANDWHITE") == 0)
@@ -404,7 +405,7 @@
                 }
             }
           if (LocaleCompare(keyword,"width") == 0)
-            image->columns=(unsigned long) atol(value);
+            image->columns=(unsigned long) StringToLong(value);
         }
       }
     if ((image->columns == 0) || (image->rows == 0))
diff --git a/coders/sct.c b/coders/sct.c
index 46ed061..2e615cf 100644
--- a/coders/sct.c
+++ b/coders/sct.c
@@ -50,12 +50,13 @@
 #include "magick/list.h"
 #include "magick/magick.h"
 #include "magick/memory_.h"
+#include "magick/module.h"
 #include "magick/monitor.h"
 #include "magick/monitor-private.h"
 #include "magick/quantum-private.h"
 #include "magick/static.h"
 #include "magick/string_.h"
-#include "magick/module.h"
+#include "magick/string-private.h"
 
 /*
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -204,14 +205,14 @@
   separations_mask=ReadBlobMSBShort(image);
   count=ReadBlob(image,14,buffer);
   buffer[14]='\0';
-  height=atof((char *) buffer);
+  height=StringToDouble((char *) buffer);
   count=ReadBlob(image,14,buffer);
-  width=atof((char *) buffer);
+  width=StringToDouble((char *) buffer);
   count=ReadBlob(image,12,buffer);
   buffer[12]='\0';
-  image->rows=1UL*atol((char *) buffer);
+  image->rows=1UL*StringToLong((char *) buffer);
   count=ReadBlob(image,12,buffer);
-  image->columns=1UL*atol((char *) buffer);
+  image->columns=1UL*StringToLong((char *) buffer);
   count=ReadBlob(image,200,buffer);
   count=ReadBlob(image,768,buffer);
   if (separations_mask == 0x0f)
diff --git a/coders/svg.c b/coders/svg.c
index eb9224f..686669d 100644
--- a/coders/svg.c
+++ b/coders/svg.c
@@ -59,6 +59,7 @@
 #include "magick/log.h"
 #include "magick/magick.h"
 #include "magick/memory_.h"
+#include "magick/module.h"
 #include "magick/monitor.h"
 #include "magick/monitor-private.h"
 #include "magick/quantum-private.h"
@@ -67,7 +68,7 @@
 #include "magick/resource_.h"
 #include "magick/static.h"
 #include "magick/string_.h"
-#include "magick/module.h"
+#include "magick/string-private.h"
 #include "magick/token.h"
 #include "magick/utility.h"
 #if defined(MAGICKCORE_XML_DELEGATE)
@@ -301,7 +302,7 @@
   assert(string != (const char *) NULL);
   p=(const char *) string;
   GetMagickToken(p,&p,token);
-  value=atof(token);
+  value=StringToDouble(token);
   if (strchr(token,'%') != (char *) NULL)
     {
       double
@@ -1286,27 +1287,27 @@
                       {
                         p=(const char *) value;
                         GetMagickToken(p,&p,token);
-                        affine.sx=atof(value);
+                        affine.sx=StringToDouble(value);
                         GetMagickToken(p,&p,token);
                         if (*token == ',')
                           GetMagickToken(p,&p,token);
-                        affine.rx=atof(token);
+                        affine.rx=StringToDouble(token);
                         GetMagickToken(p,&p,token);
                         if (*token == ',')
                           GetMagickToken(p,&p,token);
-                        affine.ry=atof(token);
+                        affine.ry=StringToDouble(token);
                         GetMagickToken(p,&p,token);
                         if (*token == ',')
                           GetMagickToken(p,&p,token);
-                        affine.sy=atof(token);
+                        affine.sy=StringToDouble(token);
                         GetMagickToken(p,&p,token);
                         if (*token == ',')
                           GetMagickToken(p,&p,token);
-                        affine.tx=atof(token);
+                        affine.tx=StringToDouble(token);
                         GetMagickToken(p,&p,token);
                         if (*token == ',')
                           GetMagickToken(p,&p,token);
-                        affine.ty=atof(token);
+                        affine.ty=StringToDouble(token);
                         break;
                       }
                     break;
@@ -1861,27 +1862,27 @@
                       {
                         p=(const char *) value;
                         GetMagickToken(p,&p,token);
-                        affine.sx=atof(value);
+                        affine.sx=StringToDouble(value);
                         GetMagickToken(p,&p,token);
                         if (*token == ',')
                           GetMagickToken(p,&p,token);
-                        affine.rx=atof(token);
+                        affine.rx=StringToDouble(token);
                         GetMagickToken(p,&p,token);
                         if (*token == ',')
                           GetMagickToken(p,&p,token);
-                        affine.ry=atof(token);
+                        affine.ry=StringToDouble(token);
                         GetMagickToken(p,&p,token);
                         if (*token == ',')
                           GetMagickToken(p,&p,token);
-                        affine.sy=atof(token);
+                        affine.sy=StringToDouble(token);
                         GetMagickToken(p,&p,token);
                         if (*token == ',')
                           GetMagickToken(p,&p,token);
-                        affine.tx=atof(token);
+                        affine.tx=StringToDouble(token);
                         GetMagickToken(p,&p,token);
                         if (*token == ',')
                           GetMagickToken(p,&p,token);
-                        affine.ty=atof(token);
+                        affine.ty=StringToDouble(token);
                         break;
                       }
                     break;
@@ -1898,15 +1899,15 @@
 
                         p=(const char *) value;
                         GetMagickToken(p,&p,token);
-                        angle=atof(value);
+                        angle=StringToDouble(value);
                         GetMagickToken(p,&p,token);
                         if (*token == ',')
                           GetMagickToken(p,&p,token);
-                        x=atof(token);
+                        x=StringToDouble(token);
                         GetMagickToken(p,&p,token);
                         if (*token == ',')
                           GetMagickToken(p,&p,token);
-                        y=atof(token);
+                        y=StringToDouble(token);
                         affine.sx=cos(DegreesToRadians(fmod(angle,360.0)));
                         affine.rx=sin(DegreesToRadians(fmod(angle,360.0)));
                         affine.ry=(-sin(DegreesToRadians(fmod(angle,360.0))));
@@ -2008,21 +2009,21 @@
             {
               p=(const char *) value;
               GetMagickToken(p,&p,token);
-              svg_info->view_box.x=atof(token);
+              svg_info->view_box.x=StringToDouble(token);
               GetMagickToken(p,&p,token);
               if (*token == ',')
                 GetMagickToken(p,&p,token);
-              svg_info->view_box.y=atof(token);
+              svg_info->view_box.y=StringToDouble(token);
               GetMagickToken(p,&p,token);
               if (*token == ',')
                 GetMagickToken(p,&p,token);
-              svg_info->view_box.width=atof(token);
+              svg_info->view_box.width=StringToDouble(token);
               if (svg_info->bounds.width == 0)
                 svg_info->bounds.width=svg_info->view_box.width;
               GetMagickToken(p,&p,token);
               if (*token == ',')
                 GetMagickToken(p,&p,token);
-              svg_info->view_box.height=atof(token);
+              svg_info->view_box.height=StringToDouble(token);
               if (svg_info->bounds.height == 0)
                 svg_info->bounds.height=svg_info->view_box.height;
               break;
@@ -3480,34 +3481,34 @@
         if (LocaleCompare("affine",keyword) == 0)
           {
             GetMagickToken(q,&q,token);
-            affine.sx=atof(token);
+            affine.sx=StringToDouble(token);
             GetMagickToken(q,&q,token);
             if (*token == ',')
               GetMagickToken(q,&q,token);
-            affine.rx=atof(token);
+            affine.rx=StringToDouble(token);
             GetMagickToken(q,&q,token);
             if (*token == ',')
               GetMagickToken(q,&q,token);
-            affine.ry=atof(token);
+            affine.ry=StringToDouble(token);
             GetMagickToken(q,&q,token);
             if (*token == ',')
               GetMagickToken(q,&q,token);
-            affine.sy=atof(token);
+            affine.sy=StringToDouble(token);
             GetMagickToken(q,&q,token);
             if (*token == ',')
               GetMagickToken(q,&q,token);
-            affine.tx=atof(token);
+            affine.tx=StringToDouble(token);
             GetMagickToken(q,&q,token);
             if (*token == ',')
               GetMagickToken(q,&q,token);
-            affine.ty=atof(token);
+            affine.ty=StringToDouble(token);
             break;
           }
         if (LocaleCompare("angle",keyword) == 0)
           {
             GetMagickToken(q,&q,token);
-            affine.rx=atof(token);
-            affine.ry=atof(token);
+            affine.rx=StringToDouble(token);
+            affine.ry=StringToDouble(token);
             break;
           }
         if (LocaleCompare("arc",keyword) == 0)
@@ -3822,23 +3823,23 @@
                 GetMagickToken(q,&q,token);
                 (void) CopyMagickString(type,token,MaxTextExtent);
                 GetMagickToken(q,&q,token);
-                svg_info.segment.x1=atof(token);
-                svg_info.element.cx=atof(token);
+                svg_info.segment.x1=StringToDouble(token);
+                svg_info.element.cx=StringToDouble(token);
                 GetMagickToken(q,&q,token);
                 if (*token == ',')
                   GetMagickToken(q,&q,token);
-                svg_info.segment.y1=atof(token);
-                svg_info.element.cy=atof(token);
+                svg_info.segment.y1=StringToDouble(token);
+                svg_info.element.cy=StringToDouble(token);
                 GetMagickToken(q,&q,token);
                 if (*token == ',')
                   GetMagickToken(q,&q,token);
-                svg_info.segment.x2=atof(token);
-                svg_info.element.major=atof(token);
+                svg_info.segment.x2=StringToDouble(token);
+                svg_info.element.major=StringToDouble(token);
                 GetMagickToken(q,&q,token);
                 if (*token == ',')
                   GetMagickToken(q,&q,token);
-                svg_info.segment.y2=atof(token);
-                svg_info.element.minor=atof(token);
+                svg_info.segment.y2=StringToDouble(token);
+                svg_info.element.minor=StringToDouble(token);
                 (void) FormatMagickString(message,MaxTextExtent,
                   "<%sGradient id=\"%s\" x1=\"%g\" y1=\"%g\" x2=\"%g\" "
                   "y2=\"%g\">\n",type,name,svg_info.segment.x1,
@@ -3848,7 +3849,7 @@
                     GetMagickToken(q,&q,token);
                     if (*token == ',')
                       GetMagickToken(q,&q,token);
-                    svg_info.element.angle=atof(token);
+                    svg_info.element.angle=StringToDouble(token);
                     (void) FormatMagickString(message,MaxTextExtent,
                       "<%sGradient id=\"%s\" cx=\"%g\" cy=\"%g\" r=\"%g\" "
                       "fx=\"%g\" fy=\"%g\">\n",type,name,svg_info.element.cx,
@@ -3874,19 +3875,19 @@
                 GetMagickToken(q,&q,token);
                 (void) CopyMagickString(name,token,MaxTextExtent);
                 GetMagickToken(q,&q,token);
-                svg_info.bounds.x=atof(token);
+                svg_info.bounds.x=StringToDouble(token);
                 GetMagickToken(q,&q,token);
                 if (*token == ',')
                   GetMagickToken(q,&q,token);
-                svg_info.bounds.y=atof(token);
+                svg_info.bounds.y=StringToDouble(token);
                 GetMagickToken(q,&q,token);
                 if (*token == ',')
                   GetMagickToken(q,&q,token);
-                svg_info.bounds.width=atof(token);
+                svg_info.bounds.width=StringToDouble(token);
                 GetMagickToken(q,&q,token);
                 if (*token == ',')
                   GetMagickToken(q,&q,token);
-                svg_info.bounds.height=atof(token);
+                svg_info.bounds.height=StringToDouble(token);
                 (void) FormatMagickString(message,MaxTextExtent,
                   "<pattern id=\"%s\" x=\"%g\" y=\"%g\" width=\"%g\" "
                   "height=\"%g\">\n",name,svg_info.bounds.x,svg_info.bounds.y,
@@ -3929,11 +3930,11 @@
         if (LocaleCompare("scale",keyword) == 0)
           {
             GetMagickToken(q,&q,token);
-            affine.sx=atof(token);
+            affine.sx=StringToDouble(token);
             GetMagickToken(q,&q,token);
             if (*token == ',')
               GetMagickToken(q,&q,token);
-            affine.sy=atof(token);
+            affine.sy=StringToDouble(token);
             break;
           }
         if (LocaleCompare("skewX",keyword) == 0)
@@ -4084,11 +4085,11 @@
         if (LocaleCompare("translate",keyword) == 0)
           {
             GetMagickToken(q,&q,token);
-            affine.tx=atof(token);
+            affine.tx=StringToDouble(token);
             GetMagickToken(q,&q,token);
             if (*token == ',')
               GetMagickToken(q,&q,token);
-            affine.ty=atof(token);
+            affine.ty=StringToDouble(token);
             break;
           }
         status=MagickFalse;
@@ -4137,11 +4138,11 @@
       if (IsPoint(q) == MagickFalse)
         break;
       GetMagickToken(q,&q,token);
-      point.x=atof(token);
+      point.x=StringToDouble(token);
       GetMagickToken(q,&q,token);
       if (*token == ',')
         GetMagickToken(q,&q,token);
-      point.y=atof(token);
+      point.y=StringToDouble(token);
       GetMagickToken(q,(const char **) NULL,token);
       if (*token == ',')
         GetMagickToken(q,&q,token);
diff --git a/coders/thumbnail.c b/coders/thumbnail.c
index 7f42a7f..e19a026 100644
--- a/coders/thumbnail.c
+++ b/coders/thumbnail.c
@@ -47,6 +47,7 @@
 #include "magick/exception-private.h"
 #include "magick/magick.h"
 #include "magick/memory_.h"
+#include "magick/module.h"
 #include "magick/monitor.h"
 #include "magick/monitor-private.h"
 #include "magick/profile.h"
@@ -54,7 +55,7 @@
 #include "magick/quantum-private.h"
 #include "magick/static.h"
 #include "magick/string_.h"
-#include "magick/module.h"
+#include "magick/string-private.h"
 
 /*
   Forward declarations.
@@ -183,11 +184,11 @@
   property=GetImageProperty(image,"exif:JPEGInterchangeFormat");
   if (property == (const char *) NULL)
     ThrowWriterException(CoderError,"ImageDoesNotHaveAThumbnail");
-  offset=(ssize_t) atoi(property);
+  offset=(ssize_t) StringToLong(property);
   property=GetImageProperty(image,"exif:JPEGInterchangeFormatLength");
   if (property == (const char *) NULL)
     ThrowWriterException(CoderError,"ImageDoesNotHaveAThumbnail");
-  length=(size_t) atoi(property);
+  length=(size_t) StringToLong(property);
   (void) ResetMagickMemory(magick,0,sizeof(magick));
   for (i=0; i < (long) length; i++)
   {
diff --git a/coders/tiff.c b/coders/tiff.c
index cab09db..783db7d 100644
--- a/coders/tiff.c
+++ b/coders/tiff.c
@@ -73,9 +73,9 @@
 #include "magick/static.h"
 #include "magick/statistic.h"
 #include "magick/string_.h"
+#include "magick/string-private.h"
 #include "magick/thread_.h"
 #include "magick/utility.h"
-#include "magick/module.h"
 #if defined(MAGICKCORE_TIFF_DELEGATE)
 # if defined(MAGICKCORE_HAVE_TIFFCONF_H)
 #  include "tiffconf.h"
@@ -2323,7 +2323,7 @@
         uint16
           shorty;
 
-        shorty=(uint16) atoi(value);
+        shorty=(uint16) StringToLong(value);
         (void) TIFFSetField(tiff,exif_info[i].tag,shorty);
         break;
       }
@@ -2332,7 +2332,7 @@
         uint16
           longy;
 
-        longy=(uint16) atol(value);
+        longy=(uint16) StringToLong(value);
         (void) TIFFSetField(tiff,exif_info[i].tag,longy);
         break;
       }
@@ -2342,7 +2342,7 @@
         float
           rational;
 
-        rational=atof(value);
+        rational=StringToDouble(value);
         (void) TIFFSetField(tiff,exif_info[i].tag,rational);
         break;
       }
diff --git a/coders/vicar.c b/coders/vicar.c
index 30e17d7..60db5f1 100644
--- a/coders/vicar.c
+++ b/coders/vicar.c
@@ -52,13 +52,14 @@
 #include "magick/list.h"
 #include "magick/magick.h"
 #include "magick/memory_.h"
+#include "magick/module.h"
 #include "magick/monitor.h"
 #include "magick/monitor-private.h"
 #include "magick/quantum-private.h"
 #include "magick/quantum-private.h"
 #include "magick/static.h"
 #include "magick/string_.h"
-#include "magick/module.h"
+#include "magick/string-private.h"
 
 /*
   Forward declarations.
@@ -253,17 +254,17 @@
           Assign a value to the specified keyword.
         */
         if (LocaleCompare(keyword,"Label_RECORDS") == 0)
-          length=(ssize_t) atol(value);
+          length=(ssize_t) StringToLong(value);
         if (LocaleCompare(keyword,"LBLSIZE") == 0)
-          length=(ssize_t) atol(value);
+          length=(ssize_t) StringToLong(value);
         if (LocaleCompare(keyword,"RECORD_BYTES") == 0)
-          image->columns=1UL*atol(value);
+          image->columns=1UL*StringToLong(value);
         if (LocaleCompare(keyword,"NS") == 0)
-          image->columns=1UL*atol(value);
+          image->columns=1UL*StringToLong(value);
         if (LocaleCompare(keyword,"LINES") == 0)
-          image->rows=1UL*atol(value);
+          image->rows=1UL*StringToLong(value);
         if (LocaleCompare(keyword,"NL") == 0)
-          image->rows=1UL*atol(value);
+          image->rows=1UL*StringToLong(value);
       }
     while (isspace((int) ((unsigned char) c)) != 0)
     {
diff --git a/config/configure.xml b/config/configure.xml
index 8138267..7744ee9 100644
--- a/config/configure.xml
+++ b/config/configure.xml
@@ -9,7 +9,7 @@
   <configure name="NAME" value="ImageMagick"/>
   <configure name="LIB_VERSION" value="0x658"/>
   <configure name="LIB_VERSION_NUMBER" value="6,5,8,7"/>
-  <configure name="RELEASE_DATE" value="2009-12-15"/>
+  <configure name="RELEASE_DATE" value="2009-12-17"/>
   <configure name="CONFIGURE" value="./configure "/>
   <configure name="PREFIX" value="/usr/local"/>
   <configure name="EXEC-PREFIX" value="/usr/local"/>
diff --git a/magick/Makefile.am b/magick/Makefile.am
index a6e369d..3fe934a 100644
--- a/magick/Makefile.am
+++ b/magick/Makefile.am
@@ -228,6 +228,7 @@
 	magick/stream-private.h \
 	magick/string.c \
 	magick/string_.h \
+	magick/string-private.h \
 	magick/studio.h \
 	magick/thread.c \
 	magick/thread_.h \
@@ -387,6 +388,7 @@
 	magick/signature-private.h \
 	magick/static.h \
 	magick/stream-private.h \
+	magick/string-private.h \
 	magick/studio.h \
 	magick/thread_.h \
 	magick/thread-private.h \
diff --git a/magick/animate.c b/magick/animate.c
index 031d7ea..1b12255 100644
--- a/magick/animate.c
+++ b/magick/animate.c
@@ -63,6 +63,7 @@
 #include "magick/property.h"
 #include "magick/resource_.h"
 #include "magick/string_.h"
+#include "magick/string-private.h"
 #include "magick/transform.h"
 #include "magick/utility.h"
 #include "magick/version.h"
@@ -2949,7 +2950,7 @@
         quality);
       if (*quality == '\0')
         return(MagickTrue);
-      image->quality=(unsigned long) atol(quality);
+      image->quality=(unsigned long) StringToLong(quality);
       image_info->interlace=status != MagickFalse ?  NoInterlace :
         PlaneInterlace;
     }
diff --git a/magick/blob.c b/magick/blob.c
index 3d60657..7f9e36f 100644
--- a/magick/blob.c
+++ b/magick/blob.c
@@ -58,6 +58,7 @@
 #include "magick/resource_.h"
 #include "magick/semaphore.h"
 #include "magick/string_.h"
+#include "magick/string-private.h"
 #include "magick/utility.h"
 #if defined(MAGICKCORE_HAVE_MMAP_FILEIO) && !defined(__WINDOWS__)
 # include <sys/mman.h>
@@ -2269,7 +2270,7 @@
 
       *mode=(*type);
       mode[1]='\0';
-      image->blob->file=fdopen(atoi(filename+3),mode);
+      image->blob->file=fdopen(StringToLong(filename+3),mode);
 #if defined(__WINDOWS__) || defined(__OS2__)
       if (strchr(type,'b') != (char *) NULL)
         setmode(_fileno(image->blob->file),_O_BINARY);
diff --git a/magick/colorspace.c b/magick/colorspace.c
index 667b9d8..71925a7 100644
--- a/magick/colorspace.c
+++ b/magick/colorspace.c
@@ -60,6 +60,7 @@
 #include "magick/quantize.h"
 #include "magick/quantum.h"
 #include "magick/string_.h"
+#include "magick/string-private.h"
 #include "magick/utility.h"
 
 /*
@@ -577,15 +578,15 @@
       gamma=DisplayGamma;
       value=GetImageProperty(image,"gamma");
       if (value != (const char *) NULL)
-        gamma=1.0/atof(value) != 0.0 ? atof(value) : 1.0;
+        gamma=1.0/StringToDouble(value) != 0.0 ? StringToDouble(value) : 1.0;
       reference_black=ReferenceBlack;
       value=GetImageProperty(image,"reference-black");
       if (value != (const char *) NULL)
-        reference_black=atof(value);
+        reference_black=StringToDouble(value);
       reference_white=ReferenceWhite;
       value=GetImageProperty(image,"reference-white");
       if (value != (const char *) NULL)
-        reference_white=atof(value);
+        reference_white=StringToDouble(value);
       logmap=(Quantum *) AcquireQuantumMemory((size_t) MaxMap+1UL,
         sizeof(*logmap));
       if (logmap == (Quantum *) NULL)
@@ -1783,15 +1784,15 @@
       gamma=DisplayGamma;
       value=GetImageProperty(image,"gamma");
       if (value != (const char *) NULL)
-        gamma=1.0/atof(value) != 0.0 ? atof(value) : 1.0;
+        gamma=1.0/StringToDouble(value) != 0.0 ? StringToDouble(value) : 1.0;
       reference_black=ReferenceBlack;
       value=GetImageProperty(image,"reference-black");
       if (value != (const char *) NULL)
-        reference_black=atof(value);
+        reference_black=StringToDouble(value);
       reference_white=ReferenceWhite;
       value=GetImageProperty(image,"reference-white");
       if (value != (const char *) NULL)
-        reference_white=atof(value);
+        reference_white=StringToDouble(value);
       logmap=(Quantum *) AcquireQuantumMemory((size_t) MaxMap+1UL,
         sizeof(*logmap));
       if (logmap == (Quantum *) NULL)
diff --git a/magick/constitute.c b/magick/constitute.c
index ed8b3fa..3abe5c4 100644
--- a/magick/constitute.c
+++ b/magick/constitute.c
@@ -67,6 +67,7 @@
 #include "magick/statistic.h"
 #include "magick/stream.h"
 #include "magick/string_.h"
+#include "magick/string-private.h"
 #include "magick/timer.h"
 #include "magick/transform.h"
 #include "magick/utility.h"
@@ -644,7 +645,7 @@
       value=GetImageProperty(next,"exif:Orientation");
     if (value != (char *) NULL)
       {
-        next->orientation=(OrientationType) atol(value);
+        next->orientation=(OrientationType) StringToLong(value);
         (void) DeleteImageProperty(next,"tiff:Orientation");
         (void) DeleteImageProperty(next,"exif:Orientation");
       }
@@ -679,7 +680,7 @@
       value=GetImageProperty(next,"exif:ResolutionUnit");
     if (value != (char *) NULL)
       {
-        next->units=(ResolutionType) (atoi(value)-1);
+        next->units=(ResolutionType) (StringToLong(value)-1);
         (void) DeleteImageProperty(next,"exif:ResolutionUnit");
         (void) DeleteImageProperty(next,"tiff:ResolutionUnit");
       }
diff --git a/magick/display.c b/magick/display.c
index 7bb0463..5e1239e 100644
--- a/magick/display.c
+++ b/magick/display.c
@@ -80,6 +80,7 @@
 #include "magick/shear.h"
 #include "magick/segment.h"
 #include "magick/string_.h"
+#include "magick/string-private.h"
 #include "magick/transform.h"
 #include "magick/threshold.h"
 #include "magick/utility.h"
@@ -2098,14 +2099,14 @@
               break;
             if (entry != 8)
               {
-                degrees=atof(RotateMenu[entry]);
+                degrees=StringToDouble(RotateMenu[entry]);
                 break;
               }
             (void) XDialogWidget(display,windows,"OK","Enter rotation angle:",
               angle);
             if (*angle == '\0')
               break;
-            degrees=atof(angle);
+            degrees=StringToDouble(angle);
             break;
           }
           case AnnotateHelpCommand:
@@ -3503,7 +3504,7 @@
               break;
             if (entry != 5)
               {
-                (*image)->fuzz=StringToDouble(FuzzMenu[entry],1.0*QuantumRange+
+                (*image)->fuzz=SiPrefixToDouble(FuzzMenu[entry],1.0*QuantumRange+
                   1.0);
                 break;
               }
@@ -3513,7 +3514,7 @@
             if (*fuzz == '\0')
               break;
             (void) ConcatenateMagickString(fuzz,"%",MaxTextExtent);
-            (*image)->fuzz=StringToDouble(fuzz,1.0*QuantumRange+1.0);
+            (*image)->fuzz=SiPrefixToDouble(fuzz,1.0*QuantumRange+1.0);
             break;
           }
           case ColorEditUndoCommand:
@@ -4026,7 +4027,7 @@
               GXinvert);
             if (*factor == '\0')
               break;
-            blend=atof(factor);
+            blend=StringToDouble(factor);
             compose=DissolveCompositeOp;
             break;
           }
@@ -5711,14 +5712,14 @@
                 break;
               if (entry != 5)
                 {
-                  line_width=(unsigned int) atoi(WidthsMenu[entry]);
+                  line_width=(unsigned int) StringToLong(WidthsMenu[entry]);
                   break;
                 }
               (void) XDialogWidget(display,windows,"Ok","Enter line width:",
                 width);
               if (*width == '\0')
                 break;
-              line_width=(unsigned int) atoi(width);
+              line_width=(unsigned int) StringToLong(width);
               break;
             }
             case DrawUndoCommand:
@@ -6641,7 +6642,7 @@
       last_symbol=key_symbol;
       delta[strlen(delta)+1]='\0';
       delta[strlen(delta)]=Digits[key_symbol-XK_0];
-      resource_info->quantum=atoi(delta);
+      resource_info->quantum=StringToLong(delta);
       return(NullCommand);
     }
   last_symbol=key_symbol;
@@ -7604,7 +7605,7 @@
       (void) XDialogWidget(display,windows,"Trim","Enter fuzz factor:",fuzz);
       if (*fuzz == '\0')
         break;
-      (*image)->fuzz=StringToDouble(fuzz,(double) QuantumRange+1.0);
+      (*image)->fuzz=SiPrefixToDouble(fuzz,(double) QuantumRange+1.0);
       /*
         Trim image.
       */
@@ -7934,7 +7935,7 @@
       */
       XSetCursorState(display,windows,MagickTrue);
       XCheckRefreshWindows(display,windows);
-      quantize_info.number_colors=(unsigned long) atol(colors);
+      quantize_info.number_colors=(unsigned long) StringToLong(colors);
       quantize_info.dither=status != 0 ? MagickTrue : MagickFalse;
       (void) QuantizeImage(&quantize_info,*image);
       XSetCursorState(display,windows,MagickFalse);
@@ -8174,7 +8175,7 @@
       */
       XSetCursorState(display,windows,MagickTrue);
       XCheckRefreshWindows(display,windows);
-      threshold=StringToDouble(factor,QuantumRange);
+      threshold=SiPrefixToDouble(factor,QuantumRange);
       (void) BilevelImage(*image,threshold);
       XSetCursorState(display,windows,MagickFalse);
       if (windows->image.orphan != MagickFalse)
@@ -8373,7 +8374,7 @@
       */
       XSetCursorState(display,windows,MagickTrue);
       XCheckRefreshWindows(display,windows);
-      threshold=StringToDouble(factor,QuantumRange);
+      threshold=SiPrefixToDouble(factor,QuantumRange);
       sepia_image=SepiaToneImage(*image,threshold,&(*image)->exception);
       if (sepia_image != (Image *) NULL)
         {
@@ -8408,7 +8409,7 @@
       */
       XSetCursorState(display,windows,MagickTrue);
       XCheckRefreshWindows(display,windows);
-      threshold=StringToDouble(factor,QuantumRange);
+      threshold=SiPrefixToDouble(factor,QuantumRange);
       (void) SolarizeImage(*image,threshold);
       XSetCursorState(display,windows,MagickFalse);
       if (windows->image.orphan != MagickFalse)
@@ -9076,7 +9077,7 @@
         "Pause how many 1/100ths of a second between images:",delay);
       if (*delay == '\0')
         break;
-      resource_info->delay=(unsigned long) atol(delay);
+      resource_info->delay=(unsigned long) StringToLong(delay);
       XClientMessage(display,windows->image.id,windows->im_protocols,
         windows->im_next_image,CurrentTime);
       break;
@@ -9704,7 +9705,7 @@
               break;
             if (entry != 5)
               {
-                (*image)->fuzz=StringToDouble(FuzzMenu[entry],1.0*QuantumRange+
+                (*image)->fuzz=SiPrefixToDouble(FuzzMenu[entry],1.0*QuantumRange+
                   1.0);
                 break;
               }
@@ -9714,7 +9715,7 @@
             if (*fuzz == '\0')
               break;
             (void) ConcatenateMagickString(fuzz,"%",MaxTextExtent);
-            (*image)->fuzz=StringToDouble(fuzz,1.0*QuantumRange+1.0);
+            (*image)->fuzz=SiPrefixToDouble(fuzz,1.0*QuantumRange+1.0);
             break;
           }
           case MatteEditValueCommand:
@@ -9948,7 +9949,7 @@
             q=GetAuthenticPixels(*image,x_offset,y_offset,1,1,exception);
             if (q == (PixelPacket *) NULL)
               break;
-            q->opacity=(Quantum) atol(matte);
+            q->opacity=(Quantum) StringToLong(matte);
             (void) SyncAuthenticPixels(*image,exception);
             break;
           }
@@ -9971,7 +9972,7 @@
               for (x=0; x < (int) (*image)->columns; x++)
               {
                 if (IsColorSimilar(*image,q,&target))
-                  q->opacity=(Quantum) atol(matte);
+                  q->opacity=(Quantum) StringToLong(matte);
                 q++;
               }
               if (SyncAuthenticPixels(*image,exception) == MagickFalse)
@@ -10004,7 +10005,7 @@
               }
             draw_info=CloneDrawInfo(resource_info->image_info,
               (DrawInfo *) NULL);
-            draw_info->fill.opacity=RoundToQuantum(atof(matte));
+            draw_info->fill.opacity=RoundToQuantum(StringToDouble(matte));
             (void) FloodfillPaintImage(*image,OpacityChannel,draw_info,&target,
               x_offset,y_offset,method == FloodfillMethod ? MagickFalse :
               MagickTrue);
@@ -10025,13 +10026,13 @@
                 break;
               for (x=0; x < (int) (*image)->columns; x++)
               {
-                q->opacity=(Quantum) atol(matte);
+                q->opacity=(Quantum) StringToLong(matte);
                 q++;
               }
               if (SyncAuthenticPixels(*image,exception) == MagickFalse)
                 break;
             }
-            if (atol(matte) == OpaqueOpacity)
+            if (StringToLong(matte) == OpaqueOpacity)
               (*image)->matte=MagickFalse;
             break;
           }
@@ -10162,7 +10163,7 @@
         seconds);
       if (*seconds == '\0')
         return((Image *) NULL);
-      XDelay(display,(unsigned long) (1000*atol(seconds)));
+      XDelay(display,(unsigned long) (1000*StringToLong(seconds)));
     }
   magick_info=GetMagickInfo(image_info->magick,exception);
   if ((magick_info != (const MagickInfo *) NULL) &&
@@ -12396,7 +12397,7 @@
         quality);
       if (*quality == '\0')
         return(MagickTrue);
-      image->quality=(unsigned long) atol(quality);
+      image->quality=(unsigned long) StringToLong(quality);
       image_info->interlace=status != 0 ? NoInterlace : PlaneInterlace;
     }
   if ((LocaleCompare(image_info->magick,"EPS") == 0) ||
diff --git a/magick/distort.c b/magick/distort.c
index 39c7e61..fe32840 100644
--- a/magick/distort.c
+++ b/magick/distort.c
@@ -63,6 +63,7 @@
 #include "magick/registry.h"
 #include "magick/semaphore.h"
 #include "magick/string_.h"
+#include "magick/string-private.h"
 #include "magick/thread-private.h"
 #include "magick/token.h"
 
@@ -1883,7 +1884,7 @@
     artifact=GetImageArtifact(image,"distort:scale");
     output_scaling = 1.0;
     if (artifact != (const char *) NULL) {
-      output_scaling = fabs(atof(artifact));
+      output_scaling = fabs(StringToDouble(artifact));
       geometry.width  *= output_scaling;
       geometry.height *= output_scaling;
       geometry.x      *= output_scaling;
diff --git a/magick/draw.c b/magick/draw.c
index 9458ea4..fb92e97 100644
--- a/magick/draw.c
+++ b/magick/draw.c
@@ -74,6 +74,7 @@
 #include "magick/resample.h"
 #include "magick/resample-private.h"
 #include "magick/string_.h"
+#include "magick/string-private.h"
 #include "magick/thread-private.h"
 #include "magick/token.h"
 #include "magick/transform.h"
@@ -1826,27 +1827,27 @@
         if (LocaleCompare("affine",keyword) == 0)
           {
             GetMagickToken(q,&q,token);
-            affine.sx=atof(token);
+            affine.sx=StringToDouble(token);
             GetMagickToken(q,&q,token);
             if (*token == ',')
               GetMagickToken(q,&q,token);
-            affine.rx=atof(token);
+            affine.rx=StringToDouble(token);
             GetMagickToken(q,&q,token);
             if (*token == ',')
               GetMagickToken(q,&q,token);
-            affine.ry=atof(token);
+            affine.ry=StringToDouble(token);
             GetMagickToken(q,&q,token);
             if (*token == ',')
               GetMagickToken(q,&q,token);
-            affine.sy=atof(token);
+            affine.sy=StringToDouble(token);
             GetMagickToken(q,&q,token);
             if (*token == ',')
               GetMagickToken(q,&q,token);
-            affine.tx=atof(token);
+            affine.tx=StringToDouble(token);
             GetMagickToken(q,&q,token);
             if (*token == ',')
               GetMagickToken(q,&q,token);
-            affine.ty=atof(token);
+            affine.ty=StringToDouble(token);
             break;
           }
         if (LocaleCompare("arc",keyword) == 0)
@@ -2017,7 +2018,7 @@
             GetMagickToken(q,&q,token);
             factor=strchr(token,'%') != (char *) NULL ? 0.01 : 1.0;
             graphic_context[n]->fill.opacity=RoundToQuantum((MagickRealType)
-              QuantumRange*(1.0-factor*atof(token)));
+              QuantumRange*(1.0-factor*StringToDouble(token)));
             break;
           }
         if (LocaleCompare("fill-rule",keyword) == 0)
@@ -2054,7 +2055,7 @@
         if (LocaleCompare("font-size",keyword) == 0)
           {
             GetMagickToken(q,&q,token);
-            graphic_context[n]->pointsize=atof(token);
+            graphic_context[n]->pointsize=StringToDouble(token);
             break;
           }
         if (LocaleCompare("font-stretch",keyword) == 0)
@@ -2090,7 +2091,7 @@
         if (LocaleCompare("font-weight",keyword) == 0)
           {
             GetMagickToken(q,&q,token);
-            graphic_context[n]->weight=(unsigned long) atol(token);
+            graphic_context[n]->weight=(unsigned long) StringToLong(token);
             if (LocaleCompare(token,"all") == 0)
               graphic_context[n]->weight=0;
             if (LocaleCompare(token,"bold") == 0)
@@ -2156,13 +2157,13 @@
         if (LocaleCompare("interline-spacing",keyword) == 0)
           {
             GetMagickToken(q,&q,token);
-            graphic_context[n]->interline_spacing=atof(token);
+            graphic_context[n]->interline_spacing=StringToDouble(token);
             break;
           }
         if (LocaleCompare("interword-spacing",keyword) == 0)
           {
             GetMagickToken(q,&q,token);
-            graphic_context[n]->interword_spacing=atof(token);
+            graphic_context[n]->interword_spacing=StringToDouble(token);
             break;
           }
         status=MagickFalse;
@@ -2174,7 +2175,7 @@
         if (LocaleCompare("kerning",keyword) == 0)
           {
             GetMagickToken(q,&q,token);
-            graphic_context[n]->kerning=atof(token);
+            graphic_context[n]->kerning=StringToDouble(token);
             break;
           }
         status=MagickFalse;
@@ -2216,7 +2217,7 @@
             factor=strchr(token,'%') != (char *) NULL ? 0.01 : 1.0;
             graphic_context[n]->opacity=RoundToQuantum((MagickRealType)
               QuantumRange*(1.0-((1.0-QuantumScale*graphic_context[n]->opacity)*
-              factor*atof(token))));
+              factor*StringToDouble(token))));
             graphic_context[n]->fill.opacity=graphic_context[n]->opacity;
             graphic_context[n]->stroke.opacity=graphic_context[n]->opacity;
             break;
@@ -2322,29 +2323,29 @@
                 GetMagickToken(q,&q,token);
                 (void) CopyMagickString(type,token,MaxTextExtent);
                 GetMagickToken(q,&q,token);
-                segment.x1=atof(token);
-                element.cx=atof(token);
+                segment.x1=StringToDouble(token);
+                element.cx=StringToDouble(token);
                 GetMagickToken(q,&q,token);
                 if (*token == ',')
                   GetMagickToken(q,&q,token);
-                segment.y1=atof(token);
-                element.cy=atof(token);
+                segment.y1=StringToDouble(token);
+                element.cy=StringToDouble(token);
                 GetMagickToken(q,&q,token);
                 if (*token == ',')
                   GetMagickToken(q,&q,token);
-                segment.x2=atof(token);
-                element.major=atof(token);
+                segment.x2=StringToDouble(token);
+                element.major=StringToDouble(token);
                 GetMagickToken(q,&q,token);
                 if (*token == ',')
                   GetMagickToken(q,&q,token);
-                segment.y2=atof(token);
-                element.minor=atof(token);
+                segment.y2=StringToDouble(token);
+                element.minor=StringToDouble(token);
                 if (LocaleCompare(type,"radial") == 0)
                   {
                     GetMagickToken(q,&q,token);
                     if (*token == ',')
                       GetMagickToken(q,&q,token);
-                    element.angle=atof(token);
+                    element.angle=StringToDouble(token);
                   }
                 for (p=q; *q != '\0'; )
                 {
@@ -2388,19 +2389,19 @@
                 GetMagickToken(q,&q,token);
                 (void) CopyMagickString(name,token,MaxTextExtent);
                 GetMagickToken(q,&q,token);
-                bounds.x=(long) (atof(token)+0.5);
+                bounds.x=(long) (StringToDouble(token)+0.5);
                 GetMagickToken(q,&q,token);
                 if (*token == ',')
                   GetMagickToken(q,&q,token);
-                bounds.y=(long) (atof(token)+0.5);
+                bounds.y=(long) (StringToDouble(token)+0.5);
                 GetMagickToken(q,&q,token);
                 if (*token == ',')
                   GetMagickToken(q,&q,token);
-                bounds.width=(unsigned long) (atof(token)+0.5);
+                bounds.width=(unsigned long) (StringToDouble(token)+0.5);
                 GetMagickToken(q,&q,token);
                 if (*token == ',')
                   GetMagickToken(q,&q,token);
-                bounds.height=(unsigned long) (atof(token)+0.5);
+                bounds.height=(unsigned long) (StringToDouble(token)+0.5);
                 for (p=q; *q != '\0'; )
                 {
                   GetMagickToken(q,&q,token);
@@ -2457,7 +2458,7 @@
         if (LocaleCompare("rotate",keyword) == 0)
           {
             GetMagickToken(q,&q,token);
-            angle=atof(token);
+            angle=StringToDouble(token);
             affine.sx=cos(DegreesToRadians(fmod((double) angle,360.0)));
             affine.rx=sin(DegreesToRadians(fmod((double) angle,360.0)));
             affine.ry=(-sin(DegreesToRadians(fmod((double) angle,360.0))));
@@ -2478,24 +2479,24 @@
         if (LocaleCompare("scale",keyword) == 0)
           {
             GetMagickToken(q,&q,token);
-            affine.sx=atof(token);
+            affine.sx=StringToDouble(token);
             GetMagickToken(q,&q,token);
             if (*token == ',')
               GetMagickToken(q,&q,token);
-            affine.sy=atof(token);
+            affine.sy=StringToDouble(token);
             break;
           }
         if (LocaleCompare("skewX",keyword) == 0)
           {
             GetMagickToken(q,&q,token);
-            angle=atof(token);
+            angle=StringToDouble(token);
             affine.ry=sin(DegreesToRadians(angle));
             break;
           }
         if (LocaleCompare("skewY",keyword) == 0)
           {
             GetMagickToken(q,&q,token);
-            angle=atof(token);
+            angle=StringToDouble(token);
             affine.rx=(-tan(DegreesToRadians(angle)/2.0));
             break;
           }
@@ -2543,7 +2544,7 @@
           {
             GetMagickToken(q,&q,token);
             graphic_context[n]->stroke_antialias=
-              atoi(token) != 0 ? MagickTrue : MagickFalse;
+              StringToLong(token) != 0 ? MagickTrue : MagickFalse;
             break;
           }
         if (LocaleCompare("stroke-dasharray",keyword) == 0)
@@ -2581,7 +2582,7 @@
                   GetMagickToken(q,&q,token);
                   if (*token == ',')
                     GetMagickToken(q,&q,token);
-                  graphic_context[n]->dash_pattern[j]=atof(token);
+                  graphic_context[n]->dash_pattern[j]=StringToDouble(token);
                 }
                 if ((x & 0x01) != 0)
                   for ( ; j < (2*x); j++)
@@ -2596,7 +2597,7 @@
         if (LocaleCompare("stroke-dashoffset",keyword) == 0)
           {
             GetMagickToken(q,&q,token);
-            graphic_context[n]->dash_offset=atof(token);
+            graphic_context[n]->dash_offset=StringToDouble(token);
             break;
           }
         if (LocaleCompare("stroke-linecap",keyword) == 0)
@@ -2632,7 +2633,7 @@
         if (LocaleCompare("stroke-miterlimit",keyword) == 0)
           {
             GetMagickToken(q,&q,token);
-            graphic_context[n]->miterlimit=(unsigned long) atol(token);
+            graphic_context[n]->miterlimit=(unsigned long) StringToLong(token);
             break;
           }
         if (LocaleCompare("stroke-opacity",keyword) == 0)
@@ -2640,13 +2641,13 @@
             GetMagickToken(q,&q,token);
             factor=strchr(token,'%') != (char *) NULL ? 0.01 : 1.0;
             graphic_context[n]->stroke.opacity=RoundToQuantum((MagickRealType)
-              QuantumRange*(1.0-factor*atof(token)));
+              QuantumRange*(1.0-factor*StringToDouble(token)));
             break;
           }
         if (LocaleCompare("stroke-width",keyword) == 0)
           {
             GetMagickToken(q,&q,token);
-            graphic_context[n]->stroke_width=atof(token);
+            graphic_context[n]->stroke_width=StringToDouble(token);
             break;
           }
         status=MagickFalse;
@@ -2694,7 +2695,7 @@
           {
             GetMagickToken(q,&q,token);
             graphic_context[n]->text_antialias=
-              atoi(token) != 0 ? MagickTrue : MagickFalse;
+              StringToLong(token) != 0 ? MagickTrue : MagickFalse;
             break;
           }
         if (LocaleCompare("text-undercolor",keyword) == 0)
@@ -2707,11 +2708,11 @@
         if (LocaleCompare("translate",keyword) == 0)
           {
             GetMagickToken(q,&q,token);
-            affine.tx=atof(token);
+            affine.tx=StringToDouble(token);
             GetMagickToken(q,&q,token);
             if (*token == ',')
               GetMagickToken(q,&q,token);
-            affine.ty=atof(token);
+            affine.ty=StringToDouble(token);
             break;
           }
         status=MagickFalse;
@@ -2723,19 +2724,19 @@
         if (LocaleCompare("viewbox",keyword) == 0)
           {
             GetMagickToken(q,&q,token);
-            graphic_context[n]->viewbox.x=(long) (atof(token)+0.5);
+            graphic_context[n]->viewbox.x=(long) (StringToDouble(token)+0.5);
             GetMagickToken(q,&q,token);
             if (*token == ',')
               GetMagickToken(q,&q,token);
-            graphic_context[n]->viewbox.y=(long) (atof(token)+0.5);
+            graphic_context[n]->viewbox.y=(long) (StringToDouble(token)+0.5);
             GetMagickToken(q,&q,token);
             if (*token == ',')
               GetMagickToken(q,&q,token);
-            graphic_context[n]->viewbox.width=(unsigned long) (atof(token)+0.5);
+            graphic_context[n]->viewbox.width=(unsigned long) (StringToDouble(token)+0.5);
             GetMagickToken(q,&q,token);
             if (*token == ',')
               GetMagickToken(q,&q,token);
-            graphic_context[n]->viewbox.height=(unsigned long) (atof(token)+
+            graphic_context[n]->viewbox.height=(unsigned long) (StringToDouble(token)+
               0.5);
             break;
           }
@@ -2784,11 +2785,11 @@
       if (IsPoint(q) == MagickFalse)
         break;
       GetMagickToken(q,&q,token);
-      point.x=atof(token);
+      point.x=StringToDouble(token);
       GetMagickToken(q,&q,token);
       if (*token == ',')
         GetMagickToken(q,&q,token);
-      point.y=atof(token);
+      point.y=StringToDouble(token);
       GetMagickToken(q,(const char **) NULL,token);
       if (*token == ',')
         GetMagickToken(q,&q,token);
@@ -4763,13 +4764,13 @@
     (void) CloneString(&draw_info->encoding,option);
   option=GetImageOption(clone_info,"kerning");
   if (option != (const char *) NULL)
-    draw_info->kerning=atof(option);
+    draw_info->kerning=StringToDouble(option);
   option=GetImageOption(clone_info,"interline-spacing");
   if (option != (const char *) NULL)
-    draw_info->interline_spacing=atof(option);
+    draw_info->interline_spacing=StringToDouble(option);
   option=GetImageOption(clone_info,"interword-spacing");
   if (option != (const char *) NULL)
-    draw_info->interword_spacing=atof(option);
+    draw_info->interword_spacing=StringToDouble(option);
   option=GetImageOption(clone_info,"fill");
   if (option != (const char *) NULL)
     (void) QueryColorDatabase(option,&draw_info->fill,exception);
@@ -4778,7 +4779,7 @@
     (void) QueryColorDatabase(option,&draw_info->stroke,exception);
   option=GetImageOption(clone_info,"strokewidth");
   if (option != (const char *) NULL)
-    draw_info->stroke_width=atof(option);
+    draw_info->stroke_width=StringToDouble(option);
   option=GetImageOption(clone_info,"undercolor");
   if (option != (const char *) NULL)
     (void) QueryColorDatabase(option,&draw_info->undercolor,exception);
@@ -5255,31 +5256,31 @@
           GetMagickToken(p,&p,token);
           if (*token == ',')
             GetMagickToken(p,&p,token);
-          arc.x=atof(token);
+          arc.x=StringToDouble(token);
           GetMagickToken(p,&p,token);
           if (*token == ',')
             GetMagickToken(p,&p,token);
-          arc.y=atof(token);
+          arc.y=StringToDouble(token);
           GetMagickToken(p,&p,token);
           if (*token == ',')
             GetMagickToken(p,&p,token);
-          angle=atof(token);
+          angle=StringToDouble(token);
           GetMagickToken(p,&p,token);
           if (*token == ',')
             GetMagickToken(p,&p,token);
-          large_arc=atoi(token) != 0 ? MagickTrue : MagickFalse;
+          large_arc=StringToLong(token) != 0 ? MagickTrue : MagickFalse;
           GetMagickToken(p,&p,token);
           if (*token == ',')
             GetMagickToken(p,&p,token);
-          sweep=atoi(token) != 0 ? MagickTrue : MagickFalse;
+          sweep=StringToLong(token) != 0 ? MagickTrue : MagickFalse;
           GetMagickToken(p,&p,token);
           if (*token == ',')
             GetMagickToken(p,&p,token);
-          x=atof(token);
+          x=StringToDouble(token);
           GetMagickToken(p,&p,token);
           if (*token == ',')
             GetMagickToken(p,&p,token);
-          y=atof(token);
+          y=StringToDouble(token);
           end.x=(double) (attribute == (int) 'A' ? x : point.x+x);
           end.y=(double) (attribute == (int) 'A' ? y : point.y+y);
           TraceArcPath(q,point,end,arc,angle,large_arc,sweep);
@@ -5302,11 +5303,11 @@
             GetMagickToken(p,&p,token);
             if (*token == ',')
               GetMagickToken(p,&p,token);
-            x=atof(token);
+            x=StringToDouble(token);
             GetMagickToken(p,&p,token);
             if (*token == ',')
               GetMagickToken(p,&p,token);
-            y=atof(token);
+            y=StringToDouble(token);
             end.x=(double) (attribute == (int) 'C' ? x : point.x+x);
             end.y=(double) (attribute == (int) 'C' ? y : point.y+y);
             points[i]=end;
@@ -5327,7 +5328,7 @@
           GetMagickToken(p,&p,token);
           if (*token == ',')
             GetMagickToken(p,&p,token);
-          x=atof(token);
+          x=StringToDouble(token);
           point.x=(double) (attribute == (int) 'H' ? x: point.x+x);
           TracePoint(q,point);
           q+=q->coordinates;
@@ -5342,11 +5343,11 @@
           GetMagickToken(p,&p,token);
           if (*token == ',')
             GetMagickToken(p,&p,token);
-          x=atof(token);
+          x=StringToDouble(token);
           GetMagickToken(p,&p,token);
           if (*token == ',')
             GetMagickToken(p,&p,token);
-          y=atof(token);
+          y=StringToDouble(token);
           point.x=(double) (attribute == (int) 'L' ? x : point.x+x);
           point.y=(double) (attribute == (int) 'L' ? y : point.y+y);
           TracePoint(q,point);
@@ -5369,11 +5370,11 @@
           GetMagickToken(p,&p,token);
           if (*token == ',')
             GetMagickToken(p,&p,token);
-          x=atof(token);
+          x=StringToDouble(token);
           GetMagickToken(p,&p,token);
           if (*token == ',')
             GetMagickToken(p,&p,token);
-          y=atof(token);
+          y=StringToDouble(token);
           point.x=(double) (attribute == (int) 'M' ? x : point.x+x);
           point.y=(double) (attribute == (int) 'M' ? y : point.y+y);
           if (i == 0)
@@ -5403,11 +5404,11 @@
             GetMagickToken(p,&p,token);
             if (*token == ',')
               GetMagickToken(p,&p,token);
-            x=atof(token);
+            x=StringToDouble(token);
             GetMagickToken(p,&p,token);
             if (*token == ',')
               GetMagickToken(p,&p,token);
-            y=atof(token);
+            y=StringToDouble(token);
             if (*p == ',')
               p++;
             end.x=(double) (attribute == (int) 'Q' ? x : point.x+x);
@@ -5438,11 +5439,11 @@
             GetMagickToken(p,&p,token);
             if (*token == ',')
               GetMagickToken(p,&p,token);
-            x=atof(token);
+            x=StringToDouble(token);
             GetMagickToken(p,&p,token);
             if (*token == ',')
               GetMagickToken(p,&p,token);
-            y=atof(token);
+            y=StringToDouble(token);
             if (*p == ',')
               p++;
             end.x=(double) (attribute == (int) 'S' ? x : point.x+x);
@@ -5478,11 +5479,11 @@
             GetMagickToken(p,&p,token);
             if (*token == ',')
               GetMagickToken(p,&p,token);
-            x=atof(token);
+            x=StringToDouble(token);
             GetMagickToken(p,&p,token);
             if (*token == ',')
               GetMagickToken(p,&p,token);
-            y=atof(token);
+            y=StringToDouble(token);
             end.x=(double) (attribute == (int) 'T' ? x : point.x+x);
             end.y=(double) (attribute == (int) 'T' ? y : point.y+y);
             points[i]=end;
@@ -5508,7 +5509,7 @@
           GetMagickToken(p,&p,token);
           if (*token == ',')
             GetMagickToken(p,&p,token);
-          y=atof(token);
+          y=StringToDouble(token);
           point.y=(double) (attribute == (int) 'V' ? y : point.y+y);
           TracePoint(q,point);
           q+=q->coordinates;
diff --git a/magick/enhance.c b/magick/enhance.c
index 4009edd..ef143ae 100644
--- a/magick/enhance.c
+++ b/magick/enhance.c
@@ -66,6 +66,7 @@
 #include "magick/resample-private.h"
 #include "magick/statistic.h"
 #include "magick/string_.h"
+#include "magick/string-private.h"
 #include "magick/thread-private.h"
 #include "magick/token.h"
 #include "magick/xml-tree.h"
@@ -371,9 +372,9 @@
               GetMagickToken(p,&p,token);
             switch (i)
             {
-              case 0: color_correction.red.slope=atof(token); break;
-              case 1: color_correction.green.slope=atof(token); break;
-              case 2: color_correction.blue.slope=atof(token); break;
+              case 0: color_correction.red.slope=StringToDouble(token); break;
+              case 1: color_correction.green.slope=StringToDouble(token); break;
+              case 2: color_correction.blue.slope=StringToDouble(token); break;
             }
           }
         }
@@ -389,9 +390,9 @@
               GetMagickToken(p,&p,token);
             switch (i)
             {
-              case 0: color_correction.red.offset=atof(token); break;
-              case 1: color_correction.green.offset=atof(token); break;
-              case 2: color_correction.blue.offset=atof(token); break;
+              case 0: color_correction.red.offset=StringToDouble(token); break;
+              case 1: color_correction.green.offset=StringToDouble(token); break;
+              case 2: color_correction.blue.offset=StringToDouble(token); break;
             }
           }
         }
@@ -407,9 +408,9 @@
               GetMagickToken(p,&p,token);
             switch (i)
             {
-              case 0: color_correction.red.power=atof(token); break;
-              case 1: color_correction.green.power=atof(token); break;
-              case 2: color_correction.blue.power=atof(token); break;
+              case 0: color_correction.red.power=StringToDouble(token); break;
+              case 1: color_correction.green.power=StringToDouble(token); break;
+              case 2: color_correction.blue.power=StringToDouble(token); break;
             }
           }
         }
@@ -426,7 +427,7 @@
           content=GetXMLTreeContent(saturation);
           p=(const char *) content;
           GetMagickToken(p,&p,token);
-          color_correction.saturation=atof(token);
+          color_correction.saturation=StringToDouble(token);
         }
     }
   ccc=DestroyXMLTree(ccc);
diff --git a/magick/fx.c b/magick/fx.c
index 4cf1778..3dcc822 100644
--- a/magick/fx.c
+++ b/magick/fx.c
@@ -80,6 +80,7 @@
 #include "magick/splay-tree.h"
 #include "magick/statistic.h"
 #include "magick/string_.h"
+#include "magick/string-private.h"
 #include "magick/thread-private.h"
 #include "magick/transform.h"
 #include "magick/utility.h"
@@ -327,7 +328,7 @@
   attenuate=1.0;
   option=GetImageArtifact(image,"attenuate");
   if (option != (char *) NULL)
-    attenuate=atof(option);
+    attenuate=StringToDouble(option);
   status=MagickTrue;
   progress=0;
   random_info=AcquireRandomInfoThreadSet();
@@ -1474,7 +1475,7 @@
     symbol);
   value=(const char *) GetValueFromSplayTree(fx_info->symbols,key);
   if (value != (const char *) NULL)
-    return(QuantumScale*atof(value));
+    return(QuantumScale*StringToDouble(value));
   (void) DeleteNodeFromSplayTree(fx_info->symbols,key);
   if (LocaleNCompare(symbol,"depth",5) == 0)
     {
@@ -1545,7 +1546,7 @@
     }
   (void) AddValueToSplayTree(fx_info->symbols,ConstantString(key),
     ConstantString(statistic));
-  return(QuantumScale*atof(statistic));
+  return(QuantumScale*StringToDouble(statistic));
 }
 
 static MagickRealType
@@ -2147,7 +2148,7 @@
   }
   value=(const char *) GetValueFromSplayTree(fx_info->symbols,symbol);
   if (value != (const char *) NULL)
-    return((MagickRealType) atof(value));
+    return((MagickRealType) StringToDouble(value));
   (void) ThrowMagickException(exception,GetMagickModule(),OptionError,
     "UnableToParseExpression","`%s'",symbol);
   return(0.0);
diff --git a/magick/geometry.c b/magick/geometry.c
index 549c618..0f9a16c 100644
--- a/magick/geometry.c
+++ b/magick/geometry.c
@@ -47,6 +47,7 @@
 #include "magick/geometry.h"
 #include "magick/memory_.h"
 #include "magick/string_.h"
+#include "magick/string-private.h"
 #include "magick/token.h"
 
 /*
@@ -655,12 +656,12 @@
       GetMagickToken(p,&p,token);
     switch (i)
     {
-      case 0: affine_matrix->sx=atof(token); break;
-      case 1: affine_matrix->rx=atof(token); break;
-      case 2: affine_matrix->ry=atof(token); break;
-      case 3: affine_matrix->sy=atof(token); break;
-      case 4: affine_matrix->tx=atof(token); flags|=XValue; break;
-      case 5: affine_matrix->ty=atof(token); flags|=YValue; break;
+      case 0: affine_matrix->sx=StringToDouble(token); break;
+      case 1: affine_matrix->rx=StringToDouble(token); break;
+      case 2: affine_matrix->ry=StringToDouble(token); break;
+      case 3: affine_matrix->sy=StringToDouble(token); break;
+      case 4: affine_matrix->tx=StringToDouble(token); flags|=XValue; break;
+      case 5: affine_matrix->ty=StringToDouble(token); flags|=YValue; break;
     }
   }
   determinant=(affine_matrix->sx*affine_matrix->sy-affine_matrix->rx*
diff --git a/magick/image.c b/magick/image.c
index e2cbfac..0158636 100644
--- a/magick/image.c
+++ b/magick/image.c
@@ -87,6 +87,7 @@
 #include "magick/signature-private.h"
 #include "magick/statistic.h"
 #include "magick/string_.h"
+#include "magick/string-private.h"
 #include "magick/thread-private.h"
 #include "magick/threshold.h"
 #include "magick/timer.h"
@@ -3095,7 +3096,7 @@
             last;
 
           (void) CloneString(&image_info->scenes,subimage);
-          image_info->scene=(unsigned long) atol(image_info->scenes);
+          image_info->scene=(unsigned long) StringToLong(image_info->scenes);
           image_info->number_scenes=image_info->scene;
           p=image_info->scenes;
           for (q=(char *) image_info->scenes; *q != '\0'; p++)
@@ -3956,7 +3957,7 @@
       &image->exception);
   option=GetImageOption(image_info,"bias");
   if (option != (const char *) NULL)
-    image->bias=StringToDouble(option,QuantumRange);
+    image->bias=SiPrefixToDouble(option,QuantumRange);
   option=GetImageOption(image_info,"black-point-compensation");
   if (option != (const char *) NULL)
     image->black_point_compensation=(MagickBooleanType) ParseMagickOption(
@@ -3975,7 +3976,7 @@
     (void) QueryColorDatabase(option,&image->border_color,&image->exception);
   option=GetImageOption(image_info,"colors");
   if (option != (const char *) NULL)
-    image->colors=(unsigned long) atol(option);
+    image->colors=(unsigned long) StringToLong(option);
   option=GetImageOption(image_info,"compose");
   if (option != (const char *) NULL)
     image->compose=(CompositeOperator) ParseMagickOption(MagickComposeOptions,
@@ -4028,7 +4029,7 @@
     }
   option=GetImageOption(image_info,"depth");
   if (option != (const char *) NULL)
-    image->depth=(unsigned long) atol(option);
+    image->depth=(unsigned long) StringToLong(option);
   option=GetImageOption(image_info,"dispose");
   if (option != (const char *) NULL)
     image->dispose=(DisposeType) ParseMagickOption(MagickDisposeOptions,
@@ -4045,7 +4046,7 @@
       MagickFalse,option);
   option=GetImageOption(image_info,"fuzz");
   if (option != (const char *) NULL)
-    image->fuzz=StringToDouble(option,QuantumRange);
+    image->fuzz=SiPrefixToDouble(option,QuantumRange);
   option=GetImageOption(image_info,"gravity");
   if (option != (const char *) NULL)
     image->gravity=(GravityType) ParseMagickOption(MagickGravityOptions,
@@ -4073,7 +4074,7 @@
       MagickInterpolateOptions,MagickFalse,option);
   option=GetImageOption(image_info,"loop");
   if (option != (const char *) NULL)
-    image->iterations=(unsigned long) atol(option);
+    image->iterations=(unsigned long) StringToLong(option);
   option=GetImageOption(image_info,"mattecolor");
   if (option != (const char *) NULL)
     (void) QueryColorDatabase(option,&image->matte_color,&image->exception);
@@ -4083,7 +4084,7 @@
       MagickOrientationOptions,MagickFalse,option);
   option=GetImageOption(image_info,"quality");
   if (option != (const char *) NULL)
-    image->quality=(unsigned long) atol(option);
+    image->quality=(unsigned long) StringToLong(option);
   option=GetImageOption(image_info,"page");
   if (option != (const char *) NULL)
     {
@@ -4107,7 +4108,7 @@
     image->quality=image_info->quality;
   option=GetImageOption(image_info,"scene");
   if (option != (const char *) NULL)
-    image->scene=(unsigned long) atol(option);
+    image->scene=(unsigned long) StringToLong(option);
   option=GetImageOption(image_info,"taint");
   if (option != (const char *) NULL)
     image->taint=(MagickBooleanType) ParseMagickOption(MagickBooleanOptions,
diff --git a/magick/log.c b/magick/log.c
index 6b17249..347bb87 100644
--- a/magick/log.c
+++ b/magick/log.c
@@ -52,6 +52,7 @@
 #include "magick/semaphore.h"
 #include "magick/timer.h"
 #include "magick/string_.h"
+#include "magick/string-private.h"
 #include "magick/token.h"
 #include "magick/thread_.h"
 #include "magick/thread-private.h"
@@ -1447,7 +1448,7 @@
                 log_info->generations=(~0UL);
                 break;
               }
-            log_info->generations=(unsigned long) atol(token);
+            log_info->generations=(unsigned long) StringToLong(token);
             break;
           }
         break;
@@ -1462,7 +1463,7 @@
                 log_info->limit=(~0UL);
                 break;
               }
-            log_info->limit=(unsigned long) atol(token);
+            log_info->limit=(unsigned long) StringToLong(token);
             break;
           }
         break;
diff --git a/magick/magic.c b/magick/magic.c
index 25b1bff..34263ae 100644
--- a/magick/magic.c
+++ b/magick/magic.c
@@ -49,6 +49,7 @@
 #include "magick/memory_.h"
 #include "magick/semaphore.h"
 #include "magick/string_.h"
+#include "magick/string-private.h"
 #include "magick/token.h"
 #include "magick/utility.h"
 #include "magick/xml-tree.h"
@@ -804,7 +805,7 @@
       {
         if (LocaleCompare((char *) keyword,"offset") == 0)
           {
-            magic_info->offset=(MagickOffsetType) atol(token);
+            magic_info->offset=(MagickOffsetType) StringToLong(token);
             break;
           }
         break;
diff --git a/magick/methods.h b/magick/methods.h
index 588f2ff..b01ee72 100644
--- a/magick/methods.h
+++ b/magick/methods.h
@@ -1136,7 +1136,7 @@
 #define StringInfoToHexString  PrependMagickMethod(StringInfoToHexString)
 #define StringInfoToString  PrependMagickMethod(StringInfoToString)
 #define StringToArgv  PrependMagickMethod(StringToArgv)
-#define StringToDouble  PrependMagickMethod(StringToDouble)
+#define SiPrefixToDouble  PrependMagickMethod(SiPrefixToDouble)
 #define StringToken  PrependMagickMethod(StringToken)
 #define StringToList  PrependMagickMethod(StringToList)
 #define StringToStringInfo  PrependMagickMethod(StringToStringInfo)
diff --git a/magick/property.c b/magick/property.c
index 49d4f2e..3929e9c 100644
--- a/magick/property.c
+++ b/magick/property.c
@@ -71,6 +71,7 @@
 #include "magick/signature-private.h"
 #include "magick/statistic.h"
 #include "magick/string_.h"
+#include "magick/string-private.h"
 #include "magick/token.h"
 #include "magick/utility.h"
 #include "magick/xml-tree.h"
@@ -574,7 +575,7 @@
     *name='\0';
   sub_number=1;
   if (*name == '#')
-    sub_number=atol(&name[1]);
+    sub_number=StringToLong(&name[1]);
   sub_number=MagickMax(sub_number,1L);
   resource=(char *) NULL;
   status=MagickFalse;
@@ -3265,7 +3266,7 @@
     {
       if (LocaleCompare(property,"bias") == 0)
         {
-          image->bias=StringToDouble(value,QuantumRange);
+          image->bias=SiPrefixToDouble(value,QuantumRange);
           break;
         }
       status=AddValueToSplayTree((SplayTreeInfo *) image->properties,
@@ -3342,7 +3343,7 @@
         }
       if (LocaleCompare(property,"depth") == 0)
         {
-          image->depth=(unsigned long) atol(value);
+          image->depth=(unsigned long) StringToLong(value);
           break;
         }
       if (LocaleCompare(property,"dispose") == 0)
@@ -3414,7 +3415,7 @@
     {
       if (LocaleCompare(property,"loop") == 0)
         {
-          image->iterations=(unsigned long) atol(value);
+          image->iterations=(unsigned long) StringToLong(value);
           break;
         }
       status=AddValueToSplayTree((SplayTreeInfo *) image->properties,
diff --git a/magick/quantum.c b/magick/quantum.c
index 32fedc5..8792224 100644
--- a/magick/quantum.c
+++ b/magick/quantum.c
@@ -63,6 +63,7 @@
 #include "magick/statistic.h"
 #include "magick/stream.h"
 #include "magick/string_.h"
+#include "magick/string-private.h"
 #include "magick/thread-private.h"
 #include "magick/utility.h"
 
@@ -361,10 +362,10 @@
       MagickQuantumFormatOptions,MagickFalse,option);
   option=GetImageOption(image_info,"quantum:minimum");
   if (option != (char *) NULL)
-    quantum_info->minimum=atof(option);
+    quantum_info->minimum=StringToDouble(option);
   option=GetImageOption(image_info,"quantum:maximum");
   if (option != (char *) NULL)
-    quantum_info->maximum=atof(option);
+    quantum_info->maximum=StringToDouble(option);
   if ((quantum_info->minimum == 0.0) && (quantum_info->maximum == 0.0))
     quantum_info->scale=0.0;
   else
@@ -378,7 +379,7 @@
         quantum_info->minimum);
   option=GetImageOption(image_info,"quantum:scale");
   if (option != (char *) NULL)
-    quantum_info->scale=atof(option);
+    quantum_info->scale=StringToDouble(option);
   option=GetImageOption(image_info,"quantum:polarity");
   if (option != (char *) NULL)
     quantum_info->min_is_white=LocaleCompare(option,"min-is-white") == 0 ?
diff --git a/magick/resize.c b/magick/resize.c
index 8f4d19f..d2bf41d 100644
--- a/magick/resize.c
+++ b/magick/resize.c
@@ -64,6 +64,7 @@
 #include "magick/resize.h"
 #include "magick/resize-private.h"
 #include "magick/string_.h"
+#include "magick/string-private.h"
 #include "magick/thread-private.h"
 #include "magick/utility.h"
 #include "magick/version.h"
@@ -596,7 +597,7 @@
   resize_filter->blur = blur;
   artifact=GetImageArtifact(image,"filter:blur");
   if (artifact != (const char *) NULL)
-    resize_filter->blur = atof(artifact);
+    resize_filter->blur = StringToDouble(artifact);
   if ( resize_filter->blur < MagickEpsilon )
     resize_filter->blur = (MagickRealType) MagickEpsilon;
 
@@ -676,7 +677,7 @@
   /* Filter support overrides */
   artifact=GetImageArtifact(image,"filter:lobes");
   if (artifact != (const char *) NULL) {
-    long lobes = atol(artifact);
+    long lobes = StringToLong(artifact);
     if ( lobes < 1  ) lobes = 1;
     resize_filter->support = (MagickRealType) lobes;
     if ( filter_type == BesselFilter ) {
@@ -686,7 +687,7 @@
   }
   artifact=GetImageArtifact(image,"filter:support");
   if (artifact != (const char *) NULL)
-    resize_filter->support = fabs(atof(artifact));
+    resize_filter->support = fabs(StringToDouble(artifact));
 
   /* Scale windowing function separatally to the support 'clipping' window
      that calling operator is planning to actually use. - Expert Use Only
@@ -694,7 +695,7 @@
   resize_filter->window_support = resize_filter->support;
   artifact=GetImageArtifact(image,"filter:win-support");
   if (artifact != (const char *) NULL)
-    resize_filter->window_support = fabs(atof(artifact));
+    resize_filter->window_support = fabs(StringToDouble(artifact));
 
   /* Set Cubic Spline B,C values, calculate Cubic coefficents */
   B=0.0;
@@ -711,16 +712,16 @@
     }
     artifact=GetImageArtifact(image,"filter:b");
     if (artifact != (const char *) NULL) {
-      B=atof(artifact);
+      B=StringToDouble(artifact);
       C=(1.0-B)/2.0; /* Calculate C as if it is a Keys cubic filter */
       artifact=GetImageArtifact(image,"filter:c");
       if (artifact != (const char *) NULL)
-        C=atof(artifact);
+        C=StringToDouble(artifact);
     }
     else {
       artifact=GetImageArtifact(image,"filter:c");
       if (artifact != (const char *) NULL) {
-        C=atof(artifact);
+        C=StringToDouble(artifact);
         B=1.0-2.0*C;  /* Calculate B as if it is a Keys cubic filter */
       }
     }
diff --git a/magick/resource.c b/magick/resource.c
index f38ba10..ca4f731 100644
--- a/magick/resource.c
+++ b/magick/resource.c
@@ -56,6 +56,7 @@
 #include "magick/semaphore.h"
 #include "magick/signature-private.h"
 #include "magick/string_.h"
+#include "magick/string-private.h"
 #include "magick/splay-tree.h"
 #include "magick/thread-private.h"
 #include "magick/token.h"
@@ -886,7 +887,7 @@
   double
     value;
 
-  value=StringToDouble(string,interval);
+  value=SiPrefixToDouble(string,interval);
   if (value >= (double) MagickULLConstant(~0))
     return(MagickULLConstant(~0));
   return((MagickSizeType) value);
@@ -992,7 +993,7 @@
     limit=GetPolicyValue("thread");
   if (limit != (char *) NULL)
     {
-      SetOpenMPMaximumThreads((unsigned long) atol(limit));
+      SetOpenMPMaximumThreads((unsigned long) StringToLong(limit));
       (void) SetMagickResourceLimit(ThreadResource,StringToSizeType(limit,
         100.0));
       limit=DestroyString(limit);
diff --git a/magick/shear.c b/magick/shear.c
index 705a26c..23355c7 100644
--- a/magick/shear.c
+++ b/magick/shear.c
@@ -72,6 +72,8 @@
 #include "magick/resource_.h"
 #include "magick/shear.h"
 #include "magick/statistic.h"
+#include "magick/string_.h"
+#include "magick/string-private.h"
 #include "magick/threshold.h"
 #include "magick/transform.h"
 
@@ -959,7 +961,7 @@
   /*
     Auto-crop image.
   */
-  GetImageBackgroundColor(clone_image,atol(artifact),exception);
+  GetImageBackgroundColor(clone_image,StringToLong(artifact),exception);
   deskew_image=AffineTransformImage(clone_image,&affine_matrix,exception);
   clone_image=DestroyImage(clone_image);
   if (deskew_image == (Image *) NULL)
diff --git a/magick/string-private.h b/magick/string-private.h
new file mode 100644
index 0000000..1449176
--- /dev/null
+++ b/magick/string-private.h
@@ -0,0 +1,69 @@
+/*
+  Copyright 1999-2010 ImageMagick Studio LLC, a non-profit organization
+  dedicated to making software imaging solutions freely available.
+  
+  You may not use this file except in compliance with the License.
+  obtain a copy of the License at
+  
+    http://www.imagemagick.org/script/license.php
+  
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+  MagickCore private string methods.
+*/
+#ifndef _MAGICKCORE_STRING_PRIVATE_H
+#define _MAGICKCORE_STRING_PRIVATE_H
+
+#if defined(__cplusplus) || defined(c_plusplus)
+extern "C" {
+#endif
+
+static inline double SiPrefixToDouble(const char *string,const double interval)
+{
+  char
+    *q;
+
+  double
+    scale,
+    value;
+
+  assert(string != (char *) NULL);
+  value=strtod(string,&q);
+  scale=1000.0;
+  if ((*q != '\0') && (tolower((int) ((unsigned char) *(q+1))) == 'i'))
+    scale=1024.0;
+  switch (tolower((int) ((unsigned char) *q)))
+  {
+    case '%': value*=pow(scale,0)*interval/100.0; break;
+    case 'k': value*=pow(scale,1); break;
+    case 'm': value*=pow(scale,2); break;
+    case 'g': value*=pow(scale,3); break;
+    case 't': value*=pow(scale,4); break;
+    case 'p': value*=pow(scale,5); break;
+    case 'e': value*=pow(scale,6); break;
+    case 'z': value*=pow(scale,7); break;
+    case 'y': value*=pow(scale,8); break;
+    default:  break;
+  }
+  return(value);
+}
+
+static inline double StringToDouble(const char *value)
+{
+  return(strtod(value,(char **) NULL));
+}
+
+static inline long StringToLong(const char *value)
+{
+  return(strtol(value,(char **) NULL,10));
+}
+
+#if defined(__cplusplus) || defined(c_plusplus)
+}
+#endif
+
+#endif
diff --git a/magick/string.c b/magick/string.c
index 98df848..5851a4b 100644
--- a/magick/string.c
+++ b/magick/string.c
@@ -1967,61 +1967,6 @@
 %                                                                             %
 %                                                                             %
 %                                                                             %
-%  S t r i n g T o D o u b l e                                                %
-%                                                                             %
-%                                                                             %
-%                                                                             %
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%
-%  StringToDouble() converts a text string to a double.  If the string contains
-%  a percent sign (e.g. 50%) that percentage of the interval is returned.
-%
-%  The format of the StringToDouble method is:
-%
-%      double StringToDouble(const char *string,const double interval)
-%
-%  A description of each parameter follows:
-%
-%    o string:  Specifies the string representing a value.
-%
-%    o interval:  Specifies the interval; used for obtaining a percentage.
-%
-*/
-MagickExport double StringToDouble(const char *string,const double interval)
-{
-  char
-    *q;
-
-  double
-    scale,
-    value;
-
-  assert(string != (char *) NULL);
-  value=strtod(string,&q);
-  scale=1000.0;
-  if ((*q != '\0') && (tolower((int) ((unsigned char) *(q+1))) == 'i'))
-    scale=1024.0;
-  switch (tolower((int) ((unsigned char) *q)))
-  {
-    case '%': value*=pow(scale,0)*interval/100.0; break;
-    case 'k': value*=pow(scale,1); break;
-    case 'm': value*=pow(scale,2); break;
-    case 'g': value*=pow(scale,3); break;
-    case 't': value*=pow(scale,4); break;
-    case 'p': value*=pow(scale,5); break;
-    case 'e': value*=pow(scale,6); break;
-    case 'z': value*=pow(scale,7); break;
-    case 'y': value*=pow(scale,8); break;
-    default:  break;
-  }
-  return(value);
-}
-
-/*
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%                                                                             %
-%                                                                             %
-%                                                                             %
 %   S t r i n g I n f o T o H e x S t r i n g                                 %
 %                                                                             %
 %                                                                             %
diff --git a/magick/string_.h b/magick/string_.h
index d98c4e3..1b978f1 100644
--- a/magick/string_.h
+++ b/magick/string_.h
@@ -59,9 +59,6 @@
 extern MagickExport const char
   *GetStringInfoPath(const StringInfo *);
 
-extern MagickExport double
-  StringToDouble(const char *,const double);
-
 extern MagickExport long
   FormatMagickSize(const MagickSizeType,const MagickBooleanType,char *),
   FormatMagickString(char *,const size_t,const char *,...)
diff --git a/magick/threshold.c b/magick/threshold.c
index 7f149ee..98d89be 100644
--- a/magick/threshold.c
+++ b/magick/threshold.c
@@ -65,6 +65,7 @@
 #include "magick/monitor.h"
 #include "magick/monitor-private.h"
 #include "magick/montage.h"
+#include "magick/option.h"
 #include "magick/pixel-private.h"
 #include "magick/quantize.h"
 #include "magick/quantum.h"
@@ -76,9 +77,9 @@
 #include "magick/shear.h"
 #include "magick/signature-private.h"
 #include "magick/string_.h"
+#include "magick/string-private.h"
 #include "magick/transform.h"
 #include "magick/threshold.h"
-#include "magick/option.h"
 #include "magick/xml-tree.h"
 
 /*
@@ -947,7 +948,7 @@
     map = DestroyThresholdMap(map);
     return(map);
   }
-  map->width = (unsigned long) atoi(attr);
+  map->width = (unsigned long) StringToLong(attr);
   if ( map->width == 0 ) {
     (void) ThrowMagickException(exception,GetMagickModule(),OptionError,
      "XmlInvalidAttribute", "<levels width>, map \"%s\"", map_id);
@@ -964,7 +965,7 @@
     map = DestroyThresholdMap(map);
     return(map);
   }
-  map->height = (unsigned long) atoi(attr);
+  map->height = (unsigned long) StringToLong(attr);
   if ( map->height == 0 ) {
     (void) ThrowMagickException(exception,GetMagickModule(),OptionError,
       "XmlInvalidAttribute", "<levels height>, map \"%s\"", map_id);
@@ -981,7 +982,7 @@
     map = DestroyThresholdMap(map);
     return(map);
   }
-  map->divisor = atoi(attr);
+  map->divisor = StringToLong(attr);
   if ( map->divisor < 2 ) {
     (void) ThrowMagickException(exception,GetMagickModule(),OptionError,
       "XmlInvalidAttribute", "<levels divisor>, map \"%s\"", map_id);
diff --git a/magick/type.c b/magick/type.c
index a79ed24..8940a5f 100644
--- a/magick/type.c
+++ b/magick/type.c
@@ -53,6 +53,7 @@
 #include "magick/semaphore.h"
 #include "magick/splay-tree.h"
 #include "magick/string_.h"
+#include "magick/string-private.h"
 #include "magick/type.h"
 #include "magick/token.h"
 #include "magick/utility.h"
@@ -1102,7 +1103,7 @@
       {
         if (LocaleCompare((char *) keyword,"face") == 0)
           {
-            type_info->face=(unsigned long) atol(token);
+            type_info->face=(unsigned long) StringToLong(token);
             break;
           }
         if (LocaleCompare((char *) keyword,"family") == 0)
@@ -1224,7 +1225,7 @@
       {
         if (LocaleCompare((char *) keyword,"weight") == 0)
           {
-            type_info->weight=(unsigned long) atol(token);
+            type_info->weight=(unsigned long) StringToLong(token);
             if (LocaleCompare(token,"bold") == 0)
               type_info->weight=700;
             if (LocaleCompare(token,"normal") == 0)
diff --git a/magick/xml-tree.c b/magick/xml-tree.c
index a9b6fd9..169f382 100644
--- a/magick/xml-tree.c
+++ b/magick/xml-tree.c
@@ -55,6 +55,7 @@
 #include "magick/memory_.h"
 #include "magick/semaphore.h"
 #include "magick/string_.h"
+#include "magick/string-private.h"
 #include "magick/xml-tree.h"
 #include "magick/utility.h"
 
@@ -244,7 +245,7 @@
     node=child;
     if (node == (XMLTreeInfo *) NULL)
       break;
-    for (j=atol(subnode)-1; j > 0; j--)
+    for (j=StringToLong(subnode)-1; j > 0; j--)
     {
       node=GetXMLTreeOrdered(node);
       if (node == (XMLTreeInfo *) NULL)
@@ -875,7 +876,7 @@
     node=GetXMLTreeChild(node,tag);
     if (node == (XMLTreeInfo *) NULL)
       break;
-    for (j=atol(subnode)-1; j > 0; j--)
+    for (j=StringToLong(subnode)-1; j > 0; j--)
     {
       node=GetXMLTreeOrdered(node);
       if (node == (XMLTreeInfo *) NULL)
diff --git a/magick/xwindow.c b/magick/xwindow.c
index a7b9aa6..9d56d79 100644
--- a/magick/xwindow.c
+++ b/magick/xwindow.c
@@ -71,6 +71,7 @@
 #include "magick/shear.h"
 #include "magick/statistic.h"
 #include "magick/string_.h"
+#include "magick/string-private.h"
 #include "magick/transform.h"
 #include "magick/utility.h"
 #include "magick/widget.h"
@@ -3464,7 +3465,7 @@
     "borderColor",BorderColor);
   resource_value=XGetResourceClass(database,client_name,"borderWidth",
     (char *) "2");
-  resource_info->border_width=(unsigned int) atoi(resource_value);
+  resource_info->border_width=(unsigned int) StringToLong(resource_value);
   resource_value=XGetResourceClass(database,client_name,"colormap",
     (char *) "shared");
   resource_info->colormap=UndefinedColormap;
@@ -3485,7 +3486,7 @@
     (char *) "False");
   resource_info->confirm_edit=IsMagickTrue(resource_value);
   resource_value=XGetResourceClass(database,client_name,"delay",(char *) "1");
-  resource_info->delay=(unsigned int) atoi(resource_value);
+  resource_info->delay=(unsigned int) StringToLong(resource_value);
   resource_info->display_gamma=XGetResourceClass(database,client_name,
     "displayGamma",(char *) "2.2");
   resource_value=XGetResourceClass(database,client_name,"displayWarnings",
@@ -3540,7 +3541,7 @@
   resource_info->immutable=IsMagickTrue(resource_value);
   resource_value=XGetResourceClass(database,client_name,"magnify",
     (char *) "3");
-  resource_info->magnify=(unsigned int) atoi(resource_value);
+  resource_info->magnify=(unsigned int) StringToLong(resource_value);
   resource_info->map_type=XGetResourceClass(database,client_name,"map",
     (char *) NULL);
   resource_info->matte_color=XGetResourceInstance(database,client_name,
@@ -3570,9 +3571,9 @@
   resource_info->pen_colors[10]=XGetResourceClass(database,client_name,"pen0",
     (char *) "gray");
   resource_value=XGetResourceClass(database,client_name,"pause",(char *) "0");
-  resource_info->pause=(unsigned int) atoi(resource_value);
+  resource_info->pause=(unsigned int) StringToLong(resource_value);
   resource_value=XGetResourceClass(database,client_name,"quantum",(char *) "1");
-  resource_info->quantum=atoi(resource_value);
+  resource_info->quantum=StringToLong(resource_value);
   resource_info->text_font=XGetResourceClass(database,client_name,(char *)
     "font",(char *) "fixed");
   resource_info->text_font=XGetResourceClass(database,client_name,
@@ -3581,7 +3582,7 @@
     (char *) NULL);
   resource_value=XGetResourceClass(database,client_name,"undoCache",
     (char *) "16");
-  resource_info->undo_cache=(unsigned int) atol(resource_value);
+  resource_info->undo_cache=(unsigned int) StringToLong(resource_value);
   resource_value=XGetResourceClass(database,client_name,"update",
     (char *) "False");
   resource_info->update=IsMagickTrue(resource_value);
diff --git a/tests/validate.c b/tests/validate.c
index 24cc998..4783498 100644
--- a/tests/validate.c
+++ b/tests/validate.c
@@ -43,6 +43,7 @@
 #include <stdio.h>
 #include <string.h>
 #include <math.h>
+#include "magick/string-private.h"
 #include "wand/MagickWand.h"
 #include "validate.h"
 
@@ -1290,7 +1291,7 @@
       {
         if (LocaleCompare("bench",option+1) == 0)
           {
-            iterations=(unsigned long) atol(argv[++i]);
+            iterations=(unsigned long) StringToLong(argv[++i]);
             break;
           }
         ThrowValidateException(OptionError,"UnrecognizedOption",option)
diff --git a/wand/animate.c b/wand/animate.c
index eb60086..24b284d 100644
--- a/wand/animate.c
+++ b/wand/animate.c
@@ -44,6 +44,7 @@
 #include "wand/MagickWand.h"
 #include "wand/mogrify-private.h"
 #include "magick/animate-private.h"
+#include "magick/string-private.h"
 
 /*
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -523,7 +524,7 @@
             i++;
             if ((i == (long) argc) || (IsGeometry(argv[i]) == MagickFalse))
               ThrowAnimateException(OptionError,"MissingArgument",option);
-            resource_info.border_width=(unsigned int) atoi(argv[i]);
+            resource_info.border_width=(unsigned int) StringToLong(argv[i]);
             break;
           }
         ThrowAnimateException(OptionError,"UnrecognizedOption",option);
@@ -614,7 +615,7 @@
               ThrowAnimateException(OptionError,"MissingArgument",option);
             if (IsGeometry(argv[i]) == MagickFalse)
               ThrowAnimateInvalidArgumentException(option,argv[i]);
-            quantize_info->number_colors=(unsigned long) atol(argv[i]);
+            quantize_info->number_colors=(unsigned long) StringToLong(argv[i]);
             break;
           }
         if (LocaleCompare("colorspace",option+1) == 0)
@@ -1112,7 +1113,7 @@
               ThrowAnimateException(OptionError,"MissingArgument",option);
             if (IsGeometry(argv[i]) == MagickFalse)
               ThrowAnimateInvalidArgumentException(option,argv[i]);
-            resource_info.pause=(unsigned int) atoi(argv[i]);
+            resource_info.pause=(unsigned int) StringToLong(argv[i]);
             break;
           }
         if (LocaleCompare("page",option+1) == 0)
@@ -1347,7 +1348,7 @@
               ThrowAnimateException(OptionError,"MissingArgument",option);
             if (IsGeometry(argv[i]) == MagickFalse)
               ThrowAnimateInvalidArgumentException(option,argv[i]);
-            quantize_info->tree_depth=(unsigned long) atol(argv[i]);
+            quantize_info->tree_depth=(unsigned long) StringToLong(argv[i]);
             break;
           }
         if (LocaleCompare("trim",option+1) == 0)
diff --git a/wand/compare.c b/wand/compare.c
index dbb0969..c4a8429 100644
--- a/wand/compare.c
+++ b/wand/compare.c
@@ -44,6 +44,7 @@
 #include "wand/studio.h"
 #include "wand/MagickWand.h"
 #include "wand/mogrify-private.h"
+#include "magick/string-private.h"
 
 /*
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -528,7 +529,7 @@
             if (*option == '+')
               dissimilarity_threshold=DefaultDissimilarityThreshold;
             else
-              dissimilarity_threshold=atof(argv[i]);
+              dissimilarity_threshold=StringToDouble(argv[i]);
             break;
           }
         if (LocaleCompare("duration",option+1) == 0)
diff --git a/wand/composite.c b/wand/composite.c
index 1f36de7..1f88a50 100644
--- a/wand/composite.c
+++ b/wand/composite.c
@@ -43,6 +43,7 @@
 #include "wand/studio.h"
 #include "wand/MagickWand.h"
 #include "wand/mogrify-private.h"
+#include "magick/string-private.h"
 
 /*
   Typedef declarations.
@@ -1387,7 +1388,7 @@
               ThrowCompositeException(OptionError,"MissingArgument",option);
             if (IsGeometry(argv[i]) == MagickFalse)
               ThrowCompositeInvalidArgumentException(option,argv[i]);
-            composite_options.stegano=atol(argv[i])+1;
+            composite_options.stegano=StringToLong(argv[i])+1;
             break;
           }
         if (LocaleCompare("stereo",option+1) == 0)
diff --git a/wand/display.c b/wand/display.c
index a855c8e..eb90d2f 100644
--- a/wand/display.c
+++ b/wand/display.c
@@ -45,6 +45,7 @@
 #include "wand/MagickWand.h"
 #include "wand/mogrify-private.h"
 #include "magick/display-private.h"
+#include "magick/string-private.h"
 
 /*
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -437,7 +438,7 @@
     "pageGeometry",(char *) NULL);
   resource_value=XGetResourceInstance(resource_database,GetClientName(),
     "quality","75");
-  image_info->quality=(unsigned long) atol(resource_value);
+  image_info->quality=(unsigned long) StringToLong(resource_value);
   resource_value=XGetResourceInstance(resource_database,GetClientName(),
     "verbose","False");
   image_info->verbose=IsMagickTrue(resource_value);
@@ -742,7 +743,7 @@
               ThrowDisplayException(OptionError,"MissingArgument",option);
             if (IsGeometry(argv[i]) == MagickFalse)
               ThrowDisplayInvalidArgumentException(option,argv[i]);
-            resource_info.border_width=(unsigned int) atoi(argv[i]);
+            resource_info.border_width=(unsigned int) StringToLong(argv[i]);
             break;
           }
         ThrowDisplayException(OptionError,"UnrecognizedOption",option);
@@ -815,7 +816,7 @@
               ThrowDisplayException(OptionError,"MissingArgument",option);
             if (IsGeometry(argv[i]) == MagickFalse)
               ThrowDisplayInvalidArgumentException(option,argv[i]);
-            quantize_info->number_colors=(unsigned long) atol(argv[i]);
+            quantize_info->number_colors=(unsigned long) StringToLong(argv[i]);
             break;
           }
         if (LocaleCompare("colorspace",option+1) == 0)
@@ -1342,7 +1343,7 @@
               ThrowDisplayException(OptionError,"MissingArgument",option);
             if (IsGeometry(argv[i]) == MagickFalse)
               ThrowDisplayInvalidArgumentException(option,argv[i]);
-            iterations=(unsigned long) atol(argv[i]);
+            iterations=(unsigned long) StringToLong(argv[i]);
             break;
           }
         ThrowDisplayException(OptionError,"UnrecognizedOption",option);
@@ -1359,7 +1360,7 @@
               ThrowDisplayException(OptionError,"MissingArgument",option);
             if (IsGeometry(argv[i]) == MagickFalse)
               ThrowDisplayInvalidArgumentException(option,argv[i]);
-            resource_info.magnify=(unsigned int) atoi(argv[i]);
+            resource_info.magnify=(unsigned int) StringToLong(argv[i]);
             break;
           }
         if (LocaleCompare("map",option+1) == 0)
@@ -1739,7 +1740,7 @@
               ThrowDisplayException(OptionError,"MissingArgument",option);
             if (IsGeometry(argv[i]) == MagickFalse)
               ThrowDisplayInvalidArgumentException(option,argv[i]);
-            quantize_info->tree_depth=(unsigned long) atol(argv[i]);
+            quantize_info->tree_depth=(unsigned long) StringToLong(argv[i]);
             break;
           }
         if (LocaleCompare("trim",option+1) == 0)
@@ -1758,7 +1759,7 @@
               ThrowDisplayException(OptionError,"MissingArgument",option);
             if (IsGeometry(argv[i]) == MagickFalse)
               ThrowDisplayInvalidArgumentException(option,argv[i]);
-            resource_info.update=(unsigned int) atoi(argv[i]);
+            resource_info.update=(unsigned int) StringToLong(argv[i]);
             break;
           }
         if (LocaleCompare("use-pixmap",option+1) == 0)
diff --git a/wand/drawing-wand.c b/wand/drawing-wand.c
index adb3b6f..e827432 100644
--- a/wand/drawing-wand.c
+++ b/wand/drawing-wand.c
@@ -50,6 +50,7 @@
 #include "wand/MagickWand.h"
 #include "wand/magick-wand-private.h"
 #include "wand/wand.h"
+#include "magick/string-private.h"
 
 /*
   Define declarations.
@@ -6128,7 +6129,7 @@
       value=GetXMLTreeContent(child);
       if (value != (const char *) NULL)
         CurrentContext->fill.opacity=RoundToQuantum((MagickRealType)
-          QuantumRange*(1.0-atof(value)));
+          QuantumRange*(1.0-StringToDouble(value)));
     }
   child=GetXMLTreeChild(xml_info,"fill-rule");
   if (child != (XMLTreeInfo *) NULL)
@@ -6149,7 +6150,7 @@
     {
       value=GetXMLTreeContent(child);
       if (value != (const char *) NULL)
-        CurrentContext->pointsize=atof(value);
+        CurrentContext->pointsize=StringToDouble(value);
     }
   child=GetXMLTreeChild(xml_info,"font-stretch");
   if (child != (XMLTreeInfo *) NULL)
@@ -6172,7 +6173,7 @@
     {
       value=GetXMLTreeContent(child);
       if (value != (const char *) NULL)
-        CurrentContext->weight=(unsigned long) atol(value);
+        CurrentContext->weight=(unsigned long) StringToLong(value);
     }
   child=GetXMLTreeChild(xml_info,"gravity");
   if (child != (XMLTreeInfo *) NULL)
@@ -6195,7 +6196,7 @@
     {
       value=GetXMLTreeContent(child);
       if (value != (const char *) NULL)
-        CurrentContext->stroke_antialias=atol(value) != 0 ? MagickTrue :
+        CurrentContext->stroke_antialias=StringToLong(value) != 0 ? MagickTrue :
           MagickFalse;
     }
   child=GetXMLTreeChild(xml_info,"stroke-dasharray");
@@ -6245,7 +6246,7 @@
                 GetMagickToken(q,&q,token);
                 if (*token == ',')
                   GetMagickToken(q,&q,token);
-                CurrentContext->dash_pattern[j]=atof(token);
+                CurrentContext->dash_pattern[j]=StringToDouble(token);
               }
               if ((x & 0x01) != 0)
                 for ( ; j < (2*x); j++)
@@ -6260,7 +6261,7 @@
     {
       value=GetXMLTreeContent(child);
       if (value != (const char *) NULL)
-        CurrentContext->dash_offset=atof(value);
+        CurrentContext->dash_offset=StringToDouble(value);
     }
   child=GetXMLTreeChild(xml_info,"stroke-linecap");
   if (child != (XMLTreeInfo *) NULL)
@@ -6283,7 +6284,7 @@
     {
       value=GetXMLTreeContent(child);
       if (value != (const char *) NULL)
-        CurrentContext->miterlimit=(unsigned long) atol(value);
+        CurrentContext->miterlimit=(unsigned long) StringToLong(value);
     }
   child=GetXMLTreeChild(xml_info,"stroke-opacity");
   if (child != (XMLTreeInfo *) NULL)
@@ -6291,14 +6292,14 @@
       value=GetXMLTreeContent(child);
       if (value != (const char *) NULL)
         CurrentContext->stroke.opacity=RoundToQuantum((MagickRealType)
-          QuantumRange*(1.0-atof(value)));
+          QuantumRange*(1.0-StringToDouble(value)));
     }
   child=GetXMLTreeChild(xml_info,"stroke-width");
   if (child != (XMLTreeInfo *) NULL)
     {
       value=GetXMLTreeContent(child);
       if (value != (const char *) NULL)
-        CurrentContext->stroke_width=atof(value);
+        CurrentContext->stroke_width=StringToDouble(value);
     }
   child=GetXMLTreeChild(xml_info,"text-align");
   if (child != (XMLTreeInfo *) NULL)
@@ -6313,7 +6314,7 @@
     {
       value=GetXMLTreeContent(child);
       if (value != (const char *) NULL)
-        CurrentContext->text_antialias=atol(value) != 0 ? MagickTrue :
+        CurrentContext->text_antialias=StringToLong(value) != 0 ? MagickTrue :
           MagickFalse;
     }
   child=GetXMLTreeChild(xml_info,"text-undercolor");
diff --git a/wand/import.c b/wand/import.c
index 5846b93..bbf223f 100644
--- a/wand/import.c
+++ b/wand/import.c
@@ -45,6 +45,7 @@
 #include "wand/MagickWand.h"
 #include "wand/mogrify-private.h"
 #include "magick/xwindow-private.h"
+#include "magick/string-private.h"
 
 /*
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -370,7 +371,7 @@
   ximage_info.borders=IsMagickTrue(resource_value);
   resource_value=XGetResourceInstance(resource_database,GetClientName(),
     "delay","0");
-  resource_info.delay=(unsigned int) atoi(resource_value);
+  resource_info.delay=(unsigned int) StringToLong(resource_value);
   image_info->density=XGetResourceInstance(resource_database,GetClientName(),
     "density",(char *) NULL);
   resource_value=XGetResourceInstance(resource_database,GetClientName(),
@@ -397,10 +398,10 @@
     "pageGeometry",(char *) NULL);
   resource_value=XGetResourceInstance(resource_database,GetClientName(),
     "pause","0");
-  resource_info.pause=(unsigned int) atol(resource_value);
+  resource_info.pause=(unsigned int) StringToLong(resource_value);
   resource_value=XGetResourceInstance(resource_database,GetClientName(),
     "quality","85");
-  image_info->quality=(unsigned long) atol(resource_value);
+  image_info->quality=(unsigned long) StringToLong(resource_value);
   resource_value=XGetResourceInstance(resource_database,GetClientName(),
     "screen","False");
   ximage_info.screen=IsMagickTrue(resource_value);
@@ -551,7 +552,7 @@
               ThrowImportException(OptionError,"MissingArgument",option);
             if (IsGeometry(argv[i]) == MagickFalse)
               ThrowImportInvalidArgumentException(option,argv[i]);
-            quantize_info->number_colors=(unsigned long) atol(argv[i]);
+            quantize_info->number_colors=(unsigned long) StringToLong(argv[i]);
             break;
           }
         if (LocaleCompare("colorspace",option+1) == 0)
@@ -1015,7 +1016,7 @@
               ThrowImportException(OptionError,"MissingArgument",option);
             if (IsGeometry(argv[i]) == MagickFalse)
               ThrowImportInvalidArgumentException(option,argv[i]);
-            resource_info.pause=(unsigned int) atoi(argv[i]);
+            resource_info.pause=(unsigned int) StringToLong(argv[i]);
             break;
           }
         if (LocaleCompare("ping",option+1) == 0)
@@ -1174,7 +1175,7 @@
               ThrowImportException(OptionError,"MissingArgument",option);
             if (IsGeometry(argv[i]) == MagickFalse)
               ThrowImportInvalidArgumentException(option,argv[i]);
-            snapshots=atol(argv[i]);
+            snapshots=StringToLong(argv[i]);
             break;
           }
         if (LocaleCompare("strip",option+1) == 0)
@@ -1225,7 +1226,7 @@
               ThrowImportException(OptionError,"MissingArgument",option);
             if (IsGeometry(argv[i]) == MagickFalse)
               ThrowImportInvalidArgumentException(option,argv[i]);
-            quantize_info->tree_depth=(unsigned long) atol(argv[i]);
+            quantize_info->tree_depth=(unsigned long) StringToLong(argv[i]);
             break;
           }
         if (LocaleCompare("trim",option+1) == 0)
diff --git a/wand/magick-property.c b/wand/magick-property.c
index eb45e34..3f7ff2d 100644
--- a/wand/magick-property.c
+++ b/wand/magick-property.c
@@ -50,6 +50,7 @@
 #include "wand/MagickWand.h"
 #include "wand/magick-wand-private.h"
 #include "wand/wand.h"
+#include "magick/string-private.h"
 
 /*
   Define declarations.
@@ -1484,7 +1485,7 @@
     while (((int) *p != 0) && ((isspace((int) ((unsigned char) *p)) != 0) ||
            (*p == ',')))
       p++;
-    sampling_factors[i]=atof(p);
+    sampling_factors[i]=StringToDouble(p);
     i++;
   }
   *number_factors=(unsigned long) i;
diff --git a/wand/mogrify.c b/wand/mogrify.c
index 1c22382..479261a 100644
--- a/wand/mogrify.c
+++ b/wand/mogrify.c
@@ -48,6 +48,7 @@
 #include "wand/MagickWand.h"
 #include "wand/mogrify-private.h"
 #include "magick/thread-private.h"
+#include "magick/string-private.h"
 
 /*
   Define declarations.
@@ -135,13 +136,13 @@
     if ((strlen(option) == 1) || ((*option != '-') && (*option != '+')))
       continue;
     if (LocaleCompare("bench",option+1) == 0)
-      iterations=(unsigned long) atol(argv[++i]);
+      iterations=(unsigned long) StringToLong(argv[++i]);
     if (LocaleCompare("concurrent",option+1) == 0)
       concurrent=MagickTrue;
     if (LocaleCompare("debug",option+1) == 0)
       (void) SetLogEventMask(argv[++i]);
     if (LocaleCompare("duration",option+1) == 0)
-      duration=atof(argv[++i]);
+      duration=StringToDouble(argv[++i]);
     if (LocaleCompare("regard-warnings",option+1) == 0)
       regard_warnings=MagickTrue;
   }
@@ -482,7 +483,7 @@
       error = MagickTrue;
       break;
     }
-    sparse_arguments[x++]=atof(token);
+    sparse_arguments[x++]=StringToDouble(token);
     /* Y coordinate */
     token[0]=','; while ( token[0] == ',' ) GetMagickToken(p,&p,token);
     if ( token[0] == '\0' ) break;
@@ -493,7 +494,7 @@
       error = MagickTrue;
       break;
     }
-    sparse_arguments[x++]=atof(token);
+    sparse_arguments[x++]=StringToDouble(token);
     /* color values for this control point */
 #if 0
     if ( (color_from_image ) {
@@ -531,35 +532,35 @@
           while ( token[0] == ',' ) GetMagickToken(p,&p,token);
           if ( token[0] == '\0' || isalpha((int)token[0]) || token[0] == '#' )
             break;
-          sparse_arguments[x++] = atof(token);
+          sparse_arguments[x++] = StringToDouble(token);
           token[0] = ','; /* used this token - get another */
         }
         if ( channels & GreenChannel ) {
           while ( token[0] == ',' ) GetMagickToken(p,&p,token);
           if ( token[0] == '\0' || isalpha((int)token[0]) || token[0] == '#' )
             break;
-          sparse_arguments[x++] = atof(token);
+          sparse_arguments[x++] = StringToDouble(token);
           token[0] = ','; /* used this token - get another */
         }
         if ( channels & BlueChannel ) {
           while ( token[0] == ',' ) GetMagickToken(p,&p,token);
           if ( token[0] == '\0' || isalpha((int)token[0]) || token[0] == '#' )
             break;
-          sparse_arguments[x++] = atof(token);
+          sparse_arguments[x++] = StringToDouble(token);
           token[0] = ','; /* used this token - get another */
         }
         if ( channels & IndexChannel ) {
           while ( token[0] == ',' ) GetMagickToken(p,&p,token);
           if ( token[0] == '\0' || isalpha((int)token[0]) || token[0] == '#' )
             break;
-          sparse_arguments[x++] = atof(token);
+          sparse_arguments[x++] = StringToDouble(token);
           token[0] = ','; /* used this token - get another */
         }
         if ( channels & OpacityChannel ) {
           while ( token[0] == ',' ) GetMagickToken(p,&p,token);
           if ( token[0] == '\0' || isalpha((int)token[0]) || token[0] == '#' )
             break;
-          sparse_arguments[x++] = atof(token);
+          sparse_arguments[x++] = StringToDouble(token);
           token[0] = ','; /* used this token - get another */
         }
 #endif
@@ -1126,7 +1127,7 @@
               Reduce the number of colors in the image.
             */
             (void) SyncImageSettings(image_info,*image);
-            quantize_info->number_colors=(unsigned long) atol(argv[i+1]);
+            quantize_info->number_colors=(unsigned long) StringToLong(argv[i+1]);
             if (quantize_info->number_colors == 0)
               break;
             if (((*image)->storage_class == DirectClass) ||
@@ -1237,7 +1238,7 @@
               GetMagickToken(p,&p,token);
               if (*token == ',')
                 GetMagickToken(p,&p,token);
-              kernel[x]=atof(token);
+              kernel[x]=StringToDouble(token);
             }
             for ( ; x < (long) (order*order); x++)
               kernel[x]=0.0;
@@ -1267,7 +1268,7 @@
               Cycle an image colormap.
             */
             (void) SyncImageSettings(image_info,*image);
-            (void) CycleColormapImage(*image,atoi(argv[i+1]));
+            (void) CycleColormapImage(*image,StringToLong(argv[i+1]));
             InheritException(exception,&(*image)->exception);
             break;
           }
@@ -1308,7 +1309,7 @@
                 (void) SetImageDepth(*image,MAGICKCORE_QUANTUM_DEPTH);
                 break;
               }
-            (void) SetImageDepth(*image,(unsigned long) atol(argv[i+1]));
+            (void) SetImageDepth(*image,(unsigned long) StringToLong(argv[i+1]));
             break;
           }
         if (LocaleCompare("deskew",option+1) == 0)
@@ -1326,7 +1327,7 @@
             if (*option == '+')
               threshold=40.0*QuantumRange/100.0;
             else
-              threshold=StringToDouble(argv[i+1],QuantumRange);
+              threshold=SiPrefixToDouble(argv[i+1],QuantumRange);
             deskew_image=DeskewImage(*image,threshold,exception);
             if (deskew_image == (Image *) NULL)
               break;
@@ -1410,7 +1411,7 @@
               GetMagickToken(p,&p,token);
               if (*token == ',')
                 GetMagickToken(p,&p,token);
-              arguments[x]=atof(token);
+              arguments[x]=StringToDouble(token);
             }
             args=DestroyString(args);
             distort_image=DistortImage(*image,method,number_arguments,arguments,
@@ -1549,7 +1550,7 @@
             (void) SyncImageSettings(image_info,*image);
             op=(MagickEvaluateOperator) ParseMagickOption(MagickEvaluateOptions,
               MagickFalse,argv[i+1]);
-            constant=StringToDouble(argv[i+2],QuantumRange);
+            constant=SiPrefixToDouble(argv[i+2],QuantumRange);
             (void) EvaluateImageChannel(*image,channel,op,constant,exception);
             break;
           }
@@ -1760,7 +1761,7 @@
               GetMagickToken(p,&p,token);
               if (*token == ',')
                 GetMagickToken(p,&p,token);
-              parameters[x]=atof(token);
+              parameters[x]=StringToDouble(token);
             }
             arguments=DestroyString(arguments);
             (void) FunctionImageChannel(*image,channel,function,
@@ -1779,13 +1780,13 @@
             */
             (void) SyncImageSettings(image_info,*image);
             if (*option == '+')
-              (*image)->gamma=atof(argv[i+1]);
+              (*image)->gamma=StringToDouble(argv[i+1]);
             else
               {
                 if (strchr(argv[i+1],',') != (char *) NULL)
                   (void) GammaImage(*image,argv[i+1]);
                 else
-                  (void) GammaImageChannel(*image,channel,atof(argv[i+1]));
+                  (void) GammaImageChannel(*image,channel,StringToDouble(argv[i+1]));
                 InheritException(exception,&(*image)->exception);
               }
             break;
@@ -2069,7 +2070,7 @@
           }
         if (LocaleCompare("linewidth",option+1) == 0)
           {
-            draw_info->stroke_width=atof(argv[i+1]);
+            draw_info->stroke_width=StringToDouble(argv[i+1]);
             break;
           }
         if (LocaleCompare("liquid-rescale",option+1) == 0)
@@ -2358,7 +2359,7 @@
               Posterize image.
             */
             (void) SyncImageSettings(image_info,*image);
-            (void) PosterizeImage(*image,(unsigned long) atol(argv[i+1]),
+            (void) PosterizeImage(*image,(unsigned long) StringToLong(argv[i+1]),
               quantize_info->dither);
             InheritException(exception,&(*image)->exception);
             break;
@@ -2501,7 +2502,7 @@
               Radial blur image.
             */
             (void) SyncImageSettings(image_info,*image);
-            blur_image=RadialBlurImageChannel(*image,channel,atof(argv[i+1]),
+            blur_image=RadialBlurImageChannel(*image,channel,StringToDouble(argv[i+1]),
               exception);
             if (blur_image == (Image *) NULL)
               break;
@@ -2575,7 +2576,7 @@
               GetMagickToken(p,&p,token);
               if (*token == ',')
                 GetMagickToken(p,&p,token);
-              color_matrix[x]=atof(token);
+              color_matrix[x]=StringToDouble(token);
             }
             for ( ; x < (long) (order*order); x++)
               color_matrix[x]=0.0;
@@ -2840,7 +2841,7 @@
               Sepia-tone image.
             */
             (void) SyncImageSettings(image_info,*image);
-            threshold=StringToDouble(argv[i+1],QuantumRange);
+            threshold=SiPrefixToDouble(argv[i+1],QuantumRange);
             sepia_image=SepiaToneImage(*image,threshold,exception);
             if (sepia_image == (Image *) NULL)
               break;
@@ -3044,7 +3045,7 @@
               threshold;
 
             (void) SyncImageSettings(image_info,*image);
-            threshold=StringToDouble(argv[i+1],QuantumRange);
+            threshold=SiPrefixToDouble(argv[i+1],QuantumRange);
             (void) SolarizeImage(*image,threshold);
             InheritException(exception,&(*image)->exception);
             break;
@@ -3157,7 +3158,7 @@
           }
         if (LocaleCompare("strokewidth",option+1) == 0)
           {
-            draw_info->stroke_width=atof(argv[i+1]);
+            draw_info->stroke_width=StringToDouble(argv[i+1]);
             break;
           }
         if (LocaleCompare("style",option+1) == 0)
@@ -3204,7 +3205,7 @@
             if (*option == '+')
               threshold=(double) QuantumRange/2.5;
             else
-              threshold=StringToDouble(argv[i+1],QuantumRange);
+              threshold=SiPrefixToDouble(argv[i+1],QuantumRange);
             (void) BilevelImageChannel(*image,channel,threshold);
             InheritException(exception,&(*image)->exception);
             break;
@@ -3318,7 +3319,7 @@
           }
         if (LocaleCompare("treedepth",option+1) == 0)
           {
-            quantize_info->tree_depth=(unsigned long) atol(argv[i+1]);
+            quantize_info->tree_depth=(unsigned long) StringToLong(argv[i+1]);
             break;
           }
         if (LocaleCompare("trim",option+1) == 0)
@@ -3478,7 +3479,7 @@
           }
         if (LocaleCompare("weight",option+1) == 0)
           {
-            draw_info->weight=(unsigned long) atol(argv[i+1]);
+            draw_info->weight=(unsigned long) StringToLong(argv[i+1]);
             if (LocaleCompare(argv[i+1],"all") == 0)
               draw_info->weight=0;
             if (LocaleCompare(argv[i+1],"bold") == 0)
@@ -6361,7 +6362,7 @@
 
             limit=MagickResourceInfinity;
             if (LocaleCompare("unlimited",argv[i+1]) != 0)
-              limit=(MagickSizeType) StringToDouble(argv[i+1],100.0);
+              limit=(MagickSizeType) SiPrefixToDouble(argv[i+1],100.0);
             (void) SetMagickResourceLimit(MemoryResource,limit);
             (void) SetMagickResourceLimit(MapResource,2*limit);
             break;
@@ -6388,7 +6389,7 @@
           }
         if (LocaleCompare("colors",option+1) == 0)
           {
-            image_info->colors=(unsigned long) atol(argv[i+1]);
+            image_info->colors=(unsigned long) StringToLong(argv[i+1]);
             break;
           }
         if (LocaleCompare("colorspace",option+1) == 0)
@@ -6515,7 +6516,7 @@
                 image_info->depth=MAGICKCORE_QUANTUM_DEPTH;
                 break;
               }
-            image_info->depth=(unsigned long) atol(argv[i+1]);
+            image_info->depth=(unsigned long) StringToLong(argv[i+1]);
             break;
           }
         if (LocaleCompare("display",option+1) == 0)
@@ -6647,7 +6648,7 @@
                 (void) SetImageOption(image_info,option+1,"0");
                 break;
               }
-            image_info->fuzz=StringToDouble(argv[i+1],(double) QuantumRange+
+            image_info->fuzz=SiPrefixToDouble(argv[i+1],(double) QuantumRange+
               1.0);
             (void) SetImageOption(image_info,option+1,argv[i+1]);
             break;
@@ -6775,7 +6776,7 @@
               MagickFalse,argv[i+1]);
             limit=MagickResourceInfinity;
             if (LocaleCompare("unlimited",argv[i+2]) != 0)
-              limit=(MagickSizeType) StringToDouble(argv[i+2],100.0);
+              limit=(MagickSizeType) SiPrefixToDouble(argv[i+2],100.0);
             (void) SetMagickResourceLimit(type,limit);
             break;
           }
@@ -7034,7 +7035,7 @@
                 (void) SetImageOption(image_info,option+1,"0");
                 break;
               }
-            image_info->quality=(unsigned long) atol(argv[i+1]);
+            image_info->quality=(unsigned long) StringToLong(argv[i+1]);
             (void) SetImageOption(image_info,option+1,argv[i+1]);
             break;
           }
@@ -7101,7 +7102,7 @@
                 (void) SetImageOption(image_info,option+1,"0");
                 break;
               }
-            image_info->scene=(unsigned long) atol(argv[i+1]);
+            image_info->scene=(unsigned long) StringToLong(argv[i+1]);
             (void) SetImageOption(image_info,option+1,argv[i+1]);
             break;
           }
@@ -7116,7 +7117,7 @@
                 SeedPseudoRandomGenerator(seed);
                 break;
               }
-            seed=(unsigned long) atol(argv[i+1]);
+            seed=(unsigned long) StringToLong(argv[i+1]);
             SeedPseudoRandomGenerator(seed);
             break;
           }
@@ -7730,7 +7731,7 @@
 
             index=0;
             if (*option != '+')
-              index=atol(argv[i+1]);
+              index=StringToLong(argv[i+1]);
             p=RemoveLastImageFromList(images);
             if (p == (Image *) NULL)
               {
@@ -7954,7 +7955,7 @@
               *morph_image;
 
             (void) SyncImagesSettings(image_info,*images);
-            morph_image=MorphImages(*images,(unsigned long) atol(argv[i+1]),
+            morph_image=MorphImages(*images,(unsigned long) StringToLong(argv[i+1]),
               exception);
             if (morph_image == (Image *) NULL)
               {
diff --git a/wand/montage.c b/wand/montage.c
index 5a39e73..fa2c4a7 100644
--- a/wand/montage.c
+++ b/wand/montage.c
@@ -45,6 +45,7 @@
 #include "wand/studio.h"
 #include "wand/MagickWand.h"
 #include "wand/mogrify-private.h"
+#include "magick/string-private.h"
 
 /*
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -538,7 +539,7 @@
               ThrowMontageException(OptionError,"MissingArgument",option);
             if (IsGeometry(argv[i]) == MagickFalse)
               ThrowMontageInvalidArgumentException(option,argv[i]);
-            montage_info->border_width=(unsigned long) atol(argv[i]);
+            montage_info->border_width=(unsigned long) StringToLong(argv[i]);
             break;
           }
         if (LocaleCompare("bordercolor",option+1) == 0)
@@ -562,7 +563,7 @@
               ThrowMontageException(OptionError,"MissingArgument",option);
             if (IsGeometry(argv[i]) == MagickFalse)
               ThrowMontageInvalidArgumentException(option,argv[i]);
-            montage_info->border_width=(unsigned long) atol(argv[i]);
+            montage_info->border_width=(unsigned long) StringToLong(argv[i]);
             break;
           }
         ThrowMontageException(OptionError,"UnrecognizedOption",option)
@@ -1236,7 +1237,7 @@
               ThrowMontageException(OptionError,"MissingArgument",option);
             if (IsGeometry(argv[i]) == MagickFalse)
               ThrowMontageInvalidArgumentException(option,argv[i]);
-            montage_info->pointsize=atof(argv[i]);
+            montage_info->pointsize=StringToDouble(argv[i]);
             break;
           }
         if (LocaleCompare("polaroid",option+1) == 0)
@@ -1383,7 +1384,7 @@
               ThrowMontageException(OptionError,"MissingArgument",option);
             if (IsSceneGeometry(argv[i],MagickFalse) == MagickFalse)
               ThrowMontageInvalidArgumentException(option,argv[i]);
-            first_scene=atol(argv[i]);
+            first_scene=StringToLong(argv[i]);
             last_scene=first_scene;
             (void) sscanf(argv[i],"%ld-%ld",&first_scene,&last_scene);
             break;
