From e2b149190584e53c662d09aeee9390908bbb250f Mon Sep 17 00:00:00 2001 From: Bung Date: Tue, 28 Jul 2020 17:47:22 +0800 Subject: [PATCH] Fix #11352 strutil.insertSep() fails on negative numbers (#15087) * fix #11352 strutil.insertSep handle negtive number * test for #11352 * optimize * not parts string var * Update lib/pure/strutils.nim Thanks! Co-authored-by: alaviss * need to be countdown Co-authored-by: alaviss --- lib/pure/strutils.nim | 23 +++++++++++++++++------ tests/modules/tstrutils_insert_sep.nim | 13 +++++++++++++ 2 files changed, 30 insertions(+), 6 deletions(-) create mode 100644 tests/modules/tstrutils_insert_sep.nim diff --git a/lib/pure/strutils.nim b/lib/pure/strutils.nim index 32d6ede1e1..a0a172430a 100644 --- a/lib/pure/strutils.nim +++ b/lib/pure/strutils.nim @@ -2264,17 +2264,28 @@ proc insertSep*(s: string, sep = '_', digits = 3): string {.noSideEffect, ## if `s` contains a number. runnableExamples: doAssert insertSep("1000000") == "1_000_000" - - var L = (s.len-1) div digits + s.len - result = newString(L) + result = newStringOfCap(s.len) + let hasPrefix = isDigit(s[s.low]) == false + var idx:int + if hasPrefix: + result.add s[s.low] + for i in (s.low + 1)..s.high: + idx = i + if not isDigit(s[i]): + result.add s[i] + else: + break + let partsLen = s.len - idx + var L = (partsLen-1) div digits + partsLen + result.setLen(L + idx) var j = 0 dec(L) - for i in countdown(len(s)-1, 0): + for i in countdown(partsLen-1,0): if j == digits: - result[L] = sep + result[L + idx] = sep dec(L) j = 0 - result[L] = s[i] + result[L + idx] = s[i + idx] inc(j) dec(L) diff --git a/tests/modules/tstrutils_insert_sep.nim b/tests/modules/tstrutils_insert_sep.nim new file mode 100644 index 0000000000..775fe7da10 --- /dev/null +++ b/tests/modules/tstrutils_insert_sep.nim @@ -0,0 +1,13 @@ +discard """ + output: ''' +-100 +-100,000 +100,000 +''' +""" +# test https://github.com/nim-lang/Nim/issues/11352 + +import strutils +echo insertSep($(-100), ',') +echo insertSep($(-100_000), ',') +echo insertSep($(100_000), ',') \ No newline at end of file