Frage

Ich möchte eine Funktion schreiben können, die als String eine Zahl in wissenschaftlicher Notation erhält und spaltet aus den Koeffizienten und den Exponenten als separate Elemente. Ich konnte nur einen regulären Ausdruck verwenden, aber die eingehende Nummer kann nicht normalisiert sein, und ich würde es vorziehen, die Lage sein, zu normalisieren und dann die Teile brechen.

hat ein Kollege Teil über eine Lösung mit VB6 bekommt, aber es ist nicht ganz da, wie das Transkript unten zeigt.

cliVe> a = 1e6
cliVe> ? "coeff: " & o.spt(a) & " exponent: " & o.ept(a)
coeff: 10 exponent: 5 

sollte 1 gewesen und 6

cliVe> a = 1.1e6
cliVe> ? "coeff: " & o.spt(a) & " exponent: " & o.ept(a)
coeff: 1.1 exponent: 6

richtig

cliVe> a = 123345.6e-7
cliVe> ? "coeff: " & o.spt(a) & " exponent: " & o.ept(a)
coeff: 1.233456 exponent: -2

richtig

cliVe> a = -123345.6e-7
cliVe> ? "coeff: " & o.spt(a) & " exponent: " & o.ept(a)
coeff: 1.233456 exponent: -2

sollte -1,233456 und -2

cliVe> a = -123345.6e+7
cliVe> ? "coeff: " & o.spt(a) & " exponent: " & o.ept(a)
coeff: 1.233456 exponent: 12

richtig

Irgendwelche Ideen? By the way, ist Clive ein CLI basiert auf VBScript und finden sich unter meinen Weblog .

War es hilfreich?

Lösung

Google auf "wissenschaftliche Schreibweise regexp" zeigt eine Reihe von Streichhölzer, einschließlich diese ( sie es nicht benutzen !!!! ), die verwendet

*** warning: questionable ***
/[-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?/

, die Fälle wie -.5e7 und + 00000e33 (beide von denen Sie nicht möchten, ermöglichen).

enthält

Stattdessen würde ich sehr empfehlen verwenden Sie die Syntax auf Doug Crockford JSON Webseite , welche Dokumente explizit, was eine Zahl in JSON darstellt. Hier ist die entsprechende Syntaxdiagramm von dieser Seite genommen:


(Quelle: json.org )

Wenn Sie an der Linie sehen 456 seiner json2.js Skript (sichere Konvertierung zu / von JSON in JavaScript), werden Sie diesen Teil eines regexp sehen:

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

, die ironischerweise nicht mit seiner Syntax-Diagramm .... (sieht aus wie ich einen Bug-Datei sollte) ich ein regexp glaube, das Syntaxdiagramm tut implementieren ist diese:

/-?(?:0|[1-9]\d*)(?:\.\d*)?(?:[eE][+\-]?\d+)?/

und wenn Sie eine erste + als auch zulassen wollen, erhalten Sie:

/[+\-]?(?:0|[1-9]\d*)(?:\.\d*)?(?:[eE][+\-]?\d+)?/

In Klammern nach Ihren Wünschen zu erfassen.

Ich würde auch empfehlen Ihnen, eine Reihe von Testfällen Fleisch aus, um sicherzustellen, dass Sie diese Möglichkeiten sind (oder auch nicht enthalten), wie einschließen möchten:

allowed:
+3
3.2e23
-4.70e+9
-.2E-4
-7.6603

not allowed:
+0003   (leading zeros)
37.e88  (dot before the e)

Viel Glück!

Andere Tipps

Bau der höchsten bewerteten Antwort aus, ich modifiziert die Regex leicht /^[+\-]?(?=.)(?:0|[1-9]\d*)?(?:\.\d*)?(?:\d[eE][+\-]?\d+)?$/ werden.

Die Vorteile dieser bietet, sind:

  1. ermöglicht matching numbers wie .9 (I die (?:0|[1-9]\d*) optional mit ? gemacht)
  2. verhindert passende gerade den Bediener am Anfang und verhindert passende Länge Null-Strings (verwendet Look-Ahead, (?=.))
  3. verhindert passende e9, weil es die \d vor der wissenschaftliche Notation
  4. erfordert

Mein Ziel dabei ist, es zu benutzen für signifikante Zahlen erfassen und signifikante Mathematik zu tun. So bin ich auch es werde in Scheiben schneiden mit Gruppen erfassen etwa so:. /^[+\-]?(?=.)(0|[1-9]\d*)?(\.\d*)?(?:(\d)[eE][+\-]?\d+)?$/

Eine Erklärung, wie signifikante Zahlen von diesen zu erhalten:

  1. Die gesamte Aufnahme ist die Nummer, die Sie parseFloat() Hand kann
  2. Spiele 1-3 werden als nicht definiert oder Strings angezeigt, damit sie die Kombination von (undefined der mit '' ersetzen) sollte die Zahl wieder geben, aus denen wesentliche Zahlen extrahiert werden können.

Diese Regex verhindert auch links gepolsterte Nullen passend, die JavaScript akzeptiert manchmal aber was ich habe Ursache Probleme gesehen und die nichts zu signifikanten Zahlen addiert, so sehe ich links gepolsterte Nullen als Vorteil zu verhindern (vor allem in Formen). Aber ich bin sicher, dass der Regex modifiziert werden könnte, links gepolsterten Nullen zu verschlingen.

Ein weiteres Problem, das ich mit diesem regex sehen, ist es 90.e9 oder andere solche Zahlen nicht übereinstimmen. Allerdings finde ich diesen oder ähnliche Begegnungen höchst unwahrscheinlich, wie es die Konvention in die wissenschaftliche Schreibweise ist eine solche Zahlen zu vermeiden. Auch wenn Sie es in JavaScript-Code einzugeben, können Sie genauso gut 9.0e10 eingeben und die gleichen signifikanten Zahlen erreichen.

UPDATE

In meinen Tests, fing ich auch den Fehler, dass es '.' passen könnte. So sollte der Vorgriff modifiziert werden, um (?=\.\d|\d), die zur endgültigen regex führt:

/^[+\-]?(?=\.\d|\d)(?:0|[1-9]\d*)?(?:\.\d*)?(?:\d[eE][+\-]?\d+)?$/

Hier einige Perl-Code, den ich gerade zusammen schnell gehackt.

my($sign,$coeffl,$coeffr,$exp) = $str =~ /^\s*([-+])?(\d+)(\.\d*)?e([-+]?\d+)\s*$/;

my $shift = length $coeffl;
$shift = 0 if $shift == 1;

my $coeff =
  substr( $coeffl, 0, 1 );

if( $shift || $coeffr ){
  $coeff .=
    '.'.
    substr( $coeffl, 1 );
}

$coeff .= substr( $coeffr, 1 ) if $coeffr;

$coeff = $sign . $coeff if $sign;

$exp += $shift;

say "coeff: $coeff exponent: $exp";
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top