mirror of
https://github.com/nim-lang/Nim.git
synced 2026-01-01 10:52:14 +00:00
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).
This commit is contained in:
@@ -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 {.
|
||||
|
||||
@@ -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) =
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user