Source code for sigmaepsilon.core.formatting
# -*- coding: utf-8 -*-
from typing import Optional, Union, Iterable
from types import ModuleType
from .typing import issequence
from .thirdparty import import_package
__all__ = ["float_to_str_sig", "floatformatter"]
[docs]def float_to_str_sig(
value: Union[float, Iterable[float]],
*,
sig: Optional[int] = 6,
atol: Optional[float] = 1e-7
) -> Union[str, Iterable[str]]:
"""
Returns a string representation of a floating point number, with
given significant digits.
Parameters
----------
value: Union[float, Iterable[float]]
A single value, or an iterable.
sig: int, Optional
Number of significant digits. Default is 6.
atol: float, Optional
Floating point tolerance. Values smaller than this
in the absolute sense are treated as zero. Default is 1e-7.
Returns
-------
Union[str, Iterable[str]]
String representation of the provided input.
See also
--------
:func:`~sigmaepsilon.core.formatting.floatformatter`
Example
--------
Print the value of pi as a string with 4 significant digits:
>>> from sigmaepsilon.core.formatting import float_to_str_sig
>>> import math
>>> float_to_str_sig(math.pi, sig=4)
'3.142'
"""
if not issequence(value):
if atol is not None:
if abs(value) < atol:
value = 0.0
return floatformatter(sig=sig).format(value)
else:
np: Optional[ModuleType] = import_package("numpy")
if not np:
raise ImportError("You need numpy for this.")
value = np.array(value)
if atol is not None:
inds = np.where(np.abs(value) < atol)[0]
value[inds] = 0.0
formatter = floatformatter(sig=sig)
def f(v):
return formatter.format(v)
return list(map(f, value))