Modified handling of zero precision in formatFloat (#6719)

This commit is contained in:
Fabian Keller 2017-11-15 21:23:33 +01:00 • committed by Andreas Rumpf
commit 5e66a7ce59
2 changed files with 16 additions and 9 deletions

View file

@ -74,5 +74,9 @@ This now needs to be written as:
var a = -5 var a = -5
for i in a..b: for i in a..b:
echo i echo i
- ``formatFloat``/``formatBiggestFloat`` now support formatting floats with zero
precision digits. The previous ``precision = 0`` behavior (default formatting)
is now available via ``precision = -1``.
- Removed deprecated romans module from the stdlib and published it as separate - Removed deprecated romans module from the stdlib and published it as separate
Nimble package. Nimble package.

View file

@ -1927,7 +1927,7 @@ type
{.deprecated: [TFloatFormat: FloatFormatMode].} {.deprecated: [TFloatFormat: FloatFormatMode].}
proc formatBiggestFloat*(f: BiggestFloat, format: FloatFormatMode = ffDefault, proc formatBiggestFloat*(f: BiggestFloat, format: FloatFormatMode = ffDefault,
precision: range[0..32] = 16; precision: range[-1..32] = 16;
decimalSep = '.'): string {. decimalSep = '.'): string {.
noSideEffect, rtl, extern: "nsu$1".} = noSideEffect, rtl, extern: "nsu$1".} =
## Converts a floating point value `f` to a string. ## Converts a floating point value `f` to a string.
@ -1939,7 +1939,7 @@ proc formatBiggestFloat*(f: BiggestFloat, format: FloatFormatMode = ffDefault,
## `precision`'s default value is the maximum number of meaningful digits ## `precision`'s default value is the maximum number of meaningful digits
## after the decimal point for Nim's ``biggestFloat`` type. ## after the decimal point for Nim's ``biggestFloat`` type.
## ##
## If ``precision == 0``, it tries to format it nicely. ## If ``precision == -1``, it tries to format it nicely.
when defined(js): when defined(js):
var res: cstring var res: cstring
case format case format
@ -1961,7 +1961,7 @@ proc formatBiggestFloat*(f: BiggestFloat, format: FloatFormatMode = ffDefault,
buf {.noinit.}: array[0..2500, char] buf {.noinit.}: array[0..2500, char]
L: cint L: cint
frmtstr[0] = '%' frmtstr[0] = '%'
if precision > 0: if precision >= 0:
frmtstr[1] = '#' frmtstr[1] = '#'
frmtstr[2] = '.' frmtstr[2] = '.'
frmtstr[3] = '*' frmtstr[3] = '*'
@ -1995,7 +1995,7 @@ proc formatBiggestFloat*(f: BiggestFloat, format: FloatFormatMode = ffDefault,
result.setLen(result.len - 1) result.setLen(result.len - 1)
proc formatFloat*(f: float, format: FloatFormatMode = ffDefault, proc formatFloat*(f: float, format: FloatFormatMode = ffDefault,
precision: range[0..32] = 16; decimalSep = '.'): string {. precision: range[-1..32] = 16; decimalSep = '.'): string {.
noSideEffect, rtl, extern: "nsu$1".} = noSideEffect, rtl, extern: "nsu$1".} =
## Converts a floating point value `f` to a string. ## Converts a floating point value `f` to a string.
## ##
@ -2006,16 +2006,16 @@ proc formatFloat*(f: float, format: FloatFormatMode = ffDefault,
## `precision`'s default value is the maximum number of meaningful digits ## `precision`'s default value is the maximum number of meaningful digits
## after the decimal point for Nim's ``float`` type. ## after the decimal point for Nim's ``float`` type.
## ##
## If ``precision == 0``, it tries to format it nicely. ## If ``precision == -1``, it tries to format it nicely.
## ##
## Examples: ## Examples:
## ##
## .. code-block:: nim ## .. code-block:: nim
## ##
## let x = 123.456 ## let x = 123.456
## echo x.formatFloat() # 123.4560000000000 ## doAssert x.formatFloat() == "123.4560000000000"
## echo x.formatFloat(ffDecimal, 4) # 123.4560 ## doAssert x.formatFloat(ffDecimal, 4) == "123.4560"
## echo x.formatFloat(ffScientific, 2) # 1.23e+02 ## doAssert x.formatFloat(ffScientific, 2) == "1.23e+02"
## ##
result = formatBiggestFloat(f, format, precision, decimalSep) result = formatBiggestFloat(f, format, precision, decimalSep)
@ -2471,11 +2471,14 @@ when isMainModule:
outp = " this is a\nlong text\n--\nmuchlongerthan10chars\nand here\nit goes" outp = " this is a\nlong text\n--\nmuchlongerthan10chars\nand here\nit goes"
doAssert wordWrap(inp, 10, false) == outp doAssert wordWrap(inp, 10, false) == outp
doAssert formatBiggestFloat(1234.567, ffDecimal, -1) == "1234.567000"
doAssert formatBiggestFloat(1234.567, ffDecimal, 0) == "1235."
doAssert formatBiggestFloat(1234.567, ffDecimal, 1) == "1234.6"
doAssert formatBiggestFloat(0.00000000001, ffDecimal, 11) == "0.00000000001" doAssert formatBiggestFloat(0.00000000001, ffDecimal, 11) == "0.00000000001"
doAssert formatBiggestFloat(0.00000000001, ffScientific, 1, ',') in doAssert formatBiggestFloat(0.00000000001, ffScientific, 1, ',') in
["1,0e-11", "1,0e-011"] ["1,0e-11", "1,0e-011"]
# bug #6589 # bug #6589
doAssert formatFloat(123.456, ffScientific, precision=0) in doAssert formatFloat(123.456, ffScientific, precision = -1) in
["1.234560e+02", "1.234560e+002"] ["1.234560e+02", "1.234560e+002"]
doAssert "$# $3 $# $#" % ["a", "b", "c"] == "a c b c" doAssert "$# $3 $# $#" % ["a", "b", "c"] == "a c b c"