lib/strings: allow toInt to parse zero-padded strings

This commit is contained in:
Jacob Abel 2022-05-21 22:34:11 -04:00
parent 86ad681303
commit febff1dccd
No known key found for this signature in database
GPG key ID: C41690827135AD22
2 changed files with 44 additions and 4 deletions

View file

@ -792,15 +792,27 @@ rec {
=> 1337
toInt "-4"
=> -4
toInt " 123 "
=> 123
toInt "00024"
=> 24
toInt "3.14"
=> error: floating point JSON numbers are not supported
*/
# Obviously, it is a bit hacky to use fromJSON this way.
toInt = str:
let may_be_int = fromJSON str; in
if isInt may_be_int
then may_be_int
else throw "Could not convert ${str} to int.";
let
strippedInput = match "[[:space:]]*(0*)(.*)" str;
isNonZeroEmpty = match "[[:space:]]*" (lib.last strippedInput) == [];
isZeroNonEmpty = head strippedInput != "";
mayBeInt = fromJSON (lib.last strippedInput);
in
if isNonZeroEmpty && isZeroNonEmpty
then 0
else
if isInt mayBeInt
then mayBeInt
else throw "Could not convert ${str} to int.";
/* Read a list of paths from `file`, relative to the `rootPath`.
Lines beginning with `#` are treated as comments and ignored.

View file

@ -327,6 +327,34 @@ runTests {
expected = "Hello\\x20World";
};
testToInt = testAllTrue [
# Naive
(123 == toInt "123")
(0 == toInt "0")
# Whitespace Padding
(123 == toInt " 123")
(123 == toInt "123 ")
(123 == toInt " 123 ")
(123 == toInt " 123 ")
(0 == toInt " 0")
(0 == toInt "0 ")
(0 == toInt " 0 ")
# Zero Padding
(123 == toInt "0123")
(123 == toInt "0000123")
(0 == toInt "000000")
# Whitespace and Zero Padding
(123 == toInt " 0123")
(123 == toInt "0123 ")
(123 == toInt " 0123 ")
(123 == toInt " 0000123")
(123 == toInt "0000123 ")
(123 == toInt " 0000123 ")
(0 == toInt " 000000")
(0 == toInt "000000 ")
(0 == toInt " 000000 ")
];
# LISTS
testFilter = {