sub numstr-to-fatrat(Str $str --> FatRat) {
# Match the pattern: optional sign, digits, optional decimal part, exponent
if $str ~~ /^ (<[+-]>?) (\d+) [\. (\d+)]? [<[eE]> (<[+-]>?) (\d+) ]? $/ {
my $sign = $0.Str eq '-' ?? -1 !! 1;
my $integer-part = $1.Str;
my $fractional-part = $2.Str // '';
my $exp-sign = $3.Str // '+';
my $exp-value = $4.Str // '0';
# Combine integer and fractional parts into a single integer
my $mantissa = $integer-part ~ $fractional-part;
my $exponent = $exp-value.Int * ($exp-sign eq '-' ?? -1 !! 1);
$exponent -= $fractional-part.chars;
# Construct FatRat
my $numerator = $sign * $mantissa.Int;
my $denominator = 10 ** -$exponent;
return $exponent >= 0 ?? FatRat.new($numerator * 10 ** $exponent) !! FatRat.new($numerator, $denominator);
}
else {
die "Invalid number format: $str";
}
}
# Example usage:
my $numstr = "1.6605402e-27";
my $fatrat = numstr-to-fatrat($numstr);
say $fatrat.nude;