mirror of
https://github.com/nim-lang/Nim.git
synced 2026-02-15 07:43:26 +00:00
Fix strformat precision handling for strings (#7941)
* fix strformat precision handling for strings * add some limited unicode awareness to the precision handling for strings * improvement suggested by Varriount: use setLen and runeOffset instead of runeSubstr
This commit is contained in:
@@ -558,12 +558,16 @@ proc format*(value: string; specifier: string; res: var string) =
|
||||
## sense to call this directly, but it is required to exist
|
||||
## by the ``&`` macro.
|
||||
let spec = parseStandardFormatSpecifier(specifier)
|
||||
var value = value
|
||||
case spec.typ
|
||||
of 's', '\0': discard
|
||||
else:
|
||||
raise newException(ValueError,
|
||||
"invalid type in format string for string, expected 's', but got " &
|
||||
spec.typ)
|
||||
if spec.precision != -1:
|
||||
if spec.precision < runelen(value):
|
||||
setLen(value, runeOffset(value, spec.precision))
|
||||
res.add alignString(value, spec.minimumWidth, spec.align, spec.fill)
|
||||
|
||||
when isMainModule:
|
||||
|
||||
@@ -12,6 +12,32 @@ var o: Obj
|
||||
doAssert fmt"{o}" == "foobar"
|
||||
doAssert fmt"{o:10}" == "foobar "
|
||||
|
||||
# see issue #7933
|
||||
var str = "abc"
|
||||
doAssert fmt">7.1 :: {str:>7.1}" == ">7.1 :: a"
|
||||
doAssert fmt">7.2 :: {str:>7.2}" == ">7.2 :: ab"
|
||||
doAssert fmt">7.3 :: {str:>7.3}" == ">7.3 :: abc"
|
||||
doAssert fmt">7.9 :: {str:>7.9}" == ">7.9 :: abc"
|
||||
doAssert fmt">7.0 :: {str:>7.0}" == ">7.0 :: "
|
||||
doAssert fmt" 7.1 :: {str:7.1}" == " 7.1 :: a "
|
||||
doAssert fmt" 7.2 :: {str:7.2}" == " 7.2 :: ab "
|
||||
doAssert fmt" 7.3 :: {str:7.3}" == " 7.3 :: abc "
|
||||
doAssert fmt" 7.9 :: {str:7.9}" == " 7.9 :: abc "
|
||||
doAssert fmt" 7.0 :: {str:7.0}" == " 7.0 :: "
|
||||
doAssert fmt"^7.1 :: {str:^7.1}" == "^7.1 :: a "
|
||||
doAssert fmt"^7.2 :: {str:^7.2}" == "^7.2 :: ab "
|
||||
doAssert fmt"^7.3 :: {str:^7.3}" == "^7.3 :: abc "
|
||||
doAssert fmt"^7.9 :: {str:^7.9}" == "^7.9 :: abc "
|
||||
doAssert fmt"^7.0 :: {str:^7.0}" == "^7.0 :: "
|
||||
str = "äöüe\u0309\u0319o\u0307\u0359"
|
||||
doAssert fmt"^7.1 :: {str:^7.1}" == "^7.1 :: ä "
|
||||
doAssert fmt"^7.2 :: {str:^7.2}" == "^7.2 :: äö "
|
||||
doAssert fmt"^7.3 :: {str:^7.3}" == "^7.3 :: äöü "
|
||||
doAssert fmt"^7.0 :: {str:^7.0}" == "^7.0 :: "
|
||||
# this is actually wrong, but the unicode module has no support for graphemes
|
||||
doAssert fmt"^7.4 :: {str:^7.4}" == "^7.4 :: äöüe "
|
||||
doAssert fmt"^7.9 :: {str:^7.9}" == "^7.9 :: äöüe\u0309\u0319o\u0307\u0359"
|
||||
|
||||
# see issue #7932
|
||||
doAssert fmt"{15:08}" == "00000015" # int, works
|
||||
doAssert fmt"{1.5:08}" == "000001.5" # float, works
|
||||
|
||||
Reference in New Issue
Block a user