diff --git a/MagickCore/colorspace.c b/MagickCore/colorspace.c
index 1748073..84e5cd6 100644
--- a/MagickCore/colorspace.c
+++ b/MagickCore/colorspace.c
@@ -619,20 +619,20 @@
       gamma=DisplayGamma;
       value=GetImageProperty(image,"gamma",exception);
       if (value != (const char *) NULL)
-        gamma=1.0/fabs(InterpretLocaleValue(value,(char **) NULL)) >=
-          MagickEpsilon ? InterpretLocaleValue(value,(char **) NULL) : 1.0;
+        gamma=1.0/fabs(StringToDouble(value,(char **) NULL)) >=
+          MagickEpsilon ? StringToDouble(value,(char **) NULL) : 1.0;
       film_gamma=FilmGamma;
       value=GetImageProperty(image,"film-gamma",exception);
       if (value != (const char *) NULL)
-        film_gamma=InterpretLocaleValue(value,(char **) NULL);
+        film_gamma=StringToDouble(value,(char **) NULL);
       reference_black=ReferenceBlack;
       value=GetImageProperty(image,"reference-black",exception);
       if (value != (const char *) NULL)
-        reference_black=InterpretLocaleValue(value,(char **) NULL);
+        reference_black=StringToDouble(value,(char **) NULL);
       reference_white=ReferenceWhite;
       value=GetImageProperty(image,"reference-white",exception);
       if (value != (const char *) NULL)
-        reference_white=InterpretLocaleValue(value,(char **) NULL);
+        reference_white=StringToDouble(value,(char **) NULL);
       logmap=(Quantum *) AcquireQuantumMemory((size_t) MaxMap+1UL,
         sizeof(*logmap));
       if (logmap == (Quantum *) NULL)
@@ -2067,20 +2067,20 @@
       gamma=DisplayGamma;
       value=GetImageProperty(image,"gamma",exception);
       if (value != (const char *) NULL)
-        gamma=1.0/fabs(InterpretLocaleValue(value,(char **) NULL)) >=
-          MagickEpsilon ? InterpretLocaleValue(value,(char **) NULL) : 1.0;
+        gamma=1.0/fabs(StringToDouble(value,(char **) NULL)) >=
+          MagickEpsilon ? StringToDouble(value,(char **) NULL) : 1.0;
       film_gamma=FilmGamma;
       value=GetImageProperty(image,"film-gamma",exception);
       if (value != (const char *) NULL)
-        film_gamma=InterpretLocaleValue(value,(char **) NULL);
+        film_gamma=StringToDouble(value,(char **) NULL);
       reference_black=ReferenceBlack;
       value=GetImageProperty(image,"reference-black",exception);
       if (value != (const char *) NULL)
-        reference_black=InterpretLocaleValue(value,(char **) NULL);
+        reference_black=StringToDouble(value,(char **) NULL);
       reference_white=ReferenceWhite;
       value=GetImageProperty(image,"reference-white",exception);
       if (value != (const char *) NULL)
-        reference_white=InterpretLocaleValue(value,(char **) NULL);
+        reference_white=StringToDouble(value,(char **) NULL);
       logmap=(Quantum *) AcquireQuantumMemory((size_t) MaxMap+1UL,
         sizeof(*logmap));
       if (logmap == (Quantum *) NULL)
diff --git a/MagickCore/display.c b/MagickCore/display.c
index ecd5ee7..408251c 100644
--- a/MagickCore/display.c
+++ b/MagickCore/display.c
@@ -2127,14 +2127,14 @@
               break;
             if (entry != 8)
               {
-                degrees=InterpretLocaleValue(RotateMenu[entry],(char **) NULL);
+                degrees=StringToDouble(RotateMenu[entry],(char **) NULL);
                 break;
               }
             (void) XDialogWidget(display,windows,"OK","Enter rotation angle:",
               angle);
             if (*angle == '\0')
               break;
-            degrees=InterpretLocaleValue(angle,(char **) NULL);
+            degrees=StringToDouble(angle,(char **) NULL);
             break;
           }
           case AnnotateHelpCommand:
@@ -3543,7 +3543,7 @@
               break;
             if (entry != 5)
               {
-                (*image)->fuzz=InterpretLocaleInterval(FuzzMenu[entry],(double)
+                (*image)->fuzz=StringToDoubleInterval(FuzzMenu[entry],(double)
                   QuantumRange+1.0);
                 break;
               }
@@ -3553,7 +3553,7 @@
             if (*fuzz == '\0')
               break;
             (void) ConcatenateMagickString(fuzz,"%",MaxTextExtent);
-            (*image)->fuzz=InterpretLocaleInterval(fuzz,(double) QuantumRange+1.0);
+            (*image)->fuzz=StringToDoubleInterval(fuzz,(double) QuantumRange+1.0);
             break;
           }
           case ColorEditUndoCommand:
@@ -4091,7 +4091,7 @@
               GXinvert);
             if (*factor == '\0')
               break;
-            blend=InterpretLocaleValue(factor,(char **) NULL);
+            blend=StringToDouble(factor,(char **) NULL);
             compose=DissolveCompositeOp;
             break;
           }
@@ -7728,7 +7728,7 @@
       (void) XDialogWidget(display,windows,"Trim","Enter fuzz factor:",fuzz);
       if (*fuzz == '\0')
         break;
-      (*image)->fuzz=InterpretLocaleInterval(fuzz,(double) QuantumRange+1.0);
+      (*image)->fuzz=StringToDoubleInterval(fuzz,(double) QuantumRange+1.0);
       /*
         Trim image.
       */
@@ -8310,7 +8310,7 @@
       */
       XSetCursorState(display,windows,MagickTrue);
       XCheckRefreshWindows(display,windows);
-      threshold=InterpretLocaleInterval(factor,QuantumRange);
+      threshold=StringToDoubleInterval(factor,QuantumRange);
       (void) BilevelImage(*image,threshold,exception);
       XSetCursorState(display,windows,MagickFalse);
       if (windows->image.orphan != MagickFalse)
@@ -8512,7 +8512,7 @@
       */
       XSetCursorState(display,windows,MagickTrue);
       XCheckRefreshWindows(display,windows);
-      threshold=InterpretLocaleInterval(factor,QuantumRange);
+      threshold=StringToDoubleInterval(factor,QuantumRange);
       sepia_image=SepiaToneImage(*image,threshold,exception);
       if (sepia_image != (Image *) NULL)
         {
@@ -8547,7 +8547,7 @@
       */
       XSetCursorState(display,windows,MagickTrue);
       XCheckRefreshWindows(display,windows);
-      threshold=InterpretLocaleInterval(factor,QuantumRange);
+      threshold=StringToDoubleInterval(factor,QuantumRange);
       (void) SolarizeImage(*image,threshold,exception);
       XSetCursorState(display,windows,MagickFalse);
       if (windows->image.orphan != MagickFalse)
@@ -9864,7 +9864,7 @@
               break;
             if (entry != 5)
               {
-                (*image)->fuzz=InterpretLocaleInterval(FuzzMenu[entry],(double)
+                (*image)->fuzz=StringToDoubleInterval(FuzzMenu[entry],(double)
                   QuantumRange+1.0);
                 break;
               }
@@ -9874,7 +9874,7 @@
             if (*fuzz == '\0')
               break;
             (void) ConcatenateMagickString(fuzz,"%",MaxTextExtent);
-            (*image)->fuzz=InterpretLocaleInterval(fuzz,(double) QuantumRange+1.0);
+            (*image)->fuzz=StringToDoubleInterval(fuzz,(double) QuantumRange+1.0);
             break;
           }
           case MatteEditValueCommand:
@@ -10178,7 +10178,7 @@
               }
             draw_info=CloneDrawInfo(resource_info->image_info,
               (DrawInfo *) NULL);
-            draw_info->fill.alpha=ClampToQuantum(InterpretLocaleValue(matte,
+            draw_info->fill.alpha=ClampToQuantum(StringToDouble(matte,
               (char **) NULL));
             channel_mask=SetPixelChannelMask(*image,AlphaChannel); 
             (void) FloodfillPaintImage(*image,draw_info,&target,(ssize_t)
diff --git a/MagickCore/distort.c b/MagickCore/distort.c
index daade12..2c24a8b 100644
--- a/MagickCore/distort.c
+++ b/MagickCore/distort.c
@@ -2189,7 +2189,7 @@
     artifact=GetImageArtifact(image,"distort:scale");
     output_scaling = 1.0;
     if (artifact != (const char *) NULL) {
-      output_scaling = fabs(InterpretLocaleValue(artifact,(char **) NULL));
+      output_scaling = fabs(StringToDouble(artifact,(char **) NULL));
       geometry.width  *= (size_t) output_scaling;
       geometry.height *= (size_t) output_scaling;
       geometry.x      *= (ssize_t) output_scaling;
diff --git a/MagickCore/draw.c b/MagickCore/draw.c
index f3f141f..7ba5d51 100644
--- a/MagickCore/draw.c
+++ b/MagickCore/draw.c
@@ -1652,7 +1652,7 @@
   double
     value;
 
-  value=InterpretLocaleValue(point,&p);
+  value=StringToDouble(point,&p);
   return((value == 0.0) && (p == point) ? MagickFalse : MagickTrue);
 }
 
@@ -1819,27 +1819,27 @@
         if (LocaleCompare("affine",keyword) == 0)
           {
             GetMagickToken(q,&q,token);
-            affine.sx=InterpretLocaleValue(token,(char **) NULL);
+            affine.sx=StringToDouble(token,(char **) NULL);
             GetMagickToken(q,&q,token);
             if (*token == ',')
               GetMagickToken(q,&q,token);
-            affine.rx=InterpretLocaleValue(token,(char **) NULL);
+            affine.rx=StringToDouble(token,(char **) NULL);
             GetMagickToken(q,&q,token);
             if (*token == ',')
               GetMagickToken(q,&q,token);
-            affine.ry=InterpretLocaleValue(token,(char **) NULL);
+            affine.ry=StringToDouble(token,(char **) NULL);
             GetMagickToken(q,&q,token);
             if (*token == ',')
               GetMagickToken(q,&q,token);
-            affine.sy=InterpretLocaleValue(token,(char **) NULL);
+            affine.sy=StringToDouble(token,(char **) NULL);
             GetMagickToken(q,&q,token);
             if (*token == ',')
               GetMagickToken(q,&q,token);
-            affine.tx=InterpretLocaleValue(token,(char **) NULL);
+            affine.tx=StringToDouble(token,(char **) NULL);
             GetMagickToken(q,&q,token);
             if (*token == ',')
               GetMagickToken(q,&q,token);
-            affine.ty=InterpretLocaleValue(token,(char **) NULL);
+            affine.ty=StringToDouble(token,(char **) NULL);
             break;
           }
         if (LocaleCompare("arc",keyword) == 0)
@@ -2006,7 +2006,7 @@
             GetMagickToken(q,&q,token);
             factor=strchr(token,'%') != (char *) NULL ? 0.01 : 1.0;
             graphic_context[n]->fill.alpha=(MagickRealType) QuantumRange*
-              factor*InterpretLocaleValue(token,(char **) NULL);
+              factor*StringToDouble(token,(char **) NULL);
             break;
           }
         if (LocaleCompare("fill-rule",keyword) == 0)
@@ -2041,7 +2041,7 @@
         if (LocaleCompare("font-size",keyword) == 0)
           {
             GetMagickToken(q,&q,token);
-            graphic_context[n]->pointsize=InterpretLocaleValue(token,
+            graphic_context[n]->pointsize=StringToDouble(token,
               (char **) NULL);
             break;
           }
@@ -2136,14 +2136,14 @@
         if (LocaleCompare("interline-spacing",keyword) == 0)
           {
             GetMagickToken(q,&q,token);
-            graphic_context[n]->interline_spacing=InterpretLocaleValue(token,
+            graphic_context[n]->interline_spacing=StringToDouble(token,
               (char **) NULL);
             break;
           }
         if (LocaleCompare("interword-spacing",keyword) == 0)
           {
             GetMagickToken(q,&q,token);
-            graphic_context[n]->interword_spacing=InterpretLocaleValue(token,
+            graphic_context[n]->interword_spacing=StringToDouble(token,
               (char **) NULL);
             break;
           }
@@ -2156,7 +2156,7 @@
         if (LocaleCompare("kerning",keyword) == 0)
           {
             GetMagickToken(q,&q,token);
-            graphic_context[n]->kerning=InterpretLocaleValue(token,
+            graphic_context[n]->kerning=StringToDouble(token,
               (char **) NULL);
             break;
           }
@@ -2195,7 +2195,7 @@
             factor=strchr(token,'%') != (char *) NULL ? 0.01 : 1.0;
             graphic_context[n]->alpha=ClampToQuantum((MagickRealType)
               QuantumRange*(1.0-((1.0-QuantumScale*graphic_context[n]->alpha)*
-              factor*InterpretLocaleValue(token,(char **) NULL))));
+              factor*StringToDouble(token,(char **) NULL))));
             graphic_context[n]->fill.alpha=(double) graphic_context[n]->alpha;
             graphic_context[n]->stroke.alpha=(double) graphic_context[n]->alpha;
             break;
@@ -2297,19 +2297,19 @@
                 GetMagickToken(q,&q,token);
                 (void) CopyMagickString(type,token,MaxTextExtent);
                 GetMagickToken(q,&q,token);
-                segment.x1=InterpretLocaleValue(token,(char **) NULL);
+                segment.x1=StringToDouble(token,(char **) NULL);
                 GetMagickToken(q,&q,token);
                 if (*token == ',')
                   GetMagickToken(q,&q,token);
-                segment.y1=InterpretLocaleValue(token,(char **) NULL);
+                segment.y1=StringToDouble(token,(char **) NULL);
                 GetMagickToken(q,&q,token);
                 if (*token == ',')
                   GetMagickToken(q,&q,token);
-                segment.x2=InterpretLocaleValue(token,(char **) NULL);
+                segment.x2=StringToDouble(token,(char **) NULL);
                 GetMagickToken(q,&q,token);
                 if (*token == ',')
                   GetMagickToken(q,&q,token);
-                segment.y2=InterpretLocaleValue(token,(char **) NULL);
+                segment.y2=StringToDouble(token,(char **) NULL);
                 if (LocaleCompare(type,"radial") == 0)
                   {
                     GetMagickToken(q,&q,token);
@@ -2359,22 +2359,22 @@
                 GetMagickToken(q,&q,token);
                 (void) CopyMagickString(name,token,MaxTextExtent);
                 GetMagickToken(q,&q,token);
-                bounds.x=(ssize_t) ceil(InterpretLocaleValue(token,
+                bounds.x=(ssize_t) ceil(StringToDouble(token,
                   (char **) NULL)-0.5);
                 GetMagickToken(q,&q,token);
                 if (*token == ',')
                   GetMagickToken(q,&q,token);
-                bounds.y=(ssize_t) ceil(InterpretLocaleValue(token,
+                bounds.y=(ssize_t) ceil(StringToDouble(token,
                   (char **) NULL)-0.5);
                 GetMagickToken(q,&q,token);
                 if (*token == ',')
                   GetMagickToken(q,&q,token);
-                bounds.width=(size_t) floor(InterpretLocaleValue(token,
+                bounds.width=(size_t) floor(StringToDouble(token,
                   (char **) NULL)+0.5);
                 GetMagickToken(q,&q,token);
                 if (*token == ',')
                   GetMagickToken(q,&q,token);
-                bounds.height=(size_t) floor(InterpretLocaleValue(token,
+                bounds.height=(size_t) floor(StringToDouble(token,
                   (char **) NULL)+0.5);
                 for (p=q; *q != '\0'; )
                 {
@@ -2432,7 +2432,7 @@
         if (LocaleCompare("rotate",keyword) == 0)
           {
             GetMagickToken(q,&q,token);
-            angle=InterpretLocaleValue(token,(char **) NULL);
+            angle=StringToDouble(token,(char **) NULL);
             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))));
@@ -2453,24 +2453,24 @@
         if (LocaleCompare("scale",keyword) == 0)
           {
             GetMagickToken(q,&q,token);
-            affine.sx=InterpretLocaleValue(token,(char **) NULL);
+            affine.sx=StringToDouble(token,(char **) NULL);
             GetMagickToken(q,&q,token);
             if (*token == ',')
               GetMagickToken(q,&q,token);
-            affine.sy=InterpretLocaleValue(token,(char **) NULL);
+            affine.sy=StringToDouble(token,(char **) NULL);
             break;
           }
         if (LocaleCompare("skewX",keyword) == 0)
           {
             GetMagickToken(q,&q,token);
-            angle=InterpretLocaleValue(token,(char **) NULL);
+            angle=StringToDouble(token,(char **) NULL);
             affine.ry=sin(DegreesToRadians(angle));
             break;
           }
         if (LocaleCompare("skewY",keyword) == 0)
           {
             GetMagickToken(q,&q,token);
-            angle=InterpretLocaleValue(token,(char **) NULL);
+            angle=StringToDouble(token,(char **) NULL);
             affine.rx=(-tan(DegreesToRadians(angle)/2.0));
             break;
           }
@@ -2557,7 +2557,7 @@
                   GetMagickToken(q,&q,token);
                   if (*token == ',')
                     GetMagickToken(q,&q,token);
-                  graphic_context[n]->dash_pattern[j]=InterpretLocaleValue(
+                  graphic_context[n]->dash_pattern[j]=StringToDouble(
                     token,(char **) NULL);
                 }
                 if ((x & 0x01) != 0)
@@ -2573,7 +2573,7 @@
         if (LocaleCompare("stroke-dashoffset",keyword) == 0)
           {
             GetMagickToken(q,&q,token);
-            graphic_context[n]->dash_offset=InterpretLocaleValue(token,
+            graphic_context[n]->dash_offset=StringToDouble(token,
               (char **) NULL);
             break;
           }
@@ -2615,13 +2615,13 @@
             GetMagickToken(q,&q,token);
             factor=strchr(token,'%') != (char *) NULL ? 0.01 : 1.0;
             graphic_context[n]->stroke.alpha=(MagickRealType) QuantumRange*
-              factor*InterpretLocaleValue(token,(char **) NULL);
+              factor*StringToDouble(token,(char **) NULL);
             break;
           }
         if (LocaleCompare("stroke-width",keyword) == 0)
           {
             GetMagickToken(q,&q,token);
-            graphic_context[n]->stroke_width=InterpretLocaleValue(token,
+            graphic_context[n]->stroke_width=StringToDouble(token,
               (char **) NULL);
             break;
           }
@@ -2679,11 +2679,11 @@
         if (LocaleCompare("translate",keyword) == 0)
           {
             GetMagickToken(q,&q,token);
-            affine.tx=InterpretLocaleValue(token,(char **) NULL);
+            affine.tx=StringToDouble(token,(char **) NULL);
             GetMagickToken(q,&q,token);
             if (*token == ',')
               GetMagickToken(q,&q,token);
-            affine.ty=InterpretLocaleValue(token,(char **) NULL);
+            affine.ty=StringToDouble(token,(char **) NULL);
             break;
           }
         status=MagickFalse;
@@ -2695,23 +2695,23 @@
         if (LocaleCompare("viewbox",keyword) == 0)
           {
             GetMagickToken(q,&q,token);
-            graphic_context[n]->viewbox.x=(ssize_t) ceil(InterpretLocaleValue(
+            graphic_context[n]->viewbox.x=(ssize_t) ceil(StringToDouble(
               token,(char **) NULL)-0.5);
             GetMagickToken(q,&q,token);
             if (*token == ',')
               GetMagickToken(q,&q,token);
-            graphic_context[n]->viewbox.y=(ssize_t) ceil(InterpretLocaleValue(
+            graphic_context[n]->viewbox.y=(ssize_t) ceil(StringToDouble(
               token,(char **) NULL)-0.5);
             GetMagickToken(q,&q,token);
             if (*token == ',')
               GetMagickToken(q,&q,token);
             graphic_context[n]->viewbox.width=(size_t) floor(
-              InterpretLocaleValue(token,(char **) NULL)+0.5);
+              StringToDouble(token,(char **) NULL)+0.5);
             GetMagickToken(q,&q,token);
             if (*token == ',')
               GetMagickToken(q,&q,token);
             graphic_context[n]->viewbox.height=(size_t) floor(
-              InterpretLocaleValue(token,(char **) NULL)+0.5);
+              StringToDouble(token,(char **) NULL)+0.5);
             break;
           }
         status=MagickFalse;
@@ -2759,11 +2759,11 @@
       if (IsPoint(q) == MagickFalse)
         break;
       GetMagickToken(q,&q,token);
-      point.x=InterpretLocaleValue(token,(char **) NULL);
+      point.x=StringToDouble(token,(char **) NULL);
       GetMagickToken(q,&q,token);
       if (*token == ',')
         GetMagickToken(q,&q,token);
-      point.y=InterpretLocaleValue(token,(char **) NULL);
+      point.y=StringToDouble(token,(char **) NULL);
       GetMagickToken(q,(const char **) NULL,token);
       if (*token == ',')
         GetMagickToken(q,&q,token);
@@ -2845,7 +2845,7 @@
           double
             value;
 
-          value=InterpretLocaleValue(s,&t);
+          value=StringToDouble(s,&t);
           (void) value;
           if (s == t)
             {
@@ -4783,14 +4783,14 @@
         (void) CloneString(&draw_info->encoding,option);
       option=GetImageOption(image_info,"kerning");
       if (option != (const char *) NULL)
-        draw_info->kerning=InterpretLocaleValue(option,(char **) NULL);
+        draw_info->kerning=StringToDouble(option,(char **) NULL);
       option=GetImageOption(image_info,"interline-spacing");
       if (option != (const char *) NULL)
-        draw_info->interline_spacing=InterpretLocaleValue(option,
+        draw_info->interline_spacing=StringToDouble(option,
           (char **) NULL);
       option=GetImageOption(image_info,"interword-spacing");
       if (option != (const char *) NULL)
-        draw_info->interword_spacing=InterpretLocaleValue(option,
+        draw_info->interword_spacing=StringToDouble(option,
           (char **) NULL);
       option=GetImageOption(image_info,"direction");
       if (option != (const char *) NULL)
@@ -4808,7 +4808,7 @@
           exception);
       option=GetImageOption(image_info,"strokewidth");
       if (option != (const char *) NULL)
-        draw_info->stroke_width=InterpretLocaleValue(option,(char **) NULL);
+        draw_info->stroke_width=StringToDouble(option,(char **) NULL);
       option=GetImageOption(image_info,"undercolor");
       if (option != (const char *) NULL)
         (void) QueryColorCompliance(option,AllCompliance,&draw_info->undercolor,
@@ -5286,15 +5286,15 @@
           GetMagickToken(p,&p,token);
           if (*token == ',')
             GetMagickToken(p,&p,token);
-          arc.x=InterpretLocaleValue(token,(char **) NULL);
+          arc.x=StringToDouble(token,(char **) NULL);
           GetMagickToken(p,&p,token);
           if (*token == ',')
             GetMagickToken(p,&p,token);
-          arc.y=InterpretLocaleValue(token,(char **) NULL);
+          arc.y=StringToDouble(token,(char **) NULL);
           GetMagickToken(p,&p,token);
           if (*token == ',')
             GetMagickToken(p,&p,token);
-          angle=InterpretLocaleValue(token,(char **) NULL);
+          angle=StringToDouble(token,(char **) NULL);
           GetMagickToken(p,&p,token);
           if (*token == ',')
             GetMagickToken(p,&p,token);
@@ -5306,11 +5306,11 @@
           GetMagickToken(p,&p,token);
           if (*token == ',')
             GetMagickToken(p,&p,token);
-          x=InterpretLocaleValue(token,(char **) NULL);
+          x=StringToDouble(token,(char **) NULL);
           GetMagickToken(p,&p,token);
           if (*token == ',')
             GetMagickToken(p,&p,token);
-          y=InterpretLocaleValue(token,(char **) NULL);
+          y=StringToDouble(token,(char **) NULL);
           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);
@@ -5333,11 +5333,11 @@
             GetMagickToken(p,&p,token);
             if (*token == ',')
               GetMagickToken(p,&p,token);
-            x=InterpretLocaleValue(token,(char **) NULL);
+            x=StringToDouble(token,(char **) NULL);
             GetMagickToken(p,&p,token);
             if (*token == ',')
               GetMagickToken(p,&p,token);
-            y=InterpretLocaleValue(token,(char **) NULL);
+            y=StringToDouble(token,(char **) NULL);
             end.x=(double) (attribute == (int) 'C' ? x : point.x+x);
             end.y=(double) (attribute == (int) 'C' ? y : point.y+y);
             points[i]=end;
@@ -5358,7 +5358,7 @@
           GetMagickToken(p,&p,token);
           if (*token == ',')
             GetMagickToken(p,&p,token);
-          x=InterpretLocaleValue(token,(char **) NULL);
+          x=StringToDouble(token,(char **) NULL);
           point.x=(double) (attribute == (int) 'H' ? x: point.x+x);
           TracePoint(q,point);
           q+=q->coordinates;
@@ -5373,11 +5373,11 @@
           GetMagickToken(p,&p,token);
           if (*token == ',')
             GetMagickToken(p,&p,token);
-          x=InterpretLocaleValue(token,(char **) NULL);
+          x=StringToDouble(token,(char **) NULL);
           GetMagickToken(p,&p,token);
           if (*token == ',')
             GetMagickToken(p,&p,token);
-          y=InterpretLocaleValue(token,(char **) NULL);
+          y=StringToDouble(token,(char **) NULL);
           point.x=(double) (attribute == (int) 'L' ? x : point.x+x);
           point.y=(double) (attribute == (int) 'L' ? y : point.y+y);
           TracePoint(q,point);
@@ -5400,11 +5400,11 @@
           GetMagickToken(p,&p,token);
           if (*token == ',')
             GetMagickToken(p,&p,token);
-          x=InterpretLocaleValue(token,(char **) NULL);
+          x=StringToDouble(token,(char **) NULL);
           GetMagickToken(p,&p,token);
           if (*token == ',')
             GetMagickToken(p,&p,token);
-          y=InterpretLocaleValue(token,(char **) NULL);
+          y=StringToDouble(token,(char **) NULL);
           point.x=(double) (attribute == (int) 'M' ? x : point.x+x);
           point.y=(double) (attribute == (int) 'M' ? y : point.y+y);
           if (i == 0)
@@ -5434,11 +5434,11 @@
             GetMagickToken(p,&p,token);
             if (*token == ',')
               GetMagickToken(p,&p,token);
-            x=InterpretLocaleValue(token,(char **) NULL);
+            x=StringToDouble(token,(char **) NULL);
             GetMagickToken(p,&p,token);
             if (*token == ',')
               GetMagickToken(p,&p,token);
-            y=InterpretLocaleValue(token,(char **) NULL);
+            y=StringToDouble(token,(char **) NULL);
             if (*p == ',')
               p++;
             end.x=(double) (attribute == (int) 'Q' ? x : point.x+x);
@@ -5469,11 +5469,11 @@
             GetMagickToken(p,&p,token);
             if (*token == ',')
               GetMagickToken(p,&p,token);
-            x=InterpretLocaleValue(token,(char **) NULL);
+            x=StringToDouble(token,(char **) NULL);
             GetMagickToken(p,&p,token);
             if (*token == ',')
               GetMagickToken(p,&p,token);
-            y=InterpretLocaleValue(token,(char **) NULL);
+            y=StringToDouble(token,(char **) NULL);
             if (*p == ',')
               p++;
             end.x=(double) (attribute == (int) 'S' ? x : point.x+x);
@@ -5509,11 +5509,11 @@
             GetMagickToken(p,&p,token);
             if (*token == ',')
               GetMagickToken(p,&p,token);
-            x=InterpretLocaleValue(token,(char **) NULL);
+            x=StringToDouble(token,(char **) NULL);
             GetMagickToken(p,&p,token);
             if (*token == ',')
               GetMagickToken(p,&p,token);
-            y=InterpretLocaleValue(token,(char **) NULL);
+            y=StringToDouble(token,(char **) NULL);
             end.x=(double) (attribute == (int) 'T' ? x : point.x+x);
             end.y=(double) (attribute == (int) 'T' ? y : point.y+y);
             points[i]=end;
@@ -5539,7 +5539,7 @@
           GetMagickToken(p,&p,token);
           if (*token == ',')
             GetMagickToken(p,&p,token);
-          y=InterpretLocaleValue(token,(char **) NULL);
+          y=StringToDouble(token,(char **) NULL);
           point.y=(double) (attribute == (int) 'V' ? y : point.y+y);
           TracePoint(q,point);
           q+=q->coordinates;
diff --git a/MagickCore/enhance.c b/MagickCore/enhance.c
index 1877b24..5514776 100644
--- a/MagickCore/enhance.c
+++ b/MagickCore/enhance.c
@@ -573,19 +573,19 @@
             {
               case 0:
               {
-                color_correction.red.slope=InterpretLocaleValue(token,
+                color_correction.red.slope=StringToDouble(token,
                   (char **) NULL);
                 break;
               }
               case 1:
               {
-                color_correction.green.slope=InterpretLocaleValue(token,
+                color_correction.green.slope=StringToDouble(token,
                   (char **) NULL);
                 break;
               }
               case 2:
               {
-                color_correction.blue.slope=InterpretLocaleValue(token,
+                color_correction.blue.slope=StringToDouble(token,
                   (char **) NULL);
                 break;
               }
@@ -606,19 +606,19 @@
             {
               case 0:
               {
-                color_correction.red.offset=InterpretLocaleValue(token,
+                color_correction.red.offset=StringToDouble(token,
                   (char **) NULL);
                 break;
               }
               case 1:
               {
-                color_correction.green.offset=InterpretLocaleValue(token,
+                color_correction.green.offset=StringToDouble(token,
                   (char **) NULL);
                 break;
               }
               case 2:
               {
-                color_correction.blue.offset=InterpretLocaleValue(token,
+                color_correction.blue.offset=StringToDouble(token,
                   (char **) NULL);
                 break;
               }
@@ -639,19 +639,19 @@
             {
               case 0:
               {
-                color_correction.red.power=InterpretLocaleValue(token,
+                color_correction.red.power=StringToDouble(token,
                   (char **) NULL);
                 break;
               }
               case 1:
               {
-                color_correction.green.power=InterpretLocaleValue(token,
+                color_correction.green.power=StringToDouble(token,
                   (char **) NULL);
                 break;
               }
               case 2:
               {
-                color_correction.blue.power=InterpretLocaleValue(token,
+                color_correction.blue.power=StringToDouble(token,
                   (char **) NULL);
                 break;
               }
@@ -671,7 +671,7 @@
           content=GetXMLTreeContent(saturation);
           p=(const char *) content;
           GetMagickToken(p,&p,token);
-          color_correction.saturation=InterpretLocaleValue(token,
+          color_correction.saturation=StringToDouble(token,
             (char **) NULL);
         }
     }
diff --git a/MagickCore/fx.c b/MagickCore/fx.c
index 981373f..afd3738 100644
--- a/MagickCore/fx.c
+++ b/MagickCore/fx.c
@@ -1175,7 +1175,7 @@
     (double) channel,symbol);
   value=(const char *) GetValueFromSplayTree(fx_info->symbols,key);
   if (value != (const char *) NULL)
-    return(QuantumScale*InterpretLocaleValue(value,(char **) NULL));
+    return(QuantumScale*StringToDouble(value,(char **) NULL));
   (void) DeleteNodeFromSplayTree(fx_info->symbols,key);
   if (LocaleNCompare(symbol,"depth",5) == 0)
     {
@@ -1242,7 +1242,7 @@
     }
   (void) AddValueToSplayTree(fx_info->symbols,ConstantString(key),
     ConstantString(statistic));
-  return(QuantumScale*InterpretLocaleValue(statistic,(char **) NULL));
+  return(QuantumScale*StringToDouble(statistic,(char **) NULL));
 }
 
 static MagickRealType
@@ -1835,7 +1835,7 @@
   }
   value=(const char *) GetValueFromSplayTree(fx_info->symbols,symbol);
   if (value != (const char *) NULL)
-    return((MagickRealType) InterpretLocaleValue(value,(char **) NULL));
+    return((MagickRealType) StringToDouble(value,(char **) NULL));
   (void) ThrowMagickException(exception,GetMagickModule(),OptionError,
     "UnableToParseExpression","`%s'",symbol);
   return(0.0);
@@ -2876,7 +2876,7 @@
       break;
   }
   q=(char *) expression;
-  alpha=InterpretLocaleValue(expression,&q);
+  alpha=InterpretSiPrefixValue(expression,&q);
   if (q == expression)
     return(FxGetSymbol(fx_info,channel,x,y,expression,exception));
   return(alpha);
diff --git a/MagickCore/geometry.c b/MagickCore/geometry.c
index d5ab414..fea3a26 100644
--- a/MagickCore/geometry.c
+++ b/MagickCore/geometry.c
@@ -192,7 +192,7 @@
   if (*p == '\0')
     return(flags);
   q=p;
-  value=InterpretLocaleValue(p,&q);
+  value=StringToDouble(p,&q);
   (void) value;
   if (LocaleNCompare(p,"0x",2) == 0)
     value=(double) strtol(p,&q,10);
@@ -206,7 +206,7 @@
       if (LocaleNCompare(p,"0x",2) == 0)
         *width=(size_t) strtol(p,&p,10);
       else
-        *width=(size_t) floor(InterpretLocaleValue(p,&p)+0.5);
+        *width=(size_t) floor(StringToDouble(p,&p)+0.5);
       if (p != q)
         flags|=WidthValue;
     }
@@ -221,7 +221,7 @@
             Parse height.
           */
           q=p;
-          *height=(size_t) floor(InterpretLocaleValue(p,&p)+0.5);
+          *height=(size_t) floor(StringToDouble(p,&p)+0.5);
           if (p != q)
             flags|=HeightValue;
         }
@@ -234,7 +234,7 @@
       if (*p == '-')
         flags|=XNegative;
       q=p;
-      *x=(ssize_t) ceil(InterpretLocaleValue(p,&p)-0.5);
+      *x=(ssize_t) ceil(StringToDouble(p,&p)-0.5);
       if (p != q)
         flags|=XValue;
       if ((*p == '+') || (*p == '-'))
@@ -245,7 +245,7 @@
           if (*p == '-')
             flags|=YNegative;
           q=p;
-          *y=(ssize_t) ceil(InterpretLocaleValue(p,&p)-0.5);
+          *y=(ssize_t) ceil(StringToDouble(p,&p)-0.5);
           if (p != q)
             flags|=YValue;
         }
@@ -560,7 +560,7 @@
   if (geometry == (const char *) NULL)
     return(MagickFalse);
   p=(char *) geometry;
-  value=InterpretLocaleValue(geometry,&p);
+  value=StringToDouble(geometry,&p);
   (void) value;
   if (p == geometry)
     return(MagickFalse);
@@ -671,33 +671,33 @@
     {
       case 0:
       {
-        affine_matrix->sx=InterpretLocaleValue(token,(char **) NULL);
+        affine_matrix->sx=StringToDouble(token,(char **) NULL);
         break;
       }
       case 1:
       {
-        affine_matrix->rx=InterpretLocaleValue(token,(char **) NULL);
+        affine_matrix->rx=StringToDouble(token,(char **) NULL);
         break;
       }
       case 2:
       {
-        affine_matrix->ry=InterpretLocaleValue(token,(char **) NULL);
+        affine_matrix->ry=StringToDouble(token,(char **) NULL);
         break;
       }
       case 3:
       {
-        affine_matrix->sy=InterpretLocaleValue(token,(char **) NULL);
+        affine_matrix->sy=StringToDouble(token,(char **) NULL);
         break;
       }
       case 4:
       {
-        affine_matrix->tx=InterpretLocaleValue(token,(char **) NULL);
+        affine_matrix->tx=StringToDouble(token,(char **) NULL);
         flags|=XValue;
         break;
       }
       case 5:
       {
-        affine_matrix->ty=InterpretLocaleValue(token,(char **) NULL);
+        affine_matrix->ty=StringToDouble(token,(char **) NULL);
         flags|=YValue;
         break;
       }
@@ -861,7 +861,7 @@
   if (*p == '\0')
     return(flags);
   q=p;
-  value=InterpretLocaleValue(p,&q);
+  value=StringToDouble(p,&q);
   if (LocaleNCompare(p,"0x",2) == 0)
     value=(double) strtol(p,&q,10);
   c=(int) ((unsigned char) *q);
@@ -875,7 +875,7 @@
       if (LocaleNCompare(p,"0x",2) == 0)
         value=(double) strtol(p,&p,10);
       else
-        value=InterpretLocaleValue(p,&p);
+        value=StringToDouble(p,&p);
       if (p != q)
         {
           flags|=RhoValue;
@@ -898,7 +898,7 @@
           (*p != '-')))
         {
           q=p;
-          value=InterpretLocaleValue(p,&p);
+          value=StringToDouble(p,&p);
           if (p != q)
             {
               flags|=SigmaValue;
@@ -916,7 +916,7 @@
       if ((*p == ',') || (*p == '/') || (*p == ':'))
         p++;
       q=p;
-      value=InterpretLocaleValue(p,&p);
+      value=StringToDouble(p,&p);
       if (p != q)
         {
           flags|=XiValue;
@@ -935,7 +935,7 @@
           if ((*p == ',') || (*p == '/') || (*p == ':'))
             p++;
           q=p;
-          value=InterpretLocaleValue(p,&p);
+          value=StringToDouble(p,&p);
           if (p != q)
             {
               flags|=PsiValue;
@@ -955,7 +955,7 @@
           if ((*p == ',') || (*p == '/') || (*p == ':'))
             p++;
           q=p;
-          value=InterpretLocaleValue(p,&p);
+          value=StringToDouble(p,&p);
           if (p != q)
             {
               flags|=ChiValue;
diff --git a/MagickCore/image.c b/MagickCore/image.c
index 2d54db2..e6c3055 100644
--- a/MagickCore/image.c
+++ b/MagickCore/image.c
@@ -4130,7 +4130,7 @@
       exception);
   option=GetImageOption(image_info,"bias");
   if (option != (const char *) NULL)
-    image->bias=InterpretLocaleInterval(option,QuantumRange);
+    image->bias=StringToDoubleInterval(option,QuantumRange);
   option=GetImageOption(image_info,"black-point-compensation");
   if (option != (const char *) NULL)
     image->black_point_compensation=(MagickBooleanType) ParseCommandOption(
@@ -4185,7 +4185,7 @@
       MagickFalse,option);
   option=GetImageOption(image_info,"fuzz");
   if (option != (const char *) NULL)
-    image->fuzz=InterpretLocaleInterval(option,(double) QuantumRange+1.0);
+    image->fuzz=StringToDoubleInterval(option,(double) QuantumRange+1.0);
   option=GetImageOption(image_info,"gravity");
   if (option != (const char *) NULL)
     image->gravity=(GravityType) ParseCommandOption(MagickGravityOptions,
diff --git a/MagickCore/locale.c b/MagickCore/locale.c
index 64a15d6..9668321 100644
--- a/MagickCore/locale.c
+++ b/MagickCore/locale.c
@@ -885,31 +885,6 @@
   double
     value;
 
-  static const double
-    SIPrefixes['z'-'E'+1] =
-    {
-      ['y'-'E'] = (-24.0),
-      ['z'-'E'] = (-21.0),
-      ['a'-'E'] = (-18.0),
-      ['f'-'E'] = (-15.0),
-      ['p'-'E'] = (-12.0),
-      ['n'-'E'] = (-9.0),
-      ['u'-'E'] = (-6.0),
-      ['m'-'E'] = (-3.0),
-      ['c'-'E'] = (-2.0),
-      ['d'-'E'] = (-1.0),
-      ['h'-'E'] = 2.0,
-      ['k'-'E'] = 3.0,
-      ['K'-'E'] = 3.0,
-      ['M'-'E'] = 6.0,
-      ['G'-'E'] = 9.0,
-      ['T'-'E'] = 12.0,
-      ['P'-'E'] = 15.0,
-      ['E'-'E'] = 18.0,
-      ['Z'-'E'] = 21.0,
-      ['Y'-'E'] = 24.0
-    };
-
   if ((*string == '0') && ((string[1] | 0x20)=='x'))
     value=(double) strtoul(string,&q,16);
   else
@@ -927,34 +902,6 @@
       value=strtod(string,&q);
 #endif
     }
-  if (q != string)
-    {
-      if ((*q >= 'E') && (*q <= 'z'))
-        {
-          double
-            e;
-
-          e=SIPrefixes[*q-'E'];
-          if (e >= MagickEpsilon)
-            {
-              if (q[1] == 'i')
-                {
-                  value*=pow(2.0,e/0.3);
-                  q+=2;
-                }
-              else
-                {
-                  value*=pow(10.0,e);
-                  q++;
-                }
-            }
-        }
-      if (*q == 'B')
-        {
-          value*=8.0;
-          q++;
-        }
-    }
   if (sentinal != (char **) NULL)
     *sentinal=q;
   return(value);
diff --git a/MagickCore/morphology.c b/MagickCore/morphology.c
index 139e3bf..743ce70 100644
--- a/MagickCore/morphology.c
+++ b/MagickCore/morphology.c
@@ -331,7 +331,7 @@
       kernel->values[i] = nan; /* do not include this value in kernel */
     }
     else {
-      kernel->values[i] = InterpretLocaleValue(token,(char **) NULL);
+      kernel->values[i] = StringToDouble(token,(char **) NULL);
       ( kernel->values[i] < 0)
           ?  ( kernel->negative_range += kernel->values[i] )
           :  ( kernel->positive_range += kernel->values[i] );
diff --git a/MagickCore/property.c b/MagickCore/property.c
index da7e19c..ce4a5f1 100644
--- a/MagickCore/property.c
+++ b/MagickCore/property.c
@@ -3200,7 +3200,7 @@
         }
       if (LocaleCompare(property,"bias") == 0)
         {
-          image->bias=InterpretLocaleInterval(value,QuantumRange);
+          image->bias=StringToDoubleInterval(value,QuantumRange);
           break;
         }
       status=AddValueToSplayTree((SplayTreeInfo *) image->properties,
diff --git a/MagickCore/quantum.c b/MagickCore/quantum.c
index 28ca73c..2b117d8 100644
--- a/MagickCore/quantum.c
+++ b/MagickCore/quantum.c
@@ -373,10 +373,10 @@
       MagickQuantumFormatOptions,MagickFalse,option);
   option=GetImageOption(image_info,"quantum:minimum");
   if (option != (char *) NULL)
-    quantum_info->minimum=InterpretLocaleValue(option,(char **) NULL);
+    quantum_info->minimum=StringToDouble(option,(char **) NULL);
   option=GetImageOption(image_info,"quantum:maximum");
   if (option != (char *) NULL)
-    quantum_info->maximum=InterpretLocaleValue(option,(char **) NULL);
+    quantum_info->maximum=StringToDouble(option,(char **) NULL);
   if ((quantum_info->minimum == 0.0) && (quantum_info->maximum == 0.0))
     quantum_info->scale=0.0;
   else
@@ -390,7 +390,7 @@
         quantum_info->minimum);
   option=GetImageOption(image_info,"quantum:scale");
   if (option != (char *) NULL)
-    quantum_info->scale=InterpretLocaleValue(option,(char **) NULL);
+    quantum_info->scale=StringToDouble(option,(char **) NULL);
   option=GetImageOption(image_info,"quantum:polarity");
   if (option != (char *) NULL)
     quantum_info->min_is_white=LocaleCompare(option,"min-is-white") == 0 ?
diff --git a/MagickCore/resize.c b/MagickCore/resize.c
index d243ed9..f9c59be 100644
--- a/MagickCore/resize.c
+++ b/MagickCore/resize.c
@@ -932,7 +932,7 @@
   }
   artifact=GetImageArtifact(image,"filter:sigma");
   if (artifact != (const char *) NULL)
-    sigma=InterpretLocaleValue(artifact,(char **) NULL);  /* override sigma */
+    sigma=StringToDouble(artifact,(char **) NULL);  /* override sigma */
   if (GaussianFilter)
     {
       /*
@@ -944,17 +944,19 @@
     }
   artifact=GetImageArtifact(image,"filter:blur");
   if (artifact != (const char *) NULL)
-    resize_filter->blur*=InterpretLocaleValue(artifact,
-      (char **) NULL);  /* override blur */
+    resize_filter->blur*=StringToDouble(artifact,(char **) NULL);  /* override blur */
   if (resize_filter->blur < MagickEpsilon)
     resize_filter->blur=(MagickRealType) MagickEpsilon;
   artifact=GetImageArtifact(image,"filter:lobes");
   if (artifact != (const char *) NULL)
     {
+      ssize_t
+        lobes;
+
       /*
         Override lobes.
       */
-      ssize_t lobes=(ssize_t) StringToLong(artifact);
+      lobes=(ssize_t) StringToLong(artifact);
       if (lobes < 1)
         lobes=1;
       resize_filter->support=(MagickRealType) lobes;
@@ -971,7 +973,7 @@
     }
   artifact=GetImageArtifact(image,"filter:support");
   if (artifact != (const char *) NULL)
-    resize_filter->support=fabs(InterpretLocaleValue(artifact,
+    resize_filter->support=fabs(StringToDouble(artifact,
       (char **) NULL)); /* override support */
   /*
     Scale windowing function separately to the support 'clipping' window that
@@ -980,7 +982,7 @@
   resize_filter->window_support=resize_filter->support; /* default */
   artifact=GetImageArtifact(image,"filter:win-support");
   if (artifact != (const char *) NULL)
-    resize_filter->window_support=fabs(InterpretLocaleValue(artifact,
+    resize_filter->window_support=fabs(StringToDouble(artifact,
       (char **) NULL));
   /*
     Adjust window function scaling to match windowing support for weighting
@@ -1005,18 +1007,18 @@
       artifact=GetImageArtifact(image,"filter:b");
       if (artifact != (const char *) NULL)
         {
-          B=InterpretLocaleValue(artifact,(char **) NULL);
+          B=StringToDouble(artifact,(char **) NULL);
           C=(1.0-B)/2.0; /* Calculate C to get a Keys cubic filter. */
           artifact=GetImageArtifact(image,"filter:c"); /* user C override */
           if (artifact != (const char *) NULL)
-            C=InterpretLocaleValue(artifact,(char **) NULL);
+            C=StringToDouble(artifact,(char **) NULL);
         }
       else
         {
           artifact=GetImageArtifact(image,"filter:c");
           if (artifact != (const char *) NULL)
             {
-              C=InterpretLocaleValue(artifact,(char **) NULL);
+              C=StringToDouble(artifact,(char **) NULL);
               B=1.0-2.0*C; /* Calculate B to get a Keys cubic filter. */
             }
         }
diff --git a/MagickCore/resource.c b/MagickCore/resource.c
index 1c417d0..b92e205 100644
--- a/MagickCore/resource.c
+++ b/MagickCore/resource.c
@@ -899,7 +899,7 @@
   double
     value;
 
-  value=InterpretLocaleInterval(string,interval);
+  value=StringToDoubleInterval(string,interval);
   if (value >= (double) MagickULLConstant(~0))
     return(MagickULLConstant(~0));
   return((MagickSizeType) value);
diff --git a/MagickCore/string-private.h b/MagickCore/string-private.h
index 47d4317..8c99324 100644
--- a/MagickCore/string-private.h
+++ b/MagickCore/string-private.h
@@ -22,7 +22,15 @@
 extern "C" {
 #endif
 
-static inline double InterpretLocaleInterval(const char *string,
+#include <MagickCore/locale_.h>
+
+static inline double StringToDouble(const char *restrict string,
+  char **restrict sentinal)
+{
+  return(InterpretLocaleValue(string,sentinal));
+}
+
+static inline double StringToDoubleInterval(const char *string,
   const double interval)
 {
   char
@@ -31,26 +39,23 @@
   double
     value;
 
-  /*
-    Interpret string with International System of Units (SI) unit prefix.
-  */
-  value=InterpretLocaleValue(string,&q);
+  value=InterpretSiPrefixValue(string,&q);
   if (*q == '%')
     value*=interval/100.0;
   return(value);
 }
 
-static inline int StringToInteger(const char *value)
+static inline int StringToInteger(const char *restrict value)
 {
   return((int) strtol(value,(char **) NULL,10));
 }
 
-static inline long StringToLong(const char *value)
+static inline long StringToLong(const char *restrict value)
 {
   return(strtol(value,(char **) NULL,10));
 }
 
-static inline unsigned long StringToUnsignedLong(const char *value)
+static inline unsigned long StringToUnsignedLong(const char *restrict value)
 {
   return(strtoul(value,(char **) NULL,10));
 }
diff --git a/MagickCore/string.c b/MagickCore/string.c
index dd6ded7..7fe1fac 100644
--- a/MagickCore/string.c
+++ b/MagickCore/string.c
@@ -1311,6 +1311,101 @@
 %                                                                             %
 %                                                                             %
 %                                                                             %
++   I n t e r p r e t S i P r e f i x V a l u e                               %
+%                                                                             %
+%                                                                             %
+%                                                                             %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+%  InterpretSiPrefixValue() converts the initial portion of the string to a
+%  double representation.  It also recognizes SI prefixes (e.g. B, KB, MiB,
+%  etc.).
+%
+%  The format of the InterpretSiPrefixValue method is:
+%
+%      double InterpretSiPrefixValue(const char *value,char **sentinal)
+%
+%  A description of each parameter follows:
+%
+%    o value: the string value.
+%
+%    o sentinal:  if sentinal is not NULL, return a pointer to the character
+%      after the last character used in the conversion.
+%
+*/
+MagickExport double InterpretSiPrefixValue(const char *restrict string,
+  char **restrict sentinal)
+{
+  char
+    *q;
+
+  double
+    value;
+
+  static const double
+    SIPrefixes['z'-'E'+1] =
+    {
+      ['y'-'E'] = (-24.0),
+      ['z'-'E'] = (-21.0),
+      ['a'-'E'] = (-18.0),
+      ['f'-'E'] = (-15.0),
+      ['p'-'E'] = (-12.0),
+      ['n'-'E'] = (-9.0),
+      ['u'-'E'] = (-6.0),
+      ['m'-'E'] = (-3.0),
+      ['c'-'E'] = (-2.0),
+      ['d'-'E'] = (-1.0),
+      ['h'-'E'] = 2.0,
+      ['k'-'E'] = 3.0,
+      ['K'-'E'] = 3.0,
+      ['M'-'E'] = 6.0,
+      ['G'-'E'] = 9.0,
+      ['T'-'E'] = 12.0,
+      ['P'-'E'] = 15.0,
+      ['E'-'E'] = 18.0,
+      ['Z'-'E'] = 21.0,
+      ['Y'-'E'] = 24.0
+    };
+
+  value=InterpretLocaleValue(string,&q);
+  if (q != string)
+    {
+      if ((*q >= 'E') && (*q <= 'z'))
+        {
+          double
+            e;
+
+          e=SIPrefixes[*q-'E'];
+          if (e >= MagickEpsilon)
+            {
+              if (q[1] == 'i')
+                {
+                  value*=pow(2.0,e/0.3);
+                  q+=2;
+                }
+              else
+                {
+                  value*=pow(10.0,e);
+                  q++;
+                }
+            }
+        }
+      if (*q == 'B')
+        {
+          value*=8.0;
+          q++;
+        }
+    }
+  if (sentinal != (char **) NULL)
+    *sentinal=q;
+  return(value);
+}
+
+/*
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%                                                                             %
+%                                                                             %
+%                                                                             %
 %   L o c a l e C o m p a r e                                                 %
 %                                                                             %
 %                                                                             %
diff --git a/MagickCore/string_.h b/MagickCore/string_.h
index fd91415..712e863 100644
--- a/MagickCore/string_.h
+++ b/MagickCore/string_.h
@@ -57,6 +57,9 @@
 extern MagickExport const char
   *GetStringInfoPath(const StringInfo *);
 
+extern MagickExport double
+  InterpretSiPrefixValue(const char *restrict,char **restrict);
+
 extern MagickExport int
   CompareStringInfo(const StringInfo *,const StringInfo *),
   LocaleCompare(const char *,const char *),
diff --git a/MagickCore/threshold.c b/MagickCore/threshold.c
index e42e3ab..cb200c6 100644
--- a/MagickCore/threshold.c
+++ b/MagickCore/threshold.c
@@ -1273,7 +1273,7 @@
       GetMagickToken(p,&p,token);
       if (*token == ',')
         GetMagickToken(p,&p,token);
-      levels[i]=InterpretLocaleValue(token,(char **) NULL);
+      levels[i]=StringToDouble(token,(char **) NULL);
     }
   for (i=0; i < MaxPixelChannels; i++)
     if (fabs(levels[i]) >= 1)
diff --git a/MagickCore/token.c b/MagickCore/token.c
index fbc732d..73deea4 100644
--- a/MagickCore/token.c
+++ b/MagickCore/token.c
@@ -230,7 +230,7 @@
         char
           *q;
 
-        value=InterpretLocaleValue(p,&q);
+        value=StringToDouble(p,&q);
         (void) value;
         if ((p != q) && (*p != ','))
           {