diff options
-rw-r--r-- | lib/system.nim | 41 | ||||
-rw-r--r-- | lib/system/sysstr.nim | 6 | ||||
-rw-r--r-- | tests/system/toString.nim | 11 |
3 files changed, 38 insertions, 20 deletions
diff --git a/lib/system.nim b/lib/system.nim index 047b998c3..a54a25f2f 100644 --- a/lib/system.nim +++ b/lib/system.nim @@ -1697,12 +1697,23 @@ proc `$`*[T: tuple|object](x: T): string = ## $(23, 45) == "(23, 45)" ## $() == "()" result = "(" + var firstElement = true for name, value in fieldPairs(x): - if result.len > 1: result.add(", ") + if not(firstElement): result.add(", ") result.add(name) result.add(": ") result.add($value) + firstElement = false result.add(")") + +proc collectionToString[T](x: T, b, e: string): string = + result = b + var firstElement = true + for value in items(x): + if not(firstElement): result.add(", ") + result.add($value) + firstElement = false + result.add(e) proc `$`*[T: set](x: T): string = ## generic ``$`` operator for sets that is lifted from the components @@ -1710,24 +1721,18 @@ proc `$`*[T: set](x: T): string = ## ## .. code-block:: nimrod ## ${23, 45} == "{23, 45}" - result = "{" - for value in items(x): - if result.len > 1: result.add(", ") - result.add($value) - result.add("}") + collectionToString(x, "{", "}") -when false: - proc `$`*[T](a: openArray[T]): string = - ## generic ``$`` operator for open arrays that is lifted from the elements - ## of `a`. Example: - ## - ## .. code-block:: nimrod - ## $[23, 45] == "[23, 45]" - result = "[" - for x in items(a): - if result.len > 1: result.add(", ") - result.add($x) - result.add("]") +proc `$`*[T: seq](x: T): string = + ## generic ``$`` operator for seqs that is lifted from the components + ## of `x`. Example: + ## + ## .. code-block:: nimrod + ## $(@[23, 45]) == "@[23, 45]" + collectionToString(x, "@[", "]") + +proc `$`*[T: array](x: T): string = + collectionToString(x, "[", "]") # ----------------- GC interface --------------------------------------------- diff --git a/lib/system/sysstr.nim b/lib/system/sysstr.nim index 4244bae4c..eb9d2000b 100644 --- a/lib/system/sysstr.nim +++ b/lib/system/sysstr.nim @@ -252,8 +252,10 @@ proc nimIntToStr(x: int): string {.compilerRtl.} = proc nimFloatToStr(x: float): string {.compilerproc.} = var buf: array [0..59, char] - c_sprintf(buf, "%#.16e", x) - return $buf + c_sprintf(buf, "%#.f", x) + result = $buf + if result[len(result)-1] == '.': + result.add("0") proc nimInt64ToStr(x: int64): string {.compilerRtl.} = result = newString(sizeof(x)*4) diff --git a/tests/system/toString.nim b/tests/system/toString.nim new file mode 100644 index 000000000..17dcb3cb4 --- /dev/null +++ b/tests/system/toString.nim @@ -0,0 +1,11 @@ +discard """ + output:'''@[23, 45] +@[, foo, bar] +[, foo, bar] +[23, 45]''' +""" + +echo($(@[23, 45])) +echo($(@["", "foo", "bar"])) +echo($(["", "foo", "bar"])) +echo($([23, 45])) |