diff --git a/src/main.c b/src/main.c
index 71b7546fd4b0a88df0ebd86ffde6e90c7bc3f695..109f2a119b23585da1cff9997cff0c18a24581a8 100644
--- a/src/main.c
+++ b/src/main.c
@@ -246,6 +246,7 @@ static void init_nc() {
 /* main program */
 int main(int argc, char **argv) {
   setlocale(LC_ALL, "");
+  read_locale();
   argv_parse(argc, argv);
 
   if(dir_ui == 2)
diff --git a/src/util.c b/src/util.c
index 5da9db523dbeb2c76b663513903d66c83c8adaf1..137d16d3790d7eefee72de06fb8e3de25a10880e 100644
--- a/src/util.c
+++ b/src/util.c
@@ -28,9 +28,11 @@
 #include <string.h>
 #include <stdlib.h>
 #include <ncurses.h>
+#include <locale.h>
 
 int winrows, wincols;
 int subwinr, subwinc;
+char thou_sep;
 
 
 char *cropstr(const char *from, int s) {
@@ -88,7 +90,7 @@ char *fullsize(int64_t from) {
   while(i--) {
     dat[j++] = tmp[i];
     if(i != 0 && i%3 == 0)
-      dat[j++] = '.';
+      dat[j++] = thou_sep;
   }
   dat[j] = '\0';
 
@@ -96,6 +98,16 @@ char *fullsize(int64_t from) {
 }
 
 
+void read_locale() {
+  char *locale_thou_sep = localeconv()->thousands_sep;
+  if (locale_thou_sep && 1 == strlen(locale_thou_sep)) {
+    thou_sep = locale_thou_sep[0];
+  } else {
+    thou_sep = '.';
+  }
+}
+
+
 int ncresize(int minrows, int mincols) {
   int ch;
 
diff --git a/src/util.h b/src/util.h
index 933bf97acc2b00fa0ac2b7eb8fcbfe221c2eb005..d3b417f6a3f58ca54b8913d62220312f1b4aa98c 100644
--- a/src/util.h
+++ b/src/util.h
@@ -71,6 +71,9 @@ char *formatsize(int64_t );
 /* int2string with thousand separators */
 char *fullsize(int64_t);
 
+/* read locale information from the environment */
+void read_locale();
+
 /* recursively free()s a directory tree */
 void freedir(struct dir *);