Question

Je dois obtenir la valeur d'un très grand nombre en JavaScript sous forme non exponentielle. Number.toFixed il retourne simplement sous forme exponentielle comme une chaîne, ce qui est pire que ce que j'avais.

Voici ce que revient Number.toFixed:

>>> x = 1e+31
1e+31
>>> x.toFixed()
"1e+31"

Number.toPrecision ne pas non plus le travail:

>>> x = 1e+31
1e+31
>>> x.toPrecision( 21 )
"9.99999999999999963590e+30"

Ce que je voudrais est:

>>> x = 1e+31
1e+31
>>> x.toNotExponential()
"10000000000000000000000000000000"

Je pourrais écrire mon propre analyseur mais je préfère utiliser une méthode de JS native si l'on existe.

Était-ce utile?

La solution

La réponse est qu'il n'y a pas une telle fonction intégrée. J'ai cherché haut et bas. Voici l'utilisation RegExp I de diviser le nombre en signe, coefficient (chiffres avant le point décimal), partie décimale (chiffres après le point décimal) et exposant:

/^([+-])?(\d+)\.?(\d*)[eE]([+-]?\d+)$/

« Réaliser votre propre » est la réponse, que vous l'avez déjà fait.

Autres conseils

Vous pouvez utiliser toPrecision avec un paramètre indiquant le nombre de chiffres que vous souhaitez afficher:

x.toPrecision(31)

Cependant, parmi les navigateurs que j'ai testé, le code ci-dessus ne fonctionne que sur Firefox. Conformément à la spécification ECMAScript, la plage valide pour toPrecision est de 1 à 21, et les deux IE et Chrome jeter un RangeError en conséquence. Cela est dû au fait que la représentation en virgule flottante utilisé en JavaScript est incapable de réellement représenter les nombres à 31 chiffres de précision.

Utiliser le numéro (string)

Exemple: var a=Number("1.1e+2"); donne a = 110

Il est possible d'augmenter la production exponentielle de JavaScript à l'aide des fonctions de chaîne. Il est vrai que ce que je suis venu quelque peu cryptique, mais il ne fonctionne que si l'exposant après la e est positif:

var originalNumber = 1e+31;
var splitNumber = originalNumber.toString().split('e');

var result;
if(splitNumber[1]) {
    var regexMatch = splitNumber[0].match(/^([^.]+)\.?(.*)$/);
    result =
        /* integer part */ regexMatch[1] +
        /* fractional part */ regexMatch[2] +
        /* trailing zeros */ Array(splitNumber[1] - regexMatch[2].length + 1).join('0');
} else result = splitNumber[0];

"10000000000000000000000000000000"?

Difficile à croire que tout le monde serait plutôt regarder ce que 1.0E + 31,

ou en html: 10 31 . Mais voici une façon, une grande partie est pour les exposants de négatifs (fractions):

function longnumberstring(n){
    var str, str2= '', data= n.toExponential().replace('.','').split(/e/i);
    str= data[0], mag= Number(data[1]);
    if(mag>=0 && str.length> mag){
        mag+=1;
        return str.substring(0, mag)+'.'+str.substring(mag);            
    }
    if(mag<0){
        while(++mag) str2+= '0';
        return '0.'+str2+str;
    }
    mag= (mag-str.length)+1;
    while(mag> str2.length){
        str2+= '0';
    }
    return str+str2;
}



input: 1e+30
longnumberstring: 1000000000000000000000000000000
to Number: 1e+30
input: 1.456789123456e-30
longnumberstring: 0.000000000000000000000000000001456789123456
to Number: 1.456789123456e-30
input: 1.456789123456e+30
longnumberstring: 1456789123456000000000000000000
to Number: 1.456789123456e+30
input: 1e+80 longnumberstring: 100000000000000000000000000000000000000000000000000000000000000000000000000000000
to Number: 1e+80
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top