diff --git a/grails-app/services/au/org/ala/spatial/GridCutterService.groovy b/grails-app/services/au/org/ala/spatial/GridCutterService.groovy
index ac8f6a5..a7e7d37 100644
--- a/grails-app/services/au/org/ala/spatial/GridCutterService.groovy
+++ b/grails-app/services/au/org/ala/spatial/GridCutterService.groovy
@@ -525,7 +525,7 @@ class GridCutterService {
             res = res * 2
         }
         if (res != Double.parseDouble(resolution)) {
-            resolution = String.format("%f", res)
+            resolution = String.format(Locale.US, "%f", res)
         }
 
         //get mask and adjust extents for filter
diff --git a/grails-app/services/au/org/ala/spatial/TabulationService.groovy b/grails-app/services/au/org/ala/spatial/TabulationService.groovy
index cf08d90..27b7a78 100644
--- a/grails-app/services/au/org/ala/spatial/TabulationService.groovy
+++ b/grails-app/services/au/org/ala/spatial/TabulationService.groovy
@@ -79,7 +79,7 @@ class TabulationService {
             String value = null
             if (func == "area") {
                 //sq km
-                value = String.format("%.1f", t.getArea())
+                value = String.format(Locale.US, "%.1f", t.getArea())
             } else if (func == "occurrences") {
                 value = String.valueOf(t.getOccurrences())
             } else if (func == "species") {
diff --git a/src/main/groovy/au/org/ala/spatial/Util.groovy b/src/main/groovy/au/org/ala/spatial/Util.groovy
index da464c6..2f840b3 100644
--- a/src/main/groovy/au/org/ala/spatial/Util.groovy
+++ b/src/main/groovy/au/org/ala/spatial/Util.groovy
@@ -254,11 +254,11 @@ class Util {
             String[] lines = new String[ja.size() + 1]
             lines[0] = "SPCODE,SCIENTIFIC_NAME,AUTHORITY_FULL,COMMON_NAME,FAMILY,GENUS_NAME,SPECIFIC_NAME,MIN_DEPTH,MAX_DEPTH,METADATA_URL,LSID,AREA_NAME,AREA_SQ_KM"
             ja.eachWithIndex {Distributions it, int idx ->
-                String intersectArea = String.format("%.2f", Math.round(it.intersectArea ?: 0) as Double / 1000000.0)
+                String intersectArea = String.format(Locale.US, "%.2f", Math.round(it.intersectArea ?: 0) as Double / 1000000.0)
 
                 lines[idx + 1] = it.spcode + "," + wrap(it.scientific) + "," + wrap(it.authority_) + "," + wrap(it.common_nam) + "," +
                     wrap(it.family) + "," + wrap(it.genus_name) + "," + wrap(it.specific_n) + "," + (it.min_depth ?: "") + "," + (it.max_depth ?: "") +
-                        "," + wrap(it.metadata_u) + "," + wrap(it.lsid) + "," + wrap(it.area_name) + "," + String.format("%.2f", (it.area_km ?: 0) as Double) +
+                        "," + wrap(it.metadata_u) + "," + wrap(it.lsid) + "," + wrap(it.area_name) + "," + String.format(Locale.US, "%.2f", (it.area_km ?: 0) as Double) +
                         "," + wrap(it.data_resource_uid) + "," + intersectArea
             }
 
@@ -278,7 +278,7 @@ class Util {
                 String key = wrap(it.family) + "," + wrap(it.scientific) + "," + wrap(it.common_nam) + "," + wrap(it.lsid)
 
                 String areaName = it.area_name
-                String intersectArea = String.format("%.2f", Math.round(it.intersectArea ?: 0) as Double / 1000000)
+                String intersectArea = String.format(Locale.US, "%.2f", Math.round(it.intersectArea ?: 0) as Double / 1000000)
 
                 if (areaName.toLowerCase().contains("likely")) likely.put(key, intersectArea)
                 if (areaName.toLowerCase().contains("maybe")) maybe.put(key, intersectArea)
diff --git a/src/main/groovy/au/org/ala/spatial/intersect/Grid.groovy b/src/main/groovy/au/org/ala/spatial/intersect/Grid.groovy
index 3533305..5a4569e 100644
--- a/src/main/groovy/au/org/ala/spatial/intersect/Grid.groovy
+++ b/src/main/groovy/au/org/ala/spatial/intersect/Grid.groovy
@@ -1087,10 +1087,10 @@ class Grid { //  implements Serializable
             fw.append("\r\n").append("Mapunits=DEGREES")
             fw.append("\r\n").append("Columns=").append(String.valueOf(ncols))
             fw.append("\r\n").append("Rows=").append(String.valueOf(nrows))
-            fw.append("\r\n").append("MinX=").append(String.format("%.2f", xmin))
-            fw.append("\r\n").append("MaxX=").append(String.format("%.2f", xmax))
-            fw.append("\r\n").append("MinY=").append(String.format("%.2f", ymin))
-            fw.append("\r\n").append("MaxY=").append(String.format("%.2f", ymax))
+            fw.append("\r\n").append("MinX=").append(String.format(Locale.US, "%.2f", xmin))
+            fw.append("\r\n").append("MaxX=").append(String.format(Locale.US, "%.2f", xmax))
+            fw.append("\r\n").append("MinY=").append(String.format(Locale.US, "%.2f", ymin))
+            fw.append("\r\n").append("MaxY=").append(String.format(Locale.US, "%.2f", ymax))
             fw.append("\r\n").append("ResolutionX=").append(String.valueOf(xres))
             fw.append("\r\n").append("ResolutionY=").append(String.valueOf(yres))
             fw.append("\r\n").append("[Data]")
diff --git a/src/main/groovy/au/org/ala/spatial/process/AooEoo.groovy b/src/main/groovy/au/org/ala/spatial/process/AooEoo.groovy
index e8639c8..2bc5e4b 100644
--- a/src/main/groovy/au/org/ala/spatial/process/AooEoo.groovy
+++ b/src/main/groovy/au/org/ala/spatial/process/AooEoo.groovy
@@ -153,10 +153,10 @@ class AooEoo extends SlaveProcess {
                         '<table >' +
                         '<tr><td>Number of records used for the calculations</td><td>' + occurrenceCount + "</td></tr>" +
                         '<tr><td>Species</td><td>' + species.name + '</td></tr>' +
-                        "<tr><td>Area of Occupancy (AOO: ${gridSize} degree grid)</td><td>" + String.format('%.0f', aoo) + ' sq km</td></tr>' +
-                        '<tr><td>Area of Occupancy (Points with radius: ' + String.format("%.0f", radius) + 'm)</td><td>' + String.format('%.0f', circleArea) + ' sq km</td></tr>' +
-                        '<tr><td>Extent of Occurrence (EOO: Minimum convex hull)</td><td>' + (String.format('%.0f', eoo)) + ' sq km</td></tr>' +
-                        ((alphaHull != null) ? "<tr><td>Alpha Hull (Alpha: ${alpha})</td><td>" + String.format('%.0f', alphaHull) + ' sq km</td></tr>' : "") +
+                        "<tr><td>Area of Occupancy (AOO: ${gridSize} degree grid)</td><td>" + String.format(Locale.US, '%.0f', aoo) + ' sq km</td></tr>' +
+                        '<tr><td>Area of Occupancy (Points with radius: ' + String.format(Locale.US, "%.0f", radius) + 'm)</td><td>' + String.format(Locale.US, '%.0f', circleArea) + ' sq km</td></tr>' +
+                        '<tr><td>Extent of Occurrence (EOO: Minimum convex hull)</td><td>' + (String.format(Locale.US, '%.0f', eoo)) + ' sq km</td></tr>' +
+                        ((alphaHull != null) ? "<tr><td>Alpha Hull (Alpha: ${alpha})</td><td>" + String.format(Locale.US, '%.0f', alphaHull) + ' sq km</td></tr>' : "") +
                         '</table></body></html>' +
                         '</div>'
 
@@ -216,7 +216,7 @@ class AooEoo extends SlaveProcess {
             try {
                 //point=latitude,longitude
                 String[] ll = point.replace('\"', '').split(',')
-                String s = String.format('POINT(%.6f %.6f)', Double.parseDouble(ll[1]), Double.parseDouble(ll[0]))
+                String s = String.format(Locale.US, 'POINT(%.6f %.6f)', Double.parseDouble(ll[1]), Double.parseDouble(ll[0]))
                 if (pointCount > 0) {
                     sb.append(',')
                 }
@@ -277,7 +277,7 @@ class AooEoo extends SlaveProcess {
             float x = (float) point.x
             float y = (float) point.y
 
-            String s = String.format('((%.6f %.6f,%.6f %.6f,%.6f %.6f,%.6f %.6f,%.6f %.6f))',
+            String s = String.format(Locale.US, '((%.6f %.6f,%.6f %.6f,%.6f %.6f,%.6f %.6f,%.6f %.6f))',
                     x, y,
                     x, y + gridsize,
                     x + gridsize, y + gridsize,
diff --git a/src/main/groovy/au/org/ala/spatial/util/AreaReportPDF.groovy b/src/main/groovy/au/org/ala/spatial/util/AreaReportPDF.groovy
index e9aa167..e220ee8 100644
--- a/src/main/groovy/au/org/ala/spatial/util/AreaReportPDF.groovy
+++ b/src/main/groovy/au/org/ala/spatial/util/AreaReportPDF.groovy
@@ -745,9 +745,9 @@ class AreaReportPDF {
 
                     sb.append(StringEscapeUtils.escapeCsv(it.name1))
                     sb.append(",")
-                    sb.append(String.format("%.2f", it.area / 1000000.0))
+                    sb.append(String.format(Locale.US, "%.2f", it.area / 1000000.0))
                     sb.append(",")
-                    sb.append(String.format("%.2f", it.area / 1000000.0 / totalArea * 100))
+                    sb.append(String.format(Locale.US, "%.2f", it.area / 1000000.0 / totalArea * 100))
                     row++
                 }
             }