summary refs log tree commit diff stats
path: root/lib
diff options
context:
space:
mode:
authorkatlogic <kat@lua.cz>2014-06-15 01:49:14 +0200
committerkatlogic <kat@lua.cz>2014-06-15 01:49:14 +0200
commitcea2a9087d44378802c77ba041a4f54cd7b6087d (patch)
tree30844dae39c7c99307fcd5a37aabe049414de049 /lib
parentd927eb5854e9c6c005344bc81d4632ffc8f5d975 (diff)
downloadNim-cea2a9087d44378802c77ba041a4f54cd7b6087d.tar.gz
More human readable `$`(float)
The output matches that of Python (eg 1e100, not 1.0e100), but also
reflects locale (assuming it was set using setlocale() before).
Diffstat (limited to 'lib')
-rw-r--r--lib/system/ansi_c.nim5
-rw-r--r--lib/system/repr.nim4
-rw-r--r--lib/system/sysstr.nim14
3 files changed, 16 insertions, 7 deletions
diff --git a/lib/system/ansi_c.nim b/lib/system/ansi_c.nim
index 5111bc3cf..da101cc2c 100644
--- a/lib/system/ansi_c.nim
+++ b/lib/system/ansi_c.nim
@@ -106,10 +106,13 @@ proc c_fopen(filename, mode: cstring): C_TextFileStar {.
   importc: "fopen", header: "<stdio.h>".}
 proc c_fclose(f: C_TextFileStar) {.importc: "fclose", header: "<stdio.h>".}
 
-proc c_sprintf(buf, frmt: cstring) {.header: "<stdio.h>", 
+proc c_sprintf(buf, frmt: cstring): int {.header: "<stdio.h>", 
   importc: "sprintf", varargs, noSideEffect.}
   # we use it only in a way that cannot lead to security issues
 
+proc c_localeconv():ptr cstring {.header: "<locale.h>",
+  importc: "localeconv", noSideEffect.}
+
 proc c_fread(buf: pointer, size, n: int, f: C_BinaryFileStar): int {.
   importc: "fread", header: "<stdio.h>".}
 proc c_fseek(f: C_BinaryFileStar, offset: clong, whence: int): int {.
diff --git a/lib/system/repr.nim b/lib/system/repr.nim
index 487bac052..f8f949668 100644
--- a/lib/system/repr.nim
+++ b/lib/system/repr.nim
@@ -17,12 +17,12 @@ proc reprFloat(x: float): string {.compilerproc.} = return $x
 
 proc reprPointer(x: pointer): string {.compilerproc.} =
   var buf: array [0..59, char]
-  c_sprintf(buf, "%p", x)
+  discard c_sprintf(buf, "%p", x)
   return $buf
 
 proc `$`(x: uint64): string =
   var buf: array [0..59, char]
-  c_sprintf(buf, "%llu", x)
+  discard c_sprintf(buf, "%llu", x)
   return $buf
 
 proc reprStrAux(result: var string, s: string) =
diff --git a/lib/system/sysstr.nim b/lib/system/sysstr.nim
index 4244bae4c..183ea0c8d 100644
--- a/lib/system/sysstr.nim
+++ b/lib/system/sysstr.nim
@@ -250,10 +250,16 @@ proc nimIntToStr(x: int): string {.compilerRtl.} =
   for j in 0..i div 2 - 1:
     swap(result[j], result[i-j-1])
 
-proc nimFloatToStr(x: float): string {.compilerproc.} =
-  var buf: array [0..59, char]
-  c_sprintf(buf, "%#.16e", x)
-  return $buf
+proc nimFloatToStr(f: float): string {.compilerproc.} =
+  var buf: array [0..64, char]
+  var n:int = c_sprintf(buf, "%.16g", f)
+  for i in 0..n-1:
+    if buf[i] notin {'0'..'9','-'}:
+      return $buf
+  buf[n] = c_localeconv()[0]
+  buf[n+1] = '0'
+  buf[n+2] = '\0'
+  result = $buf
 
 proc nimInt64ToStr(x: int64): string {.compilerRtl.} =
   result = newString(sizeof(x)*4)