Set the DECIMAL point character from the LC_NUMERIC
authorJohn Darrington <john@darrington.wattle.id.au>
Wed, 15 Oct 2008 03:02:01 +0000 (11:02 +0800)
committerJohn Darrington <john@darrington.wattle.id.au>
Wed, 15 Oct 2008 03:02:01 +0000 (11:02 +0800)
component of the current locale.

doc/utilities.texi
src/data/settings.c
src/libpspp/i18n.c
src/libpspp/i18n.h
tests/automake.mk

index 35ea20e2131d42cb4e660db4d29973a2a7408cea..d825b9abc4a5e0e6a676ecd2c258bbb5f7d06e77 100644 (file)
@@ -414,10 +414,13 @@ default.  Any real value may be assigned.
 
 @item DECIMAL
 @anchor{SET DECIMAL}
-The default DOT setting causes the decimal point character to be
-@samp{.} and the grouping character to be @samp{,}.  A setting of COMMA
+This value may be set to DOT or COMMA.
+Setting it to DOT causes the decimal point character to be
+@samp{.} and the grouping character to be @samp{,}.
+Setting it to COMMA
 causes the decimal point character to be @samp{,} and the grouping
 character to be @samp{.}.
+The default value is determined from the system locale.
 
 @item FORMAT
 Allows the default numeric input/output format to be specified.  The
index a87e3eff800f78a552232125fbec7af7ebe67527..ad509fb028059a6c6d3af86445a1bdb9e744ce08 100644 (file)
@@ -149,6 +149,8 @@ settings_init (int *width, int *length)
   settings_set_epoch (-1);
   i18n_init ();
   the_settings.styles = fmt_create ();
+
+  settings_set_decimal_char (get_system_decimal ());
 }
 
 void
index 70780eff968a6ec62c071da23229a4ebaac49fcc..bda2676c86788eabcfa24a937f7802cbe19c955d 100644 (file)
 #include <localcharset.h>
 #include "xstrndup.h"
 
+#if HAVE_NL_LANGINFO
+#include <langinfo.h>
+#endif
+
 
 static char *locale = 0;
 static const char *charset;
@@ -213,3 +217,32 @@ i18n_done (void)
     }
 }
 
+
+
+
+/* Return the system local's idea of the
+   decimal seperator character */
+char
+get_system_decimal (void)
+{
+  char *radix_char = NULL;
+
+  char *ol = setlocale (LC_NUMERIC, NULL);
+  setlocale (LC_NUMERIC, "");
+
+#if HAVE_NL_LANGINFO
+  radix_char = nl_langinfo (RADIXCHAR);
+#else
+  {
+    char *buf = xmalloc (10);
+    snprintf (buf, 10, "%f", 2.5);
+    radix_char = &buf[1];
+  }
+#endif
+
+  /* We MUST leave LC_NUMERIC untouched, since it would
+     otherwise interfere with data_{in,out} */
+  setlocale (LC_NUMERIC, ol);
+  return *radix_char;
+}
+
index 0633ebc82f807b9fb1d89429c3bf99fa9699930c..db15bad86940a955f0a0a942af548a8a7b177edb 100644 (file)
@@ -36,5 +36,8 @@ enum conv_id
 char * recode_string (enum conv_id how,  const char *text, int len);
 
 
+/* Return the decimal separator according to the
+   system locale */
+char get_system_decimal (void);
 
 #endif /* i18n.h */
index d8dd300ee3d3ede8cb75b529b57a928cc6ef54b9..082889cdedfe26d098dff3a4c9bd9196a59c7fe4 100644 (file)
@@ -6,6 +6,8 @@ TESTS_ENVIRONMENT += PERL='@PERL@' PG_CONFIG='@PG_CONFIG@'
 # Allow locale_charset to find charset.alias before running "make install".
 TESTS_ENVIRONMENT += CHARSETALIASDIR='$(abs_top_builddir)/gl'
 
+TESTS_ENVIRONMENT += LC_ALL=C
+
 dist_TESTS = \
        tests/command/aggregate.sh \
        tests/command/attributes.sh \