2016-04-27 6 views
-1

Ich kann nicht für das Leben von mir herauszufinden, warum das nicht funktioniert.Javascript: str.indexOf arbeitet nicht mit £ Symbol

Der Benutzer gibt eine Zeichenfolge ein, die ich in Pennies umwandele (1 Pfund = 100 Pennies). Wenn die Zeichenfolge das £ -Symbol als erstes Zeichen enthält, weiß ich, dass es für die Konvertierung mit 100 multipliziert wird.

Mein Problem ist, dass ich eine if-Anweisung verwende, um zu sehen, ob das erste Zeichen £ ist. Ich benutze indexOf(), aber es fängt nicht das Zeichen £. Ich habe sogar console.log(userInput.indexOf("£")); verwendet, um zu sehen, was zurückgegeben wird, und es protokolliert 0. Soweit ich das beurteilen kann, funktioniert das nur in der if-Anweisung nicht.

Hier ist mein Code:

HTML

<html ng-app="main"> 
<head> 
    <meta charset="ISO-8859-1"> 
    <title></title> 
    <script src ="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.4.5/angular.min.js" type="text/javascript"></script> 

    <link rel="stylesheet" type="text/css" href="main.css"> 
</head> 
<body ng-controller="mainController"> 
     <input type="submit" ng-click="trim()"> 
    <script type="text/javascript" src="main.js"></script> 
</body> 
</html> 

Angular

$scope.trim = function(){ 
    var userInput = "£1234"; 

    if(userInput.indexOf("£") == 0){ 
     userInput = userInput.substr(1); 
     userInput *= 100; 

    } 

} 

I £123 für 01 verwendet haben, und wenn ich es eingebe, wird you have entered an invalid character angezeigt. Alle Hilfe wird geschätzt.

+0

'console.log (userInput.indexOf ("£"))' wird –

+1

helfen Sie überprüfen, ob '£' das ist * erste * Charakter. Was ist, wenn davor Whitespaces stehen? –

+2

Sie müssen die obigen Codebausteine ​​in ein [mcve] umwandeln (was einfach mit der '<>' - Symbolleistenschaltfläche und dem Hinzufügen notwendiger Bibliotheken usw. durchgeführt werden kann). Bottom line: Wenn in der Zeichenkette ein £ steht, findet 'indexOf' ** es. –

Antwort

1

Es ist nicht Ihre userInput.indexOf("£") == 0, die nicht funktioniert hat. Es ist aufgrund Ihrer Linie

userInput = userInput.substr(1); 

Es sollte sein, dass der Editor die Datei als UTF-8 gespeichert, und die HTML-Seite Zeichencodierung sagt es ISO-8859-1 ist. Jetzt "£".length ist 2 und Ihre userInput.substr(1) funktioniert nicht. Es muss in diesem Fall userInput.substr(2) sein, aber ich denke, es ist besser, die Dateicodierung mit der <meta charset="..."> übereinstimmen.

Sie können die Kodierung Ihrer Datei in ISO-8859-1 ändern, und das würde funktionieren. (In Emacs, mit C-x Return f, und wählen Sie iso-8859-1 und speichern Sie die Datei erneut).

Oder geben Sie einfach <meta charset="utf-8">, um mit der Codierung Ihrer Datei übereinstimmen, und userInput.substr(1) würde wie erwartet funktionieren.

Probe: https://jsfiddle.net/g91wvsp6/1/

Diese Beispielseite wird <meta charset="utf-8"> mit und wird mit dem erwarteten Ergebnis arbeiten.

+0

Es * könnte * ein Zeichensatz-Problem sein, aber blind hinzuzufügen '' ist nicht die Lösung. Die korrekte Behandlung von Zeichensätzen (sowohl das Skript als auch das HTML, alle verwendeten Backends usw.) wäre eine Lösung. –

+0

@ T.J.Crowder ist es nicht "blind hinzufügen' '" –

+0

Ja, ** jetzt ** die Antwort sagt eigentlich etwas mehr. Es war nicht als ich den Kommentar oben gepostet habe. –

0

(Diese Community Wiki Antwort von 太極者無極而生's answer inspiriert, aber schien zu groß ein Edit zu dieser Antwort zu machen.)

Es klingt wie eine Codierung Mismatch Problem. Wenn Ihre JavaScript-Datei mit einem Zeichensatz codiert ist (z. B. ISO-8859-1, den einige Windows-Tools "ANSI" nennen), aber Ihr Server es mit einem anderen Zeichensatz (z. B. UTF-8) bereitstellt, das Zeichen £ in Ihrer Datei wird nicht korrekt erkannt. Wenn die Datei ISO-8859-1 als UTF-8 verwendet wird, ist £ ein ungültiges Zeichen. Wenn die Datei UTF-8 als ISO-8859-1 geliefert wird, wird es zwei Zeichen sein. In jedem Fall stimmt es nicht mit dem £ Eingang des Benutzers überein.

es korrigieren:

  1. Stellen Sie sicher, Sie wissen, was sie JavaScript kodiert (und HTML, CSS, etc.) Datei tatsächlich in gespeichert wird Ihr Text-Editor, dass Funktionen um zu tun haben sollte.. Wenn Ihre Seite hauptsächlich in einem westlichen Text wie Englisch ist, empfehle ich UTF-8.

  2. Stellen Sie sicher, dass Sie die gleiche Codierung für Ihre HTML- und JavaScript-Dateien verwenden. Ich bin mir sicher, dass es möglich ist, verschiedene Kodierungen für sie zu verwenden, aber es wird ein Schmerz sein. Halten Sie das Leben einfach und verwenden Sie die gleiche Codierung.

  3. Stellen Sie sicher, dass Ihr Server korrekt die charset ist die Identifizierung, wenn diese Ressourcen, zum Beispiel dient, wenn die Content-Type Antwort-Header zu senden, sollte es Content-Type: application/javascript; charset=UTF-8 für eine UTF-8 JavaScript-Datei (nicht nur Content-Type: application/javascript) sein.