Quick actions

cmd+k|ctrl+k

Navigation

Languages

Untitled

Snippet info

Language

Raku

Visibility

unlisted

Author

legacy-anonymous

Created

2025-09-10T22:31:11.088646Z

Updated

2025-09-10T22:31:11.088646Z

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;
INFO