Math-Ryu

 view release on metacpan or  search on metacpan

Ryu.pm  view on Meta::CPAN

    my @parts = split /E/i, $s;
    if($parts[1] > 0 && $parts[1] < MAX_DEC_DIG) {
      # We want, eg,  a value like 1.1E-3 to be returned as "0.0011".
      my $zero_pad = $parts[1] - (length($parts[0]) - 2);
      if($zero_pad >= 0 && ($zero_pad + length($parts[0])) < MAX_DEC_DIG + 1 ) {
        substr($parts[0], 1, 1, '');
        return $sign . $parts[0] . ('0' x $zero_pad) . '.0';
      }
      elsif($zero_pad < 0) {
        # We want, eg,  a value like 1.23625E2 to be returned as "123.625".
        # relocate the decimal point
        substr($parts[0], 1, 1, '');
        substr($parts[0], $zero_pad, 0, '.');
        return $sign . $parts[0];
      }
    }

    # Return as is, except that we replace the 'E' with 'e', ensuring also
    # that the exponent is preceded by a '+' or '-' sign, and that
    # negative exponents consist of at least 2 digits.
    $s =~ s/e/e\+/i if $parts[1] > 0;

Ryu.xs  view on Meta::CPAN

        man_str[i + is_neg + 1] = '\0';

        outsv = newSVpv(man_str, 0);
        Safefree(man_str);
        Safefree(exp_str);
        if(is_neg) s--;
        return outsv;
      }
      else if(zero_pad < 0) {
        /* We want, eg,  1.23625E2 to be returned as "123.625". *
         * This involves relocation of the decimal point.       */
        len = strlen(s);
        zero_pad--;
        if(is_neg) man_str[0] = '-';
        man_str[0 + is_neg] = s[0];
        man_str[1 + is_neg] = s[2]; /* s[1] is the decimal point */
        dec = 1; /* set to 0 when the decimal point is encountered */
        for(i = 2; i < len; i++) {
           if(i == zero_pad + len) {
             man_str[i + is_neg] = '.';
             dec--;



( run in 0.641 second using v1.01-cache-2.11-cpan-5511b514fd6 )