diff options
author | katlogic <kat@lua.cz> | 2014-06-15 01:49:14 +0200 |
---|---|---|
committer | katlogic <kat@lua.cz> | 2014-06-15 01:49:14 +0200 |
commit | cea2a9087d44378802c77ba041a4f54cd7b6087d (patch) | |
tree | 30844dae39c7c99307fcd5a37aabe049414de049 /lib | |
parent | d927eb5854e9c6c005344bc81d4632ffc8f5d975 (diff) | |
download | Nim-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.nim | 5 | ||||
-rw-r--r-- | lib/system/repr.nim | 4 | ||||
-rw-r--r-- | lib/system/sysstr.nim | 14 |
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) |