Apa v0.5.0 ApaNumber View Source

APA : Arbitrary Precision Arithmetic - Number String helper - ApaNumber.

Parser to handle number string inputs convert any number string to a tuple of 2 integers: {integer_value, exp}

Maybe better to make parse private and force to use from_string/1 - because of possible inifinite loop

Link to this section Summary

Functions

Adds a minus sign to a number string if necessary. Could be done by converting to integer and multiply with -1 and reconvert to string. But this works nice and elegant with strings and pattern matching too.

Parses a binary (number string) into an ApaNumber tuple.

Shifts an ApaNumber to another decimal point to work with the intended integer calculation of two numbers with the same decimal point this operation do not change the mathematical value: ApaNumber.to_string({2, -1}) == "0.2" ~math-equal~ ApaNumber.to_string({20, -2}) == "0.20" and always shift_decimal_point > exp because fillup with zeros reduce non existing zeros is not possible and not necessary to implement returns the shifted ApaNumber tupel or if not possible to shift the input tupel

Creates a string from an ApaNumber tuple.

Link to this section Functions

Link to this function

add_minus_sign(number_string)

View Source
add_minus_sign(binary()) :: binary()

Adds a minus sign to a number string if necessary. Could be done by converting to integer and multiply with -1 and reconvert to string. But this works nice and elegant with strings and pattern matching too.

Examples

iex> ApaNumber.add_minus_sign("3") "-3"

iex> ApaNumber.add_minus_sign("+3") "-3"

iex> ApaNumber.add_minus_sign("-3") "3"

iex> ApaNumber.add_minus_sign("-0003.0003e-002") "0003.0003e-002"

Link to this function

from_string(binary)

View Source
from_string(binary()) :: {integer(), integer()} | :error

Parses a binary (number string) into an ApaNumber tuple.

It works with signs, leading and trailing zeros and additional chars will be ignored. If successful, returns a tuple in the form of {integer_value, exponent}:

ApaNumber.from_string("+0003.00e+00000 Dollar") {3, 0}

When the binary cannot be parsed, the atom :error will be returned.

The limit only depends on the internal integers - because of Elixir "unlimited" integers I would say "arbitrary".

Used elixir source from Float module for parsing - nice source of inspiration! Thank you José!

Examples

iex> ApaNumber.from_string("0003") {3, 0}

iex> ApaNumber.from_string("+0003") {3, 0}

iex> ApaNumber.from_string("-0003") {-3, 0}

iex> ApaNumber.from_string("-0000120.1200") {-12012, -2}

iex> ApaNumber.from_string("-0000120.1200") {-12012, -2}

iex> ApaNumber.from_string("-03 Euro") {-3, 0}

iex> ApaNumber.from_string("-0003e-2") {-3, -2}

iex> ApaNumber.from_string("-3e-0002") {-3, -2}

iex> ApaNumber.from_string("3e-12") {3, -12}

iex> ApaNumber.from_string("+0003e+12") {3000000000000, 0}

iex> ApaNumber.from_string("+0003e+00000") {3, 0}

iex> ApaNumber.from_string("+0003.00e+00000 Dollar") {3, 0}

Link to this function

shift_to(arg, shift_decimal_point)

View Source
shift_to({integer(), integer()}, integer()) :: {integer(), integer()}

Shifts an ApaNumber to another decimal point to work with the intended integer calculation of two numbers with the same decimal point this operation do not change the mathematical value: ApaNumber.to_string({2, -1}) == "0.2" ~math-equal~ ApaNumber.to_string({20, -2}) == "0.20" and always shift_decimal_point > exp because fillup with zeros reduce non existing zeros is not possible and not necessary to implement returns the shifted ApaNumber tupel or if not possible to shift the input tupel

Examples

iex> ApaNumber.shift_to({2, -1}, -2) {20, -2}

iex> ApaNumber.shift_to({2, -1}, -4) {2000, -4}

iex> ApaNumber.shift_to({2000, -1}, 0) {200, 0}

iex> ApaNumber.shift_to({2000, -4}, -1) {2, -1}

iex> ApaNumber.shift_to({20, -1}, 0) {2, 0}

Link to this function

to_string(number_tuple, precision \\ -1, scale \\ -1)

View Source
to_string({integer(), integer()}, integer(), integer()) :: binary() | :error

Creates a string from an ApaNumber tuple.

Examples

iex> ApaNumber.to_string({3, 0}) "3"

iex> ApaNumber.to_string({-3, 0}) "-3"

iex> ApaNumber.to_string({3, 3}) "3000"

iex> ApaNumber.to_string({-12012, -2}) "-120.12"

iex> ApaNumber.to_string({-3997, -6}) "-0.003997"